r956: README.BUILD - add more library recommendations
[cinelerra_cv/ct.git] / guicast / sema.C
bloba24d4fe82005e7a442efe709e069050c76482923
1 #include "bcsignals.h"
2 #include "sema.h"
7 Sema::Sema(int init_value, char *title)
9         sem_init(&sem, 0, init_value);
10         this->title = title;
11         this->init_value = init_value;
14 Sema::~Sema()
16         sem_destroy(&sem);
17         UNSET_ALL_LOCKS(this);
21 void Sema::lock(char *location)
23         SET_LOCK(this, title, location);
24         sem_wait(&sem);
25         SET_LOCK2
28 void Sema::unlock()
30         UNSET_LOCK(this);
31         sem_post(&sem);
34 int Sema::get_value()
36         int result;
37         sem_getvalue(&sem, &result);
38         return result;
41 void Sema::reset()
43         sem_destroy(&sem);
44         sem_init(&sem, 0, init_value);
45         UNSET_ALL_LOCKS(this)
66 #if 0
68 #include "bcipc.h"
69 #include "sema.h"
71 Sema::Sema(int id, int number)
73         if(id == -1)
74         {
75                 if((semid = semget(IPC_PRIVATE, number, IPC_CREAT | 0777)) < 0) perror("Sema::Sema");
76                 for(int i = 0; i < number; i++) unlock(i);
77                 client = 0;
78                 bc_enter_sema_id(semid);
79         }
80         else
81         {
82                 client = 1;
83                 this->semid = id;
84         }
86         semas = number;
89 Sema::~Sema()
91         if(!client)
92         {
93                 if(semctl(semid, 0, IPC_RMID, arg) < 0) perror("Sema::~Sema");
94                 bc_remove_sema_id(semid);
95         }
98         
99 int Sema::lock(int number)
101         struct sembuf sop;
102         
103 // decrease the semaphore
104         sop.sem_num = number;
105         sop.sem_op = -1;
106         sop.sem_flg = 0;
107         if(semop(semid, &sop, 1) < 0) perror("Sema::lock");
108         return 0;
111 int Sema::unlock(int number)
113         struct sembuf sop;
114         
115 // decrease the semaphore
116         sop.sem_num = number;
117         sop.sem_op = 1;
118         sop.sem_flg = 0;
119         if(semop(semid, &sop, 1) < 0) perror("Sema::unlock");
120         return 0;
123 int Sema::get_value(int number)
125         return semctl(semid, number, GETVAL, arg);
128 int Sema::get_id()
130         return semid;
134 #endif