]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/threadengines/threadengine_win32.cpp
792445b3e5fcbfd85db8da645e96662eae2b44ae
[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         Mutex(true);
26         HANDLE* MyThread = new HANDLE;
27         DWORD ThreadId = 0;
28
29         if (!(*MyThread = CreateThread(NULL,0,Win32ThreadEngine::Entry,this,0,&ThreadId)))
30         {
31                 delete MyThread;
32                 Mutex(false);
33                 throw CoreException(std::string("Unable to reate new Win32ThreadEngine: ") + dlerror());
34         }
35
36         NewThread = thread_to_init;
37         NewThread->Creator = this;
38         NewThread->Extend("winthread", MyThread);
39         Mutex(false);
40 }
41
42 Win32ThreadEngine::~Win32ThreadEngine()
43 {
44 }
45
46 void Win32ThreadEngine::Run()
47 {
48         NewThread->Run();
49 }
50
51 bool Win32ThreadEngine::Mutex(bool enable)
52 {
53         if (enable)
54                 EnterCriticalSection(&MyMutex);
55         else
56                 LeaveCriticalSection(&MyMutex);
57
58         return false;
59 }
60
61 DWORD WINAPI Win32ThreadEngine::Entry(void* parameter)
62 {
63         ThreadEngine * pt = (ThreadEngine*)parameter;
64         pt->Run();
65         return 0;
66 }
67
68 void Win32ThreadEngine::FreeThread(Thread* thread)
69 {
70         HANDLE* winthread = NULL;
71         if (thread->GetExt("winthread", winthread))
72         {
73                 thread->SetExitFlag();
74                 WaitForSingleObject(*winthread,INFINITE);
75                 delete winthread;
76         }
77 }
78