00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 namespace cmlabs {
00023
00024 #ifdef WIN32
00025
00026 void printLastError() {
00027
00028 void* lpMsgBuf;
00029 FormatMessage(
00030 FORMAT_MESSAGE_ALLOCATE_BUFFER |
00031 FORMAT_MESSAGE_FROM_SYSTEM |
00032 FORMAT_MESSAGE_IGNORE_INSERTS,
00033 NULL,
00034 GetLastError(),
00035 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
00036 (LPTSTR) &lpMsgBuf,
00037 0,
00038 NULL
00039 );
00040 printf("LastError: %s", (char*) lpMsgBuf);
00041 }
00042
00043
00044
00045
00046
00047
00048 JSemaphore::JSemaphore(JString semName) {
00049
00050
00051 count=0;
00052 name = semName;
00053
00054 hSemaphore = CreateSemaphore(
00055 NULL,
00056 0,
00057 10,
00058 NULL);
00059
00060 if (hSemaphore == NULL)
00061 {
00062
00063 }
00064
00065 }
00066
00067 JSemaphore::~JSemaphore() {
00068 CloseHandle(hSemaphore);
00069 }
00070
00071
00072 bool JSemaphore::wait(long ms) {
00073
00074 DWORD dwWaitResult;
00075
00076
00077
00078 if (ms < 0)
00079 ms = INFINITE;
00080
00081 try {
00082 dwWaitResult = WaitForSingleObject(
00083 hSemaphore,
00084 ms);
00085 }
00086 catch(...) {
00087 dwWaitResult = 999;
00088 }
00089
00090 if (dwWaitResult == WAIT_OBJECT_0) {
00091
00092 count--;
00093 return true;
00094 }
00095
00096 if (dwWaitResult != WAIT_TIMEOUT)
00097 printLastError();
00098
00099
00100 return false;
00101 }
00102
00103
00104 bool JSemaphore::post() {
00105
00106 try {
00107 if (!ReleaseSemaphore(
00108 hSemaphore,
00109 1,
00110 NULL) )
00111 {
00112
00113 return false;
00114 }
00115 }
00116 catch(...) {
00117 }
00118 count++;
00119 return true;
00120 }
00121
00122
00123 bool JSemaphore::tryWait() {
00124 return wait(0);
00125 }
00126
00127
00128
00129 JSingleSemaphore::JSingleSemaphore() {
00130
00131
00132 hSemaphore = CreateSemaphore(
00133 NULL,
00134 0,
00135 1,
00136 NULL);
00137
00138 if (hSemaphore == NULL)
00139 {
00140
00141 }
00142
00143 }
00144
00145 JSingleSemaphore::~JSingleSemaphore() {
00146 CloseHandle(hSemaphore);
00147 }
00148
00149
00150 bool JSingleSemaphore::wait(long ms) {
00151
00152 DWORD dwWaitResult;
00153
00154
00155
00156 if (ms < 0)
00157 ms = INFINITE;
00158
00159 try {
00160 dwWaitResult = WaitForSingleObject(
00161 hSemaphore,
00162 ms);
00163 }
00164 catch(...) {
00165 dwWaitResult = 999;
00166 }
00167
00168 if (dwWaitResult == WAIT_OBJECT_0) {
00169
00170 return true;
00171 }
00172
00173 if (dwWaitResult != WAIT_TIMEOUT)
00174 printLastError();
00175
00176
00177 return false;
00178 }
00179
00180
00181 bool JSingleSemaphore::postToAll() {
00182
00183 try {
00184 if (!ReleaseSemaphore(
00185 hSemaphore,
00186 1,
00187 NULL) )
00188 {
00189
00190 return false;
00191 }
00192 }
00193 catch(...) {
00194 }
00195 return true;
00196 }
00197
00198
00199 bool JSingleSemaphore::tryWait() {
00200 return wait(0);
00201 }
00202
00203
00204
00205
00206 JMutex::JMutex() {
00207 mutex = CreateMutex (NULL, FALSE, NULL);
00208 }
00209
00210 JMutex::~JMutex() {
00211 CloseHandle(mutex);
00212 }
00213
00214 bool JMutex::EnterMutex(long ms) const {
00215 return enterMutex(ms);
00216 }
00217
00218 bool JMutex::enterMutex(long ms) const {
00219
00220 DWORD dwWaitResult;
00221 long w;
00222
00223 if (ms < 0)
00224 w = 100000;
00225 else
00226 w = ms;
00227
00228 try {
00229
00230 dwWaitResult = WaitForSingleObject(
00231 mutex,
00232 w);
00233 }
00234 catch(...) {
00235 dwWaitResult = 999;
00236 }
00237
00238 if (dwWaitResult == WAIT_OBJECT_0)
00239 return true;
00240 else
00241 return false;
00242
00243 }
00244
00245 bool JMutex::LeaveMutex() const {
00246 return leaveMutex();
00247 }
00248
00249 bool JMutex::leaveMutex() const {
00250 try {
00251 ReleaseMutex(mutex);
00252 }
00253 catch(...) {
00254 return false;
00255 }
00256 return true;
00257 }
00258
00259
00260
00261 #endif
00262
00263 }