diff options
Diffstat (limited to 'libc-top-half/musl/src/thread/vmlock.c')
-rw-r--r-- | libc-top-half/musl/src/thread/vmlock.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/libc-top-half/musl/src/thread/vmlock.c b/libc-top-half/musl/src/thread/vmlock.c new file mode 100644 index 0000000..fa0a8e3 --- /dev/null +++ b/libc-top-half/musl/src/thread/vmlock.c @@ -0,0 +1,23 @@ +#include "pthread_impl.h" +#include "fork_impl.h" + +static volatile int vmlock[2]; +volatile int *const __vmlock_lockptr = vmlock; + +void __vm_wait() +{ + int tmp; + while ((tmp=vmlock[0])) + __wait(vmlock, vmlock+1, tmp, 1); +} + +void __vm_lock() +{ + a_inc(vmlock); +} + +void __vm_unlock() +{ + if (a_fetch_add(vmlock, -1)==1 && vmlock[1]) + __wake(vmlock, -1, 1); +} |