thread_os2.cpp
Go to the documentation of this file.00001
00002
00005 #include "stdafx.h"
00006 #include "thread.h"
00007
00008 #define INCL_DOS
00009 #include <os2.h>
00010 #include <process.h>
00011
00015 class ThreadObject_OS2 : public ThreadObject {
00016 private:
00017 TID thread;
00018 OTTDThreadFunc proc;
00019 void *param;
00020 bool self_destruct;
00021
00022 public:
00026 ThreadObject_OS2(OTTDThreadFunc proc, void *param, bool self_destruct) :
00027 thread(0),
00028 proc(proc),
00029 param(param),
00030 self_destruct(self_destruct)
00031 {
00032 thread = _beginthread(stThreadProc, NULL, 32768, this);
00033 }
00034
00035 bool Exit()
00036 {
00037 _endthread();
00038 return true;
00039 }
00040
00041 void Join()
00042 {
00043 DosWaitThread(&this->thread, DCWW_WAIT);
00044 this->thread = 0;
00045 }
00046 private:
00051 static void stThreadProc(void *thr)
00052 {
00053 ((ThreadObject_OS2 *)thr)->ThreadProc();
00054 }
00055
00060 void ThreadProc()
00061 {
00062
00063 try {
00064 this->proc(this->param);
00065 } catch (OTTDThreadExitSignal e) {
00066 } catch (...) {
00067 NOT_REACHED();
00068 }
00069
00070 if (self_destruct) {
00071 this->Exit();
00072 delete this;
00073 }
00074 }
00075 };
00076
00077 bool ThreadObject::New(OTTDThreadFunc proc, void *param, ThreadObject **thread)
00078 {
00079 ThreadObject *to = new ThreadObject_OS2(proc, param, thread == NULL);
00080 if (thread != NULL) *thread = to;
00081 return true;
00082 }
00083
00087 class ThreadMutex_OS2 : public ThreadMutex {
00088 private:
00089 HMTX mutex;
00090
00091 public:
00092 ThreadMutex_OS2()
00093 {
00094 DosCreateMutexSem(NULL, &mutex, 0, FALSE);
00095 }
00096
00097 ~ThreadMutex_OS2()
00098 {
00099 DosCloseMutexSem(mutex);
00100 }
00101
00102 void BeginCritical()
00103 {
00104 DosRequestMutexSem(mutex, (unsigned long) SEM_INDEFINITE_WAIT);
00105 }
00106
00107 void EndCritical()
00108 {
00109 DosReleaseMutexSem(mutex);
00110 }
00111 };
00112
00113 ThreadMutex *ThreadMutex::New()
00114 {
00115 return new ThreadMutex_OS2();
00116 }