PageRenderTime 40ms CodeModel.GetById 25ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 0ms

/libs/headers/gc/private/darwin_semaphore.h

http://github.com/nddrylliog/ooc
C++ Header | 68 lines | 53 code | 9 blank | 6 comment | 11 complexity | 14a4a64df372dafcc6121c4d958ed00c MD5 | raw file
 1#ifndef GC_DARWIN_SEMAPHORE_H
 2#define GC_DARWIN_SEMAPHORE_H
 3
 4#if !defined(GC_DARWIN_THREADS)
 5#error darwin_semaphore.h included with GC_DARWIN_THREADS not defined
 6#endif
 7
 8/*
 9   This is a very simple semaphore implementation for darwin. It
10   is implemented in terms of pthreads calls so it isn't async signal
11   safe. This isn't a problem because signals aren't used to
12   suspend threads on darwin.
13*/
14   
15typedef struct {
16    pthread_mutex_t mutex;
17    pthread_cond_t cond;
18    int value;
19} sem_t;
20
21static int sem_init(sem_t *sem, int pshared, int value) {
22    int ret;
23    if(pshared)
24        GC_abort("sem_init with pshared set");
25    sem->value = value;
26    
27    ret = pthread_mutex_init(&sem->mutex,NULL);
28    if(ret < 0) return -1;
29    ret = pthread_cond_init(&sem->cond,NULL);
30    if(ret < 0) return -1;
31    return 0;
32}
33
34static int sem_post(sem_t *sem) {
35    if(pthread_mutex_lock(&sem->mutex) < 0)
36        return -1;
37    sem->value++;
38    if(pthread_cond_signal(&sem->cond) < 0) {
39        pthread_mutex_unlock(&sem->mutex);
40        return -1;
41    }
42    if(pthread_mutex_unlock(&sem->mutex) < 0)
43        return -1;
44    return 0;
45}
46
47static int sem_wait(sem_t *sem) {
48    if(pthread_mutex_lock(&sem->mutex) < 0)
49        return -1;
50    while(sem->value == 0) {
51        pthread_cond_wait(&sem->cond,&sem->mutex);
52    }
53    sem->value--;
54    if(pthread_mutex_unlock(&sem->mutex) < 0)
55        return -1;    
56    return 0;
57}
58
59static int sem_destroy(sem_t *sem) {
60    int ret;
61    ret = pthread_cond_destroy(&sem->cond);
62    if(ret < 0) return -1;
63    ret = pthread_mutex_destroy(&sem->mutex);
64    if(ret < 0) return -1;
65    return 0;
66}
67
68#endif