Add generic uthread condition variables
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 11 May 2016 22:48:48 +0000 (18:48 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 13 May 2016 15:08:12 +0000 (11:08 -0400)
commitc5272b785bfd492937e579129a1236db76129214
tree9cd46b4bc16a6eab1db53c1b9a593d3eafe22a01
parent4c0c975ca86cee7cda02c548e472ad0be6cae11a
Add generic uthread condition variables

Like with mutexes, apps will want a 2LS-independent way to perform
synchronization.  Although a 2LS can be closely coupled with an
application, it's conceivable that some apps and libraries don't care
which 2LS they link with.

Further, some 2LSs probably don't care about how exactly their mutexes
and CVs work.  In that case, having the generic implementation saves
the 2LS writers from the hassle of rolling their own CVs.

In the future, we might change things up a bit.  When a 2LS wants to
control its mutex and CV implementations, it's probably so that they can
pick which thread runs from the queue.  In that case, perhaps we only
call out to the 2LS for the structure and the decision.

For instance, the generic uthread implementation uses a TAILQ and a FIFO
policy.  The 2LS could have a different structure and a different
policy, where the operations are "here's a Sync object (cv/mtx) and a
uth, block on it" and "wake on from this sync object" and "wake all."
The sync object would likely be embedded in a larger object, which means
it is allocated by the 2LS (so there are two more ops).  There are a few
other details; we'll hold off until we actually have a use case.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/include/parlib/uthread.h
user/parlib/mutex.c