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 WaitForMultiObj_Any_Infinite(DWORD count,const CHandle_WFMO * handles)22DWORD WINAPI WaitForMultiObj_Any_Infinite(DWORD count, const CHandle_WFMO *handles) 23 { 24 if (count < 1) 25 { 26 // abort(); 27 SetLastError(EINVAL); 28 return WAIT_FAILED; 29 } 30 31 CSynchro *synchro = handles[0]->_sync; 32 synchro->Enter(); 33 34 // #ifdef DEBUG_SYNCHRO 35 for (DWORD i = 1; i < count; i++) 36 { 37 if (synchro != handles[i]->_sync) 38 { 39 // abort(); 40 synchro->Leave(); 41 SetLastError(EINVAL); 42 return WAIT_FAILED; 43 } 44 } 45 // #endif 46 47 for (;;) 48 { 49 for (DWORD i = 0; i < count; i++) 50 { 51 if (handles[i]->IsSignaledAndUpdate()) 52 { 53 synchro->Leave(); 54 return WAIT_OBJECT_0 + i; 55 } 56 } 57 synchro->WaitCond(); 58 } 59 } 60 61 }} 62 63 #endif 64