1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS HTTP Daemon
4 * FILE: thread.cpp
5 * PURPOSE: Generic thread class
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * REVISIONS:
8 * CSH 01/09/2000 Created
9 */
10 #include <debug.h>
11 #include <assert.h>
12 #include <windows.h>
13 #include <thread.h>
14
15 // This is the thread entry code
ThreadEntry(LPVOID parameter)16 DWORD WINAPI ThreadEntry(LPVOID parameter)
17 {
18 ThreadData *p = (ThreadData*) parameter;
19
20 p->ClassPtr->Execute();
21
22 SetEvent(p->hFinished);
23 return 0;
24 }
25
26 // Default constructor
CThread()27 CThread::CThread()
28 {
29 bTerminated = FALSE;
30 // Points to the class that is executed within thread
31 Data.ClassPtr = this;
32 // Create synchronization event
33 Data.hFinished = CreateEvent(NULL, TRUE, FALSE, NULL);
34
35 // FIXME: Do some error handling
36 assert(Data.hFinished != NULL);
37
38 // Create thread
39 hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadEntry, &Data, 0, &dwThreadId);
40
41 // FIXME: Do some error handling
42 assert(hThread != NULL);
43 }
44
45 // Default destructor
~CThread()46 CThread::~CThread()
47 {
48 if ((hThread != NULL) && (Data.hFinished != NULL)) {
49 if (!bTerminated)
50 Terminate();
51 WaitForSingleObject(Data.hFinished, INFINITE);
52 CloseHandle(Data.hFinished);
53 CloseHandle(hThread);
54 hThread = NULL;
55 }
56 }
57
58 // Execute thread code
Execute()59 void CThread::Execute()
60 {
61 while (!bTerminated) Sleep(0);
62 }
63
64 // Post a message to the thread's message queue
PostMessage(UINT Msg,WPARAM wParam,LPARAM lParam)65 BOOL CThread::PostMessage(UINT Msg, WPARAM wParam, LPARAM lParam)
66 {
67 return PostThreadMessage(dwThreadId, Msg, wParam, lParam);
68 }
69
70 // Gracefully terminate thread
Terminate()71 void CThread::Terminate()
72 {
73 bTerminated = TRUE;
74 }
75
76 // Returns TRUE if thread is terminated, FALSE if not
Terminated()77 BOOL CThread::Terminated()
78 {
79 return bTerminated;
80 }
81