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