]> git.mxchange.org Git - simgear.git/blob - simgear/nasal/thread-posix.c
Cygwin fixes.
[simgear.git] / simgear / nasal / thread-posix.c
1 #ifndef _WIN32
2
3 #include <pthread.h>
4 #include "code.h"
5
6 void* naNewLock()
7 {
8     pthread_mutex_t* lock = naAlloc(sizeof(pthread_mutex_t));
9     pthread_mutex_init(lock, 0);
10     return lock;
11 }
12
13 void naLock(void* lock)
14 {
15     pthread_mutex_lock((pthread_mutex_t*)lock);
16 }
17
18 void naUnlock(void* lock)
19 {
20     pthread_mutex_unlock((pthread_mutex_t*)lock);
21 }
22
23 struct naSem {
24     pthread_mutex_t lock;
25     pthread_cond_t cvar;
26     int count;
27 };
28
29 void* naNewSem()
30 {
31     struct naSem* sem = naAlloc(sizeof(struct naSem));
32     pthread_mutex_init(&sem->lock , 0);
33     pthread_cond_init(&sem->cvar, 0);
34     sem->count = 0;
35     return sem;
36 }
37
38 void naSemDown(void* sh)
39 {
40     struct naSem* sem = (struct naSem*)sh;
41     pthread_mutex_lock(&sem->lock);
42     while(sem->count <= 0)
43         pthread_cond_wait(&sem->cvar, &sem->lock);
44     sem->count--;
45     pthread_mutex_unlock(&sem->lock);
46 }
47
48 void naSemUpAll(void* sh, int count)
49 {
50     struct naSem* sem = (struct naSem*)sh;
51     pthread_mutex_lock(&sem->lock);
52     sem->count = count;
53     pthread_cond_broadcast(&sem->cvar);
54     pthread_mutex_unlock(&sem->lock);
55 }
56
57 #endif
58
59 extern int GccWarningWorkaround_IsoCForbidsAnEmptySourceFile;