diff options
Diffstat (limited to 'src/thread/vmlock.c')
-rw-r--r-- | src/thread/vmlock.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/src/thread/vmlock.c b/src/thread/vmlock.c index 125c6dc9..0a69b3e3 100644 --- a/src/thread/vmlock.c +++ b/src/thread/vmlock.c @@ -2,21 +2,20 @@ static volatile int vmlock[2]; -void __vm_lock(int inc) +void __vm_wait() { - for (;;) { - int v = vmlock[0]; - if (inc*v < 0) __wait(vmlock, vmlock+1, v, 1); - else if (a_cas(vmlock, v, v+inc)==v) break; - } + int tmp; + while ((tmp=vmlock[0])) + __wait(vmlock, vmlock+1, tmp, 1); } -void __vm_unlock(void) +void __vm_lock(pthread_t self) { - int inc = vmlock[0]>0 ? -1 : 1; - if (a_fetch_add(vmlock, inc)==-inc && vmlock[1]) - __wake(vmlock, -1, 1); + a_inc(vmlock); } -weak_alias(__vm_lock, __vm_lock_impl); -weak_alias(__vm_unlock, __vm_unlock_impl); +void __vm_unlock(pthread_t self) +{ + if (a_fetch_add(vmlock, -1)==1 && vmlock[1]) + __wake(vmlock, -1, 1); +} |