parlib: Support mutex-less condition variables
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 13 Aug 2018 22:26:19 +0000 (18:26 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 13 Aug 2018 22:26:19 +0000 (18:26 -0400)
commitcbb3622e027c13b7e36f751650d2e4ca4ddb05a9
tree654afa2a4e9180678a08d51b6c2894db55b96b68
parent6064561077e957229ba2ef7ef37cba2b8c221480
parlib: Support mutex-less condition variables

If we want to signal or broadcast a condition variable, typically we also
want to have grabbed (and possibly released) the mutex that was protecting
whatever state the sleeper cares about.  See my notes in mutex.c for an
example.

Event handlers and other vcore context code cannot grab mutexes, however
they can grab spinlocks.  "Mutex-less" CVs use the CV's spinlock for
synchronization.  These locks can be grabbed in any context, and thus we
can kick the CVs from vcore context.

This is the same solution I came up with for the kernel's CVs, and probably
for the same reasons.  Both deal with interrupt context that can't block,
and both interact with threads that do block.

Whether or not mutex-less CVs are the best way to deal with the issue, they
work.  By comparison, the POSIX pthread_cond_var functions are not even
signal safe, let alone the mutexes that you'll often want to grab.

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