Date: Fri, 6 Jul 2001 10:14:16 +1000 (EST) From: Darren Reed <darrenr@reed.wattle.id.au> To: bright@sneakerz.org (Alfred Perlstein) Cc: gibbs@scsiguy.com, jhb@FreeBSD.org, jake@FreeBSD.org, cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org, dillon@earth.backplane.com, mjacob@feral.com, dfr@nlsystems.com Subject: Re: cvs commit: src/sys/sys systm.h condvar.h src/sys/kern kern_ Message-ID: <200107060014.KAA16514@avalon.reed.wattle.id.au> In-Reply-To: <20010705174135.A79818@sneakerz.org> from Alfred Perlstein at "Jul 5, 1 05:41:35 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
> * Justin T. Gibbs <gibbs@scsiguy.com> [010705 17:28] wrote: > > >It happens with SMP, too, not just preemption. The calls are an optimization > > >to avoid problems with releasing the lock after the wakeup. The contention > > >can be avoided if we release the lock before calling wakeup(), but doing that > > >leaves a window open for another CPU to alter the data that the lock protects > > >possibly invalidating the wakeup that then gets sent. > > > > This window exists anyway. The locked mutex it not passed to the woken > > up thread, so there will always be a race between the woken up thread > > acquiring the mutex and some other thread on some other CPU acquiring it > > first and making the wakeup invalid. I would have thought that this paragraph made the solution to the problem obvious - pass a mutex someone along the way. Or you use an interface like solaris has: #include <sys/ksynch.h> void cv_init(kcondvar_t *cvp, char *name, kcv_type_t type, void *arg); voidcv_destroy(kcondvar_t *cvp); void cv_wait(kcondvar_t *cvp, kmutex_t *mp); void cv_signal(kcondvar_t *cvp); void cv_broadcast(kcondvar_t *cvp); int cv_wait_sig(kcondvar_t *cvp, kmutex_t *mp); clock_t cv_timedwait(kcondvar_t *cvp, kmutex_t *mp, clock_t timeout); clock_t cv_timedwait_sig(kcondvar_t *cvp, kmutex_t *mp, clock_t timeout); The important thing to look for here is a mutex is passed to cv_*wait*(). Obviously the same one should be passed by all callers waiting on a particular signal. Darren 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?200107060014.KAA16514>