cvs commit: src/sys/dev/md md.c

John Baldwin jhb at FreeBSD.org
Fri Sep 17 19:36:07 PDT 2004


On Thursday 16 September 2004 10:22 pm, Nate Lawson wrote:
> John Baldwin wrote:
> > On Thursday 16 September 2004 08:59 pm, M. Warner Losh wrote:
> >>In message: <414A109E.4080601 at samsco.org>
> >>
> >>            Scott Long <scottl at samsco.org> writes:
> >>: Or just use a semaphore.
> >>
> >>Or a condition variable.
> >
> > That doesn't help, a condition variable doesn't have state like a
> > semaphore. The correct fix is to do this:
> >
> > thread A
> > ----------
> > 	mtx_lock();
> > 	adjust_state();
> > 	mtx_unlock();
> > 	wakeup();
> >
> > thread B
> > ---------
> > 	mtx_lock();
> > 	while (state_still_needs_sleep())
> > 		msleep(...)
> > 	mtx_unlock()
> >
> > Proving that there is no race is left as an exercise to the reader. :)
>
> Isn't this exactly what I said?

You use if instead of while.  Truly pedantic coding would use while 
instead. :)  I'm not aware of any bugs in our current wakeup or condition 
variable implementations that would lead to spurious wakeups, but you never 
know (esp. with wakeup where the same thing gets slept on for 47 different 
reasons, e.g. the proc pointer) when you might get a wakeup that's really not 
for you.  Best to make sure that if you do you don't break.

-- 
John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org


More information about the cvs-src mailing list