00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "dcmtk/ofstd/ofcast.h"
00025
00031
00032 namespace log4cplus { namespace thread {
00033
00034
00035 #define LOG4CPLUS_THROW_RTE(msg) \
00036 do { detail::syncprims_throw_exception (msg, __FILE__, __LINE__); } while (0)
00037
00038
00039
00040
00041
00042 inline
00043 Mutex::Mutex ()
00044 {
00045 InitializeCriticalSection (&cs);
00046 }
00047
00048
00049 inline
00050 Mutex::~Mutex ()
00051 {
00052 DeleteCriticalSection (&cs);
00053 }
00054
00055
00056 inline
00057 void
00058 Mutex::lock () const
00059 {
00060 EnterCriticalSection (&cs);
00061 }
00062
00063
00064 inline
00065 void
00066 Mutex::unlock () const
00067 {
00068 LeaveCriticalSection (&cs);
00069 }
00070
00071
00072
00073
00074
00075
00076 inline
00077 Semaphore::Semaphore (unsigned max, unsigned initial)
00078 {
00079 sem = CreateSemaphore (0, initial, max, 0);
00080 if (! sem)
00081 LOG4CPLUS_THROW_RTE ("Semaphore::Semaphore");
00082 }
00083
00084
00085 inline
00086 Semaphore::~Semaphore ()
00087 {
00088 try
00089 {
00090 if (! CloseHandle (sem))
00091 LOG4CPLUS_THROW_RTE ("Semaphore::~Semaphore");
00092 }
00093 catch (...)
00094 { }
00095 }
00096
00097
00098 inline
00099 void
00100 Semaphore::unlock () const
00101 {
00102 DWORD ret = ReleaseSemaphore (sem, 1, 0);
00103 if (! ret)
00104 LOG4CPLUS_THROW_RTE ("Semaphore::unlock");
00105 }
00106
00107
00108 inline
00109 void
00110 Semaphore::lock () const
00111 {
00112 DWORD ret = WaitForSingleObject (sem, INFINITE);
00113 if (ret != WAIT_OBJECT_0)
00114 LOG4CPLUS_THROW_RTE ("Semaphore::lock");
00115 }
00116
00117
00118
00119
00120
00121
00122 inline
00123 ManualResetEvent::ManualResetEvent (bool sig)
00124 {
00125 ev = CreateEvent (0, true, sig, 0);
00126 if (! ev)
00127 LOG4CPLUS_THROW_RTE ("ManualResetEvent::ManualResetEvent");
00128 }
00129
00130
00131 inline
00132 ManualResetEvent::~ManualResetEvent ()
00133 {
00134 try
00135 {
00136 if (! CloseHandle (ev))
00137 LOG4CPLUS_THROW_RTE ("ManualResetEvent::~ManualResetEvent");
00138 }
00139 catch (...)
00140 { }
00141 }
00142
00143
00144 inline
00145 void
00146 ManualResetEvent::signal () const
00147 {
00148 if (! SetEvent (ev))
00149 LOG4CPLUS_THROW_RTE ("ManualResetEVent::signal");
00150 }
00151
00152
00153 inline
00154 void
00155 ManualResetEvent::wait () const
00156 {
00157 DWORD ret = WaitForSingleObject (ev, INFINITE);
00158 if (ret != WAIT_OBJECT_0)
00159 LOG4CPLUS_THROW_RTE ("ManualResetEvent::wait");
00160 }
00161
00162
00163 inline
00164 bool
00165 ManualResetEvent::timed_wait (unsigned long msec) const
00166 {
00167 DWORD ret = WaitForSingleObject (ev, OFstatic_cast(DWORD, msec));
00168 switch(ret)
00169 {
00170 case WAIT_OBJECT_0:
00171 return true;
00172
00173 case WAIT_TIMEOUT:
00174 return false;
00175
00176 default:
00177 LOG4CPLUS_THROW_RTE ("ManualResetEvent::timed_wait");
00178
00179
00180 return false;
00181 }
00182 }
00183
00184
00185 inline
00186 void
00187 ManualResetEvent::reset () const
00188 {
00189 if (! ResetEvent (ev))
00190 LOG4CPLUS_THROW_RTE ("ManualResetEvent::reset");
00191 }
00192
00193
00194 #undef LOG4CPLUS_THROW_RTE
00195
00196
00197 } }