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