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