2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
5 * Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc>
7 * This file is part of InspIRCd. InspIRCd is free software: you can
8 * redistribute it and/or modify it under the terms of the GNU General Public
9 * License as published by the Free Software Foundation, version 2.
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "threadengines/threadengine_win32.h"
24 ThreadEngine::ThreadEngine()
28 void ThreadEngine::Start(Thread* thread)
30 ThreadData* data = new ThreadData;
34 data->handle = CreateThread(NULL,0,ThreadEngine::Entry,thread,0,&ThreadId);
36 if (data->handle == NULL)
38 DWORD lasterr = GetLastError();
41 std::string err = "Unable to create new thread: " + ConvToStr(lasterr);
42 SetLastError(ERROR_SUCCESS);
43 throw CoreException(err);
47 ThreadEngine::~ThreadEngine()
51 DWORD WINAPI ThreadEngine::Entry(void* parameter)
53 Thread* pt = static_cast<Thread*>(parameter);
58 void ThreadData::FreeThread(Thread* thread)
60 thread->SetExitFlag();
61 WaitForSingleObject(handle,INFINITE);
65 class ThreadSignalSocket : public BufferedSocket
69 ThreadSignalSocket(SocketThread* t, int newfd)
70 : BufferedSocket(newfd), parent(t)
80 void OnError(BufferedSocketError)
82 ServerInstance->GlobalCulls.AddItem(this);
86 SocketThread::SocketThread()
88 int listenFD = socket(AF_INET, SOCK_STREAM, 0);
90 throw CoreException("Could not create ITC pipe");
91 int connFD = socket(AF_INET, SOCK_STREAM, 0);
93 throw CoreException("Could not create ITC pipe");
95 if (!ServerInstance->BindSocket(listenFD, 0, "127.0.0.1", true))
96 throw CoreException("Could not create ITC pipe");
97 SocketEngine::NonBlocking(connFD);
99 struct sockaddr_in addr;
100 socklen_t sz = sizeof(addr);
101 getsockname(listenFD, reinterpret_cast<struct sockaddr*>(&addr), &sz);
102 connect(connFD, reinterpret_cast<struct sockaddr*>(&addr), sz);
103 SocketEngine::Blocking(listenFD);
104 int nfd = accept(listenFD, reinterpret_cast<struct sockaddr*>(&addr), &sz);
106 throw CoreException("Could not create ITC pipe");
107 new ThreadSignalSocket(this, nfd);
108 closesocket(listenFD);
110 SocketEngine::Blocking(connFD);
111 this->signal.connFD = connFD;
114 void SocketThread::NotifyParent()
117 send(signal.connFD, &dummy, 1, 0);
120 SocketThread::~SocketThread()
122 if (signal.connFD >= 0)
124 shutdown(signal.connFD, 2);
125 closesocket(signal.connFD);