home *** CD-ROM | disk | FTP | other *** search
/ Geek 6 / Geek-006.iso / linux / video / xmovie-1.5.3.tar.gz / xmovie-1.5.3.tar / xmovie-1.5.3 / guicast / sema.C < prev    next >
C/C++ Source or Header  |  2000-11-29  |  993b  |  65 lines

  1. #include "bcipc.h"
  2. #include "sema.h"
  3.  
  4. Sema::Sema(int id, int number)
  5. {
  6.     if(id == -1)
  7.     {
  8.         if((semid = semget(IPC_PRIVATE, number, IPC_CREAT | 0777)) < 0) perror("Sema::Sema");
  9.         for(int i = 0; i < number; i++) unlock(i);
  10.         client = 0;
  11.         bc_enter_sema_id(semid);
  12.     }
  13.     else
  14.     {
  15.         client = 1;
  16.         this->semid = id;
  17.     }
  18.  
  19.     semas = number;
  20. }
  21.  
  22. Sema::~Sema()
  23. {
  24.     if(!client)
  25.     {
  26.         if(semctl(semid, 0, IPC_RMID, arg) < 0) perror("Sema::~Sema");
  27.         bc_remove_sema_id(semid);
  28.     }
  29. }
  30.  
  31.     
  32. int Sema::lock(int number)
  33. {
  34.     struct sembuf sop;
  35.     
  36. // decrease the semaphore
  37.     sop.sem_num = number;
  38.     sop.sem_op = -1;
  39.     sop.sem_flg = 0;
  40.     if(semop(semid, &sop, 1) < 0) perror("Sema::lock");
  41.     return 0;
  42. }
  43.  
  44. int Sema::unlock(int number)
  45. {
  46.     struct sembuf sop;
  47.     
  48. // decrease the semaphore
  49.     sop.sem_num = number;
  50.     sop.sem_op = 1;
  51.     sop.sem_flg = 0;
  52.     if(semop(semid, &sop, 1) < 0) perror("Sema::unlock");
  53.     return 0;
  54. }
  55.  
  56. int Sema::get_value(int number)
  57. {
  58.     return semctl(semid, number, GETVAL, arg);
  59. }
  60.  
  61. int Sema::get_id()
  62. {
  63.     return semid;
  64. }
  65.