xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/VirtThread.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // VirtThread.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "VirtThread.h"
6*f6dc9357SAndroid Build Coastguard Worker 
CoderThread(void * p)7*f6dc9357SAndroid Build Coastguard Worker static THREAD_FUNC_DECL CoderThread(void *p)
8*f6dc9357SAndroid Build Coastguard Worker {
9*f6dc9357SAndroid Build Coastguard Worker   for (;;)
10*f6dc9357SAndroid Build Coastguard Worker   {
11*f6dc9357SAndroid Build Coastguard Worker     CVirtThread *t = (CVirtThread *)p;
12*f6dc9357SAndroid Build Coastguard Worker     t->StartEvent.Lock();
13*f6dc9357SAndroid Build Coastguard Worker     if (t->Exit)
14*f6dc9357SAndroid Build Coastguard Worker       return THREAD_FUNC_RET_ZERO;
15*f6dc9357SAndroid Build Coastguard Worker     t->Execute();
16*f6dc9357SAndroid Build Coastguard Worker     t->FinishedEvent.Set();
17*f6dc9357SAndroid Build Coastguard Worker   }
18*f6dc9357SAndroid Build Coastguard Worker }
19*f6dc9357SAndroid Build Coastguard Worker 
Create()20*f6dc9357SAndroid Build Coastguard Worker WRes CVirtThread::Create()
21*f6dc9357SAndroid Build Coastguard Worker {
22*f6dc9357SAndroid Build Coastguard Worker   RINOK_WRes(StartEvent.CreateIfNotCreated_Reset())
23*f6dc9357SAndroid Build Coastguard Worker   RINOK_WRes(FinishedEvent.CreateIfNotCreated_Reset())
24*f6dc9357SAndroid Build Coastguard Worker   // StartEvent.Reset();
25*f6dc9357SAndroid Build Coastguard Worker   // FinishedEvent.Reset();
26*f6dc9357SAndroid Build Coastguard Worker   Exit = false;
27*f6dc9357SAndroid Build Coastguard Worker   if (Thread.IsCreated())
28*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
29*f6dc9357SAndroid Build Coastguard Worker   return Thread.Create(CoderThread, this);
30*f6dc9357SAndroid Build Coastguard Worker }
31*f6dc9357SAndroid Build Coastguard Worker 
Start()32*f6dc9357SAndroid Build Coastguard Worker WRes CVirtThread::Start()
33*f6dc9357SAndroid Build Coastguard Worker {
34*f6dc9357SAndroid Build Coastguard Worker   Exit = false;
35*f6dc9357SAndroid Build Coastguard Worker   return StartEvent.Set();
36*f6dc9357SAndroid Build Coastguard Worker }
37*f6dc9357SAndroid Build Coastguard Worker 
WaitThreadFinish()38*f6dc9357SAndroid Build Coastguard Worker void CVirtThread::WaitThreadFinish()
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker   Exit = true;
41*f6dc9357SAndroid Build Coastguard Worker   if (StartEvent.IsCreated())
42*f6dc9357SAndroid Build Coastguard Worker     StartEvent.Set();
43*f6dc9357SAndroid Build Coastguard Worker   if (Thread.IsCreated())
44*f6dc9357SAndroid Build Coastguard Worker   {
45*f6dc9357SAndroid Build Coastguard Worker     Thread.Wait_Close();
46*f6dc9357SAndroid Build Coastguard Worker   }
47*f6dc9357SAndroid Build Coastguard Worker }
48