xref: /aosp_15_r20/external/lzma/CPP/Windows/Synchronization.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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()25 CBaseHandle_WFMO::~CBaseHandle_WFMO()
26 {
27 }
28 
IsSignaledAndUpdate()29 bool 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()38 bool 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)46 DWORD 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