Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members

sema.C

Go to the documentation of this file.
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 // decrease the semaphore
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 // decrease the semaphore
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

Generated on Sun Jan 8 13:26:35 2006 for Guicast-svn by  doxygen 1.4.4