]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/threadengines/threadengine_win32.cpp
Change the function name because gcc is dumb :/
[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
37         NewThread = thread_to_init;
38         NewThread->Creator = this;
39         NewThread->Extend("winthread", MyThread);
40         Mutex(false);
41
42         while (NewThread)
43                 SleepEx(100, false);
44 }
45
46 Win32ThreadEngine::~Win32ThreadEngine()
47 {
48         DeleteCriticalSection(&MyMutex);
49 }
50
51 void Win32ThreadEngine::Run()
52 {
53         Mutex(true);
54         Thread* nt = NewThread;
55         NewThread = NULL;
56         Mutex(false);
57         nt->Run();
58 }
59
60 bool Win32ThreadEngine::Mutex(bool enable)
61 {
62         if (enable)
63                 EnterCriticalSection(&MyMutex);
64         else
65                 LeaveCriticalSection(&MyMutex);
66
67         return false;
68 }
69
70 DWORD WINAPI Win32ThreadEngine::Entry(void* parameter)
71 {
72         ThreadEngine * pt = (ThreadEngine*)parameter;
73         pt->Run();
74         return 0;
75 }
76
77 void Win32ThreadEngine::FreeThread(Thread* thread)
78 {
79         HANDLE* winthread = NULL;
80         if (thread->GetExt("winthread", winthread))
81         {
82                 thread->SetExitFlag();
83                 WaitForSingleObject(*winthread,INFINITE);
84                 delete winthread;
85         }
86 }
87