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