00001 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 #include "Semaphore.h"
00034 
00035 
00036 #ifdef SOCKETS_NAMESPACE
00037 namespace SOCKETS_NAMESPACE {
00038 #endif
00039 
00040 
00041 
00042 #ifdef _WIN32
00043 
00044 Semaphore::Semaphore(value_t start_val)
00045 {
00046         m_handle = ::CreateSemaphore((LPSECURITY_ATTRIBUTES)NULL, start_val, 1, (LPCTSTR)NULL);
00047 }
00048 
00049 
00050 Semaphore::~Semaphore()
00051 {
00052         ::CloseHandle(m_handle);
00053 }
00054 
00055 
00056 int Semaphore::Post()
00057 {
00058         return (::ReleaseSemaphore(m_handle, 1, (LPLONG)NULL) != 0) ? 0 : -1;
00059 }
00060 
00061 
00062 int Semaphore::Wait()
00063 {
00064         return (WaitForSingleObject(m_handle, INFINITE) == WAIT_OBJECT_0) ? 0 : -1;
00065 }
00066 
00067 
00068 int Semaphore::TryWait()
00069 {
00070         return -1; 
00071 }
00072 
00073 
00074 int Semaphore::GetValue(int& i)
00075 {
00076         return 0; 
00077 }
00078 
00079 
00080 #else
00081 
00082 Semaphore::Semaphore(value_t start_val)
00083 {
00084         sem_init(&m_sem, 0, start_val);
00085 }
00086 
00087 
00088 Semaphore::~Semaphore()
00089 {
00090         sem_destroy(&m_sem);
00091 }
00092 
00093 
00094 int Semaphore::Post()
00095 {
00096         return sem_post(&m_sem);
00097 }
00098 
00099 
00100 int Semaphore::Wait()
00101 {
00102         return sem_wait(&m_sem);
00103 }
00104 
00105 
00106 int Semaphore::TryWait()
00107 {
00108         return sem_trywait(&m_sem);
00109 }
00110 
00111 
00112 int Semaphore::GetValue(int& i)
00113 {
00114         return sem_getvalue(&m_sem, &i);
00115 }
00116 
00117 #endif
00118 
00119 
00120 #ifdef SOCKETS_NAMESPACE
00121 } 
00122 #endif
00123