xref: /aosp_15_r20/external/musl/src/thread/vmlock.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "pthread_impl.h"
2*c9945492SAndroid Build Coastguard Worker #include "fork_impl.h"
3*c9945492SAndroid Build Coastguard Worker 
4*c9945492SAndroid Build Coastguard Worker static volatile int vmlock[2];
5*c9945492SAndroid Build Coastguard Worker volatile int *const __vmlock_lockptr = vmlock;
6*c9945492SAndroid Build Coastguard Worker 
__vm_wait()7*c9945492SAndroid Build Coastguard Worker void __vm_wait()
8*c9945492SAndroid Build Coastguard Worker {
9*c9945492SAndroid Build Coastguard Worker 	int tmp;
10*c9945492SAndroid Build Coastguard Worker 	while ((tmp=vmlock[0]))
11*c9945492SAndroid Build Coastguard Worker 		__wait(vmlock, vmlock+1, tmp, 1);
12*c9945492SAndroid Build Coastguard Worker }
13*c9945492SAndroid Build Coastguard Worker 
__vm_lock()14*c9945492SAndroid Build Coastguard Worker void __vm_lock()
15*c9945492SAndroid Build Coastguard Worker {
16*c9945492SAndroid Build Coastguard Worker 	a_inc(vmlock);
17*c9945492SAndroid Build Coastguard Worker }
18*c9945492SAndroid Build Coastguard Worker 
__vm_unlock()19*c9945492SAndroid Build Coastguard Worker void __vm_unlock()
20*c9945492SAndroid Build Coastguard Worker {
21*c9945492SAndroid Build Coastguard Worker 	if (a_fetch_add(vmlock, -1)==1 && vmlock[1])
22*c9945492SAndroid Build Coastguard Worker 		__wake(vmlock, -1, 1);
23*c9945492SAndroid Build Coastguard Worker }
24