]> git.mxchange.org Git - simgear.git/blob - simgear/nasal/thread-posix.c
Removal of PLIB/SG from SimGear
[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 naFreeLock(void* lock)
14 {
15     pthread_mutex_destroy(lock);
16     naFree(lock);
17 }
18
19 void naLock(void* lock)
20 {
21     pthread_mutex_lock((pthread_mutex_t*)lock);
22 }
23
24 void naUnlock(void* lock)
25 {
26     pthread_mutex_unlock((pthread_mutex_t*)lock);
27 }
28
29 struct naSem {
30     pthread_mutex_t lock;
31     pthread_cond_t cvar;
32     int count;
33 };
34
35 void* naNewSem()
36 {
37     struct naSem* sem = naAlloc(sizeof(struct naSem));
38     pthread_mutex_init(&sem->lock , 0);
39     pthread_cond_init(&sem->cvar, 0);
40     sem->count = 0;
41     return sem;
42 }
43
44 void naFreeSem(void* p)
45 {
46     struct naSem* sem = p;
47     pthread_mutex_destroy(&sem->lock);
48     pthread_cond_destroy(&sem->cvar);
49     naFree(sem);
50 }
51
52 void naSemDown(void* sh)
53 {
54     struct naSem* sem = (struct naSem*)sh;
55     pthread_mutex_lock(&sem->lock);
56     while(sem->count <= 0)
57         pthread_cond_wait(&sem->cvar, &sem->lock);
58     sem->count--;
59     pthread_mutex_unlock(&sem->lock);
60 }
61
62 void naSemUp(void* sh, int count)
63 {
64     struct naSem* sem = (struct naSem*)sh;
65     pthread_mutex_lock(&sem->lock);
66     sem->count += count;
67     pthread_cond_broadcast(&sem->cvar);
68     pthread_mutex_unlock(&sem->lock);
69 }
70
71 #endif
72
73 extern int GccWarningWorkaround_IsoCForbidsAnEmptySourceFile;