Date: Wed, 27 Apr 2011 13:34:07 -0400 From: John Baldwin <jhb@freebsd.org> To: Bartosz Fabianowski <freebsd@chillt.de> Cc: Kostik Belousov <kostikbel@gmail.com>, freebsd-hackers@freebsd.org, Hans Petter Selasky <hselasky@c2i.net> Subject: Re: Is there some implicit locking of device methods? Message-ID: <201104271334.07170.jhb@freebsd.org> In-Reply-To: <4DB818A3.1020104@chillt.de> References: <4DB695DB.1080505@chillt.de> <201104271019.31844.jhb@freebsd.org> <4DB818A3.1020104@chillt.de>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday, April 27, 2011 9:22:43 am Bartosz Fabianowski wrote: > > Err, if you use cdevpriv you shouldn't even have a d_close method. All your > > d_close logic should be in the cdevpriv destructor > > I see. There is no documentation for any of this, so I just implemented > it in the way I *thought* it should work: > > .d_close = drv_close, > > int drv_close(...) { > devfs_clear_cdevpriv(); > } > > static void cdevpriv_dtr(void *data) { > free(data, M_USBDEV); > } > > If I understand you correctly, I can leave out the drv_close() method. > When close() is called, devfs_clear_cdevpriv() will be executed > implcitly for me and my dstructor will run - right? Yes, if you only care about cleaning up per-fd data. If you have some sort of state that needs to get created on first open and then removed on last close, you may still want to use a d_close() method, but there are actually edge cases where that can still not be called. So, for that sort of data I would still depend on the cdevpriv destructor and use a reference count between open() and the destructor to know when to cleanup shared state. -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201104271334.07170.jhb>