00001
00011 #ifndef DEFINE_H_YSEMAPHORE
00012 #define DEFINE_H_YSEMAPHORE
00013
00014 #include <basic.h>
00015 #include <btron/taskcomm.h>
00016 #include "yexception.h"
00017
00022 class YSemaphoreException : public YException {
00023 public:
00024 YSemaphoreException(W n = 0) : YException(n) {}
00025 YSemaphoreException(const YString& str, W n = 0)
00026 : YException(str, n) {}
00027 };
00028
00029 struct YSemaphoreInstance {
00030 W sem_id;
00031 W refcount;
00032 };
00033
00046 class YSemaphore {
00047 private:
00048 mutable YSemaphoreInstance *sem;
00049 W max_count;
00050 W mode;
00051
00053 W getInternalSemaphoreID() const;
00054
00056 YSemaphoreInstance* getInstance() const;
00057
00059 void reductInstanceReferrer();
00060
00061 protected:
00062
00063 public:
00065 YSemaphore(W cnt = 1, W mode = SEM_EXCL);
00066
00071 ~YSemaphore() {
00072 W global_sem = getInternalSemaphoreID();
00073 wai_sem(global_sem, T_FOREVER);
00074
00075 try {
00076 reductInstanceReferrer();
00077 }
00078 catch (...){
00079 sig_sem(global_sem);
00080 throw;
00081 }
00082
00083 sig_sem(global_sem);
00084 }
00085
00086
00087 YSemaphore(const YSemaphore& src);
00088
00090 void lock();
00091
00093 void unlock();
00094
00096 const YSemaphore& operator=(const YSemaphore& src);
00097
00098 };
00099
00100 #endif // DEFINE_H_YSEMAPHORE