1370b324cSopenharmony_ci// Windows/Synchronization.cpp 2370b324cSopenharmony_ci 3370b324cSopenharmony_ci#include "StdAfx.h" 4370b324cSopenharmony_ci 5370b324cSopenharmony_ci#ifndef _WIN32 6370b324cSopenharmony_ci 7370b324cSopenharmony_ci#include "Synchronization.h" 8370b324cSopenharmony_ci 9370b324cSopenharmony_cinamespace NWindows { 10370b324cSopenharmony_cinamespace NSynchronization { 11370b324cSopenharmony_ci 12370b324cSopenharmony_ci/* 13370b324cSopenharmony_ci#define INFINITE 0xFFFFFFFF 14370b324cSopenharmony_ci#define MAXIMUM_WAIT_OBJECTS 64 15370b324cSopenharmony_ci#define STATUS_ABANDONED_WAIT_0 ((NTSTATUS)0x00000080L) 16370b324cSopenharmony_ci#define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0 ) + 0 ) 17370b324cSopenharmony_ci#define WAIT_ABANDONED_0 ((STATUS_ABANDONED_WAIT_0 ) + 0 ) 18370b324cSopenharmony_ci// WINAPI 19370b324cSopenharmony_ciDWORD WaitForMultipleObjects(DWORD count, const HANDLE *handles, BOOL wait_all, DWORD timeout); 20370b324cSopenharmony_ci*/ 21370b324cSopenharmony_ci 22370b324cSopenharmony_ci/* clang: we need to place some virtual functions in cpp file to rid off the warning: 23370b324cSopenharmony_ci 'CBaseHandle_WFMO' has no out-of-line virtual method definitions; 24370b324cSopenharmony_ci its vtable will be emitted in every translation unit */ 25370b324cSopenharmony_ciCBaseHandle_WFMO::~CBaseHandle_WFMO() 26370b324cSopenharmony_ci{ 27370b324cSopenharmony_ci} 28370b324cSopenharmony_ci 29370b324cSopenharmony_cibool CBaseEvent_WFMO::IsSignaledAndUpdate() 30370b324cSopenharmony_ci{ 31370b324cSopenharmony_ci if (this->_state == false) 32370b324cSopenharmony_ci return false; 33370b324cSopenharmony_ci if (this->_manual_reset == false) 34370b324cSopenharmony_ci this->_state = false; 35370b324cSopenharmony_ci return true; 36370b324cSopenharmony_ci} 37370b324cSopenharmony_ci 38370b324cSopenharmony_cibool CSemaphore_WFMO::IsSignaledAndUpdate() 39370b324cSopenharmony_ci{ 40370b324cSopenharmony_ci if (this->_count == 0) 41370b324cSopenharmony_ci return false; 42370b324cSopenharmony_ci this->_count--; 43370b324cSopenharmony_ci return true; 44370b324cSopenharmony_ci} 45370b324cSopenharmony_ci 46370b324cSopenharmony_ciDWORD WINAPI WaitForMultiObj_Any_Infinite(DWORD count, const CHandle_WFMO *handles) 47370b324cSopenharmony_ci{ 48370b324cSopenharmony_ci if (count < 1) 49370b324cSopenharmony_ci { 50370b324cSopenharmony_ci // abort(); 51370b324cSopenharmony_ci SetLastError(EINVAL); 52370b324cSopenharmony_ci return WAIT_FAILED; 53370b324cSopenharmony_ci } 54370b324cSopenharmony_ci 55370b324cSopenharmony_ci CSynchro *synchro = handles[0]->_sync; 56370b324cSopenharmony_ci synchro->Enter(); 57370b324cSopenharmony_ci 58370b324cSopenharmony_ci // #ifdef DEBUG_SYNCHRO 59370b324cSopenharmony_ci for (DWORD i = 1; i < count; i++) 60370b324cSopenharmony_ci { 61370b324cSopenharmony_ci if (synchro != handles[i]->_sync) 62370b324cSopenharmony_ci { 63370b324cSopenharmony_ci // abort(); 64370b324cSopenharmony_ci synchro->Leave(); 65370b324cSopenharmony_ci SetLastError(EINVAL); 66370b324cSopenharmony_ci return WAIT_FAILED; 67370b324cSopenharmony_ci } 68370b324cSopenharmony_ci } 69370b324cSopenharmony_ci // #endif 70370b324cSopenharmony_ci 71370b324cSopenharmony_ci for (;;) 72370b324cSopenharmony_ci { 73370b324cSopenharmony_ci for (DWORD i = 0; i < count; i++) 74370b324cSopenharmony_ci { 75370b324cSopenharmony_ci if (handles[i]->IsSignaledAndUpdate()) 76370b324cSopenharmony_ci { 77370b324cSopenharmony_ci synchro->Leave(); 78370b324cSopenharmony_ci return WAIT_OBJECT_0 + i; 79370b324cSopenharmony_ci } 80370b324cSopenharmony_ci } 81370b324cSopenharmony_ci synchro->WaitCond(); 82370b324cSopenharmony_ci } 83370b324cSopenharmony_ci} 84370b324cSopenharmony_ci 85370b324cSopenharmony_ci}} 86370b324cSopenharmony_ci 87370b324cSopenharmony_ci#endif 88