00001 #include "bcsignals.h"
00002 #include "sema.h"
00003
00004
00005
00006
00007 Sema::Sema(int init_value, char *title)
00008 {
00009 sem_init(&sem, 0, init_value);
00010 this->title = title;
00011 this->init_value = init_value;
00012 }
00013
00014 Sema::~Sema()
00015 {
00016 sem_destroy(&sem);
00017 UNSET_ALL_LOCKS(this);
00018 }
00019
00020
00021 void Sema::lock(char *location)
00022 {
00023 SET_LOCK(this, title, location);
00024 sem_wait(&sem);
00025 SET_LOCK2
00026 }
00027
00028 void Sema::unlock()
00029 {
00030 UNSET_LOCK(this);
00031 sem_post(&sem);
00032 }
00033
00034 int Sema::get_value()
00035 {
00036 int result;
00037 sem_getvalue(&sem, &result);
00038 return result;
00039 }
00040
00041 void Sema::reset()
00042 {
00043 sem_destroy(&sem);
00044 sem_init(&sem, 0, init_value);
00045 UNSET_ALL_LOCKS(this)
00046 }
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 #if 0
00067
00068 #include "bcipc.h"
00069 #include "sema.h"
00070
00071 Sema::Sema(int id, int number)
00072 {
00073 if(id == -1)
00074 {
00075 if((semid = semget(IPC_PRIVATE, number, IPC_CREAT | 0777)) < 0) perror("Sema::Sema");
00076 for(int i = 0; i < number; i++) unlock(i);
00077 client = 0;
00078 bc_enter_sema_id(semid);
00079 }
00080 else
00081 {
00082 client = 1;
00083 this->semid = id;
00084 }
00085
00086 semas = number;
00087 }
00088
00089 Sema::~Sema()
00090 {
00091 if(!client)
00092 {
00093 if(semctl(semid, 0, IPC_RMID, arg) < 0) perror("Sema::~Sema");
00094 bc_remove_sema_id(semid);
00095 }
00096 }
00097
00098
00099 int Sema::lock(int number)
00100 {
00101 struct sembuf sop;
00102
00103
00104 sop.sem_num = number;
00105 sop.sem_op = -1;
00106 sop.sem_flg = 0;
00107 if(semop(semid, &sop, 1) < 0) perror("Sema::lock");
00108 return 0;
00109 }
00110
00111 int Sema::unlock(int number)
00112 {
00113 struct sembuf sop;
00114
00115
00116 sop.sem_num = number;
00117 sop.sem_op = 1;
00118 sop.sem_flg = 0;
00119 if(semop(semid, &sop, 1) < 0) perror("Sema::unlock");
00120 return 0;
00121 }
00122
00123 int Sema::get_value(int number)
00124 {
00125 return semctl(semid, number, GETVAL, arg);
00126 }
00127
00128 int Sema::get_id()
00129 {
00130 return semid;
00131 }
00132
00133
00134 #endif