00001 #include "system.hh"
00002
00003 CriticalSection::CriticalSection() : implData((void*)new CRITICAL_SECTION)
00004 {
00005 assert(implData);
00006 InitializeCriticalSection( *((CRITICAL_SECTION **)&implData) );
00007 }
00008
00009 CriticalSection::~CriticalSection()
00010 {
00011 DeleteCriticalSection( *((CRITICAL_SECTION **)&implData) );
00012 }
00013
00014 void CriticalSection::enter()
00015 {
00016 EnterCriticalSection( *((CRITICAL_SECTION **)&implData) );
00017 }
00018
00019 void CriticalSection::leave()
00020 {
00021 LeaveCriticalSection( *((CRITICAL_SECTION **)&implData) );
00022 }
00023
00024
00025 LIFOCriticalSection::LIFOCriticalSection(void) :
00026 implData((void*)CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0 ))
00027 {
00028
00029
00030 assert(implData);
00031 leave();
00032 }
00033
00034 LIFOCriticalSection::~LIFOCriticalSection(void)
00035 {
00036 CloseHandle( *((HANDLE *)&implData) );
00037 }
00038
00039 void LIFOCriticalSection::enter()
00040 {
00041 DWORD numberOfBytesTransferred;
00042 DWORD completionKey;
00043 LPOVERLAPPED lpOverlapped;
00044
00045 GetQueuedCompletionStatus(
00046 *((HANDLE *)&implData),
00047 &numberOfBytesTransferred,
00048 &completionKey,
00049 &lpOverlapped,
00050 INFINITE );
00051 }
00052
00053 void LIFOCriticalSection::leave()
00054 {
00055 PostQueuedCompletionStatus(
00056 *((HANDLE *)&implData),
00057 0,
00058 0,
00059 0 );
00060 }
00061
00062
00063 LIFOSemaphore::LIFOSemaphore(unsigned long initCount) :
00064 implData((void*)CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0))
00065 {
00066
00067
00068 assert(implData);
00069 if( initCount > 0 ) release( initCount );
00070 }
00071
00072 LIFOSemaphore::~LIFOSemaphore(void)
00073 {
00074 CloseHandle( *((HANDLE *)&implData) );
00075 }
00076
00077 void LIFOSemaphore::wait( unsigned long timeout)
00078 {
00079 DWORD numberOfBytesTransferred;
00080 DWORD completionKey;
00081 LPOVERLAPPED lpOverlapped;
00082
00083 GetQueuedCompletionStatus(
00084 *((HANDLE *)&implData),
00085 &numberOfBytesTransferred,
00086 &completionKey,
00087 &lpOverlapped,
00088 timeout );
00089 }
00090
00091 void LIFOSemaphore::release(unsigned long relCount)
00092 {
00093 while( relCount-- > 0 )
00094 {
00095 PostQueuedCompletionStatus(
00096 *((HANDLE *)&implData),
00097 0,
00098 0,
00099 0 );
00100 }
00101 }
00102
00103
00104
00105
00106 CriticalSection *System::systemCS = createCriticalSection();
00107
00108 void System::vdebugPrint(const char *format, va_list args)
00109 {
00110 char buffer[1024];
00111 _vsnprintf( buffer, sizeof(buffer)-4, format, args );
00112 buffer[sizeof(buffer)-2] = '\0';
00113 strcat(buffer, "\n");
00114 OutputDebugString((LPCTSTR)buffer);
00115 }
00116
00117 void System::debugPrint(const char *format, ...)
00118 {
00119 if(format)
00120 {
00121 va_list args;
00122 va_start(args, format);
00123 vdebugPrint(format, args);
00124 va_end(args);
00125 }
00126 else
00127 {
00128 assert(format);
00129 }
00130 }
00131
00132 SOCKET System::accept( SOCKET s, struct sockaddr *addr, int *addrlen )
00133 {
00134 return( ::accept( s, addr, addrlen ) );
00135 }
00136
00137 long System::getLastOSErrorCode(void)
00138 {
00139 return(GetLastError());
00140 }
00141
00142 unsigned long System::getOSTimeSeconds(void)
00143 {
00144 return(time(NULL));
00145 }
00146
00147 void System::yieldThread()
00148 {
00149 Sleep(0);
00150 }
00151
00152 void System::sleep( unsigned long sleepTimeMillisec )
00153 {
00154 Sleep(sleepTimeMillisec);
00155 }
00156
00157 void System::displayErrorMessage( const char *title, const char *message )
00158 {
00159 MessageBox( NULL,
00160 message,
00161 title,
00162 MB_OK |
00163 MB_SETFOREGROUND |
00164
00165 MB_ICONERROR );
00166 }
00167
00168 int System::initializeSockets()
00169 {
00170 WSADATA wsdat;
00171 return( WSAStartup( MAKEWORD( 1, 0 ), &wsdat ) );
00172 }
00173
00174 void System::cleanupSockets()
00175 {
00176 WSACleanup();
00177 }
00178
00179 int System::closeSocket(SOCKET s)
00180 {
00181 return( closesocket(s) );
00182 }
00183
00184 void System::atomicIncrement( volatile unsigned long &v, CriticalSection* )
00185 {
00186 InterlockedIncrement( (long *)&v );
00187 }
00188
00189 void System::atomicDecrement( volatile unsigned long &v, CriticalSection* )
00190 {
00191 InterlockedDecrement( (long *)&v );
00192 }
00193