Berkeley DB infinite sleep on Solaris [#3245]

Alex Kiernan alexk at
Tue Jan 9 13:12:08 UTC 2001

"David Schwartz" <davids at> writes:

> > The Solaris man page (_lwp_cond_signal) is explicit:
> >
> >     "Both functions should be called under the protection of  the
> >      same  LWP  mutex  lock  that  is used with the LWP condition
> >      variable being  signaled. Otherwise, the condition  variable
> >      may  be  signalled between the test of the associated condi-
> >      tion and blocking in _lwp_cond_wait().  This  can  cause  an
> >      infinite wait."
> 	This is flat-out incorrect. What it's suggesting is that the following can
> happen:
> Lock();
> while(!Test_Predicate())
> {
>  <-- signal can occur here and be lost
>  UnlockAndBlockThenRelock();
> }
> Act();
> Unlock();

The problem is when the mutex is unlocked inside _lwp_cond_wait and
the then sleeps - there's no locking around this, so another thread
can get in lock the mutex, change the state of the condition variable,
unlock & signal before we go to sleep in cond_wait.

With pthread semantics I agree, it guarantees that you can hold or not
hold the mutex, with Solaris lwp this appears not to be true.

Alex Kiernan, Principal Engineer, Development, Thus PLC

More information about the inn-workers mailing list