Date: Tue, 14 Nov 2000 20:55:38 -0800 (PST) From: John Baldwin <jhb@FreeBSD.org> To: Mike Smith <msmith@FreeBSD.org> Cc: cvs-all@FreeBSD.org, cvs-committers@FreeBSD.org Subject: Re: cvs commit: src/sys/sys eventhandler.h Message-ID: <200011150455.UAA12866@john.baldwin.cx> In-Reply-To: <200011150325.eAF3PRF01212@mass.osd.bsdi.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On 15-Nov-00 Mike Smith wrote: >> jhb 2000/11/14 10:23:00 PST >> >> Modified files: >> sys/sys eventhandler.h >> Log: >> Only hold the mutex for an eventhandler list while the list is being >> accessed. >> Specifically, don't hold the lock while calling event handlers as a >> handler >> may tsleep() while holding the mutex. > > This is wrong and should be backed out; the tsleep() in the handler is > the bug. You can't release the lock on the list while you're traversing > it, since the traversal is holding private state which has to remain > consistent with the list. > > If you want to release the lock on the list, you would have to detect > when the list is changed and rescan it to find the 'new' current > location. Only that doesn't work either, since the list traversal allows > you to remove the current handler from the list. > > Please revert this change and fix eventhandler clients so that they don't > sleep. Hrm, I guess I could go hard-code all the shutdown events to not use tsleep but to use delay()'s. This means hacking up or duplicating things like suspend_kproc(). :(. You shouldn't be holding a lock while you are calling functions that aren't related to the resource you are holding. Grrr. Would it be feasible to say that an eventhandler may not modify a list it is on? Perhaps extending the eventhandler interface to allow for once-only events would be sufficient. -- John Baldwin <jhb@FreeBSD.org> -- http://www.FreeBSD.org/~jhb/ PGP Key: http://www.baldwin.cx/~john/pgpkey.asc "Power Users Use the Power to Serve!" - http://www.FreeBSD.org/ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200011150455.UAA12866>