]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/threadengines/threadengine_win32.cpp
025fcad9bb3aedb0d24e26b9a297a25463e8ac41
[user/henk/code/inspircd.git] / src / threadengines / threadengine_win32.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2008 InspIRCd Development Team
6  * See: http://www.inspircd.org/wiki/index.php/Credits
7  *
8  * This program is free but copyrighted software; see
9  *          the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 #include "inspircd.h"
15 #include "threadengines/threadengine_win32.h"
16
17 CRITICAL_SECTION MyMutex;
18
19 Win32ThreadEngine::Win32ThreadEngine(InspIRCd* Instance) : ThreadEngine(Instance)
20 {
21 }
22
23 void Win32ThreadEngine::Create(Thread* thread_to_init)
24 {
25         HANDLE* MyThread = new HANDLE;
26         DWORD ThreadId = 0;
27
28         if (!(*MyThread = CreateThread(NULL,0,Win32ThreadEngine::Entry,this,0,&ThreadId)))
29         {
30                 delete MyThread;
31                 throw CoreException(std::string("Unable to reate new Win32ThreadEngine: ") + dlerror());
32         }
33
34         NewThread = thread_to_init;
35         NewThread->Creator = this;
36         NewThread->Extend("winthread", MyThread);
37 }
38
39 Win32ThreadEngine::~Win32ThreadEngine()
40 {
41 }
42
43 void Win32ThreadEngine::Run()
44 {
45         NewThread->Run();
46 }
47
48 bool Win32ThreadEngine::Mutex(bool enable)
49 {
50         if (enable)
51                 EnterCriticalSection(&MyMutex);
52         else
53                 LeaveCriticalSection(&MyMutex);
54
55         return false;
56 }
57
58 DWORD WINAPI Win32ThreadEngine::Entry(void* parameter)
59 {
60         ThreadEngine * pt = (ThreadEngine*)parameter;
61         pt->Run();
62         return 0;
63 }
64
65 void Win32ThreadEngine::FreeThread(Thread* thread)
66 {
67         HANDLE* winthread = NULL;
68         if (thread->GetExt("winthread", winthread))
69         {
70                 thread->SetExitFlag();
71                 int rc;
72                 void* status;
73                 WaitForSingleObject(*winthread,INFINITE);
74                 delete winthread;
75         }
76 }
77