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