From owner-cvs-all Tue Nov 14 20:56: 3 2000 Delivered-To: cvs-all@freebsd.org Received: from server.baldwin.cx (server.geekhouse.net [64.81.6.52]) by hub.freebsd.org (Postfix) with ESMTP id 1FD9237B4C5; Tue, 14 Nov 2000 20:55:49 -0800 (PST) Received: from john.baldwin.cx (root@john.baldwin.cx [192.168.1.18]) by server.baldwin.cx (8.9.3/8.9.3) with ESMTP id UAA32559; Tue, 14 Nov 2000 20:55:46 -0800 (PST) (envelope-from john@baldwin.cx) Received: (from john@localhost) by john.baldwin.cx (8.9.3/8.9.3) id UAA12866; Tue, 14 Nov 2000 20:55:38 -0800 (PST) (envelope-from john) Message-Id: <200011150455.UAA12866@john.baldwin.cx> X-IMAP-Num: 1 X-Mailer: XFMail 1.4.0 on FreeBSD X-Priority: 3 (Normal) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit MIME-Version: 1.0 In-Reply-To: <200011150325.eAF3PRF01212@mass.osd.bsdi.com> Date: Tue, 14 Nov 2000 20:55:38 -0800 (PST) From: John Baldwin To: Mike Smith Subject: Re: cvs commit: src/sys/sys eventhandler.h Cc: cvs-all@FreeBSD.org, cvs-committers@FreeBSD.org Sender: owner-cvs-all@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG 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 -- 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