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