1 // Windows/Synchronization.cpp 2 3 #include "StdAfx.h" 4 5 #ifndef _WIN32 6 7 #include "Synchronization.h" 8 9 namespace NWindows { 10 namespace NSynchronization { 11 12 /* 13 #define INFINITE 0xFFFFFFFF 14 #define MAXIMUM_WAIT_OBJECTS 64 15 #define STATUS_ABANDONED_WAIT_0 ((NTSTATUS)0x00000080L) 16 #define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0 ) + 0 ) 17 #define WAIT_ABANDONED_0 ((STATUS_ABANDONED_WAIT_0 ) + 0 ) 18 // WINAPI 19 DWORD WaitForMultipleObjects(DWORD count, const HANDLE *handles, BOOL wait_all, DWORD timeout); 20 */ 21 22 /* clang: we need to place some virtual functions in cpp file to rid off the warning: 23 'CBaseHandle_WFMO' has no out-of-line virtual method definitions; 24 its vtable will be emitted in every translation unit */ ~CBaseHandle_WFMO()25CBaseHandle_WFMO::~CBaseHandle_WFMO() 26 { 27 } 28 IsSignaledAndUpdate()29bool CBaseEvent_WFMO::IsSignaledAndUpdate() 30 { 31 if (this->_state == false) 32 return false; 33 if (this->_manual_reset == false) 34 this->_state = false; 35 return true; 36 } 37 IsSignaledAndUpdate()38bool CSemaphore_WFMO::IsSignaledAndUpdate() 39 { 40 if (this->_count == 0) 41 return false; 42 this->_count--; 43 return true; 44 } 45 WaitForMultiObj_Any_Infinite(DWORD count,const CHandle_WFMO * handles)46DWORD WINAPI WaitForMultiObj_Any_Infinite(DWORD count, const CHandle_WFMO *handles) 47 { 48 if (count < 1) 49 { 50 // abort(); 51 SetLastError(EINVAL); 52 return WAIT_FAILED; 53 } 54 55 CSynchro *synchro = handles[0]->_sync; 56 synchro->Enter(); 57 58 // #ifdef DEBUG_SYNCHRO 59 for (DWORD i = 1; i < count; i++) 60 { 61 if (synchro != handles[i]->_sync) 62 { 63 // abort(); 64 synchro->Leave(); 65 SetLastError(EINVAL); 66 return WAIT_FAILED; 67 } 68 } 69 // #endif 70 71 for (;;) 72 { 73 for (DWORD i = 0; i < count; i++) 74 { 75 if (handles[i]->IsSignaledAndUpdate()) 76 { 77 synchro->Leave(); 78 return WAIT_OBJECT_0 + i; 79 } 80 } 81 synchro->WaitCond(); 82 } 83 } 84 85 }} 86 87 #endif 88