summaryrefslogtreecommitdiff
path: root/src/thread/vmlock.c
blob: 0a69b3e3e019b4c241bc769a94acf3797bd24f35 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "pthread_impl.h"

static volatile int vmlock[2];

void __vm_wait()
{
	int tmp;
	while ((tmp=vmlock[0]))
		__wait(vmlock, vmlock+1, tmp, 1);
}

void __vm_lock(pthread_t self)
{
	a_inc(vmlock);
}

void __vm_unlock(pthread_t self)
{
	if (a_fetch_add(vmlock, -1)==1 && vmlock[1])
		__wake(vmlock, -1, 1);
}