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