24 ClassImp(TWin32Thread);
30 Int_t TWin32Thread::Run(TThread *th)
33 HANDLE hHandle = CreateThread(0, 0,
34 (LPTHREAD_START_ROUTINE)&TThread::Function,
35 th, 0, (DWORD*)&dwThreadId);
37 ::CloseHandle(hHandle);
40 th->fHandle = (Long_t)hHandle;
44 return hHandle ? 0 : EINVAL;
51 Int_t TWin32Thread::Join(TThread *th,
void **ret)
53 DWORD R = WaitForSingleObject((HANDLE)th->fHandle, INFINITE);
55 if ( (R == WAIT_OBJECT_0) || (R == WAIT_ABANDONED) ) {
59 if ( R == WAIT_TIMEOUT )
67 Int_t TWin32Thread::Exit(
void *ret)
77 Int_t TWin32Thread::Kill(TThread *th)
79 if (TerminateThread((HANDLE)th->fHandle,0)) {
80 th->fState = TThread::kCanceledState;
88 Int_t TWin32Thread::CleanUpPush(
void **main,
void *free,
void *arg)
90 if (!free) fprintf(stderr,
"CleanUpPush ***ERROR*** Routine=0\n");
91 new TWin32ThreadCleanUp(main,free,arg);
97 Int_t TWin32Thread::CleanUpPop(
void **main,Int_t exe)
100 TWin32ThreadCleanUp *l = (TWin32ThreadCleanUp*)(*main);
101 if (!l->fRoutine) fprintf(stderr,
"CleanUpPop ***ERROR*** Routine=0\n");
102 if (exe && l->fRoutine) ((void (*)(
void*))(l->fRoutine))(l->fArgument);
103 *main = l->fNext;
delete l;
109 Int_t TWin32Thread::CleanUp(
void **main)
111 fprintf(stderr,
" CleanUp %lx\n",(ULong_t)*main);
112 while(!CleanUpPop(main,1)) { }
119 Long_t TWin32Thread::SelfId()
121 return (Long_t)::GetCurrentThreadId();
126 Int_t TWin32Thread::SetCancelOff()
129 Warning(
"SetCancelOff",
"Not implemented on Win32");
135 Int_t TWin32Thread::SetCancelOn()
138 Warning(
"SetCancelOn",
"Not implemented on Win32");
144 Int_t TWin32Thread::SetCancelAsynchronous()
147 Warning(
"SetCancelAsynchronous",
"Not implemented on Win32");
153 Int_t TWin32Thread::SetCancelDeferred()
156 Warning(
"SetCancelDeferred",
"Not implemented on Win32");
162 Int_t TWin32Thread::CancelPoint()
165 Warning(
"CancelPoint",
"Not implemented on Win32");
175 TWin32ThreadCleanUp::TWin32ThreadCleanUp(
void **main,
void *routine,
void *arg)
177 fNext = (TWin32ThreadCleanUp*)*main;
178 fRoutine = routine; fArgument = arg;