Mercurial > vba-linux
annotate src/win32/7zip/7z/CPP/7zip/Common/VirtThread.cpp @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
rev | line source |
---|---|
rlm@1 | 1 // VirtThread.cpp |
rlm@1 | 2 |
rlm@1 | 3 #include "StdAfx.h" |
rlm@1 | 4 |
rlm@1 | 5 #include "VirtThread.h" |
rlm@1 | 6 |
rlm@1 | 7 static THREAD_FUNC_DECL CoderThread(void *p) |
rlm@1 | 8 { |
rlm@1 | 9 for (;;) |
rlm@1 | 10 { |
rlm@1 | 11 CVirtThread *t = (CVirtThread *)p; |
rlm@1 | 12 t->StartEvent.Lock(); |
rlm@1 | 13 if (t->ExitEvent) |
rlm@1 | 14 return 0; |
rlm@1 | 15 t->Execute(); |
rlm@1 | 16 t->FinishedEvent.Set(); |
rlm@1 | 17 } |
rlm@1 | 18 } |
rlm@1 | 19 |
rlm@1 | 20 WRes CVirtThread::Create() |
rlm@1 | 21 { |
rlm@1 | 22 RINOK(StartEvent.CreateIfNotCreated()); |
rlm@1 | 23 RINOK(FinishedEvent.CreateIfNotCreated()); |
rlm@1 | 24 StartEvent.Reset(); |
rlm@1 | 25 FinishedEvent.Reset(); |
rlm@1 | 26 ExitEvent = false; |
rlm@1 | 27 if (Thread.IsCreated()) |
rlm@1 | 28 return S_OK; |
rlm@1 | 29 return Thread.Create(CoderThread, this); |
rlm@1 | 30 } |
rlm@1 | 31 |
rlm@1 | 32 void CVirtThread::Start() |
rlm@1 | 33 { |
rlm@1 | 34 ExitEvent = false; |
rlm@1 | 35 StartEvent.Set(); |
rlm@1 | 36 } |
rlm@1 | 37 |
rlm@1 | 38 CVirtThread::~CVirtThread() |
rlm@1 | 39 { |
rlm@1 | 40 ExitEvent = true; |
rlm@1 | 41 if (StartEvent.IsCreated()) |
rlm@1 | 42 StartEvent.Set(); |
rlm@1 | 43 Thread.Wait(); |
rlm@1 | 44 } |
rlm@1 | 45 |