]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/threadengines/threadengine_win32.cpp
Remove useless vector copy
[user/henk/code/inspircd.git] / src / threadengines / threadengine_win32.cpp
index 6ebd6a10ab36a104ed199e4ad9f0bf6afcf3eaf1..4bac4f5dce513834b4c101428a390720806f4785 100644 (file)
@@ -18,7 +18,7 @@ ThreadEngine::ThreadEngine(InspIRCd* Instance)
 {
 }
 
-void ThreadEngine::Create(Thread* thread)
+void ThreadEngine::Start(Thread* thread)
 {
        ThreadData* data = new ThreadData;
        thread->state = data;
@@ -40,7 +40,7 @@ ThreadEngine::~ThreadEngine()
 
 DWORD WINAPI ThreadEngine::Entry(void* parameter)
 {
-       Thread* pt = reinterpret_cast<Thread*>(parameter);
+       Thread* pt = static_cast<Thread*>(parameter);
        pt->Run();
        return 0;
 }
@@ -51,3 +51,87 @@ void ThreadData::FreeThread(Thread* thread)
        WaitForSingleObject(handle,INFINITE);
 }
 
+class ThreadSignalSocket : public BufferedSocket
+{
+       SocketThread* parent;
+ public:
+       ThreadSignalSocket(SocketThread* t, InspIRCd* SI, int newfd, const char* ip)
+               : BufferedSocket(SI, newfd, ip), parent(t)
+       {
+       }
+       
+       virtual bool OnDataReady()
+       {
+               char data = 0;
+               if (ServerInstance->SE->Recv(this, &data, 1, 0) > 0)
+               {
+                       parent->OnNotify();
+                       return true;
+               }
+               return false;
+       }
+};
+
+class ThreadSignalListener : public ListenSocketBase
+{
+       SocketThread* parent;
+       sockaddr_in sock_us;
+ public:
+       ThreadSignalListener(SocketThread* t, InspIRCd* Instance, int port, const std::string &addr) : ListenSocketBase(Instance, port, addr), parent(t)
+       {
+               socklen_t uslen = sizeof(sock_us);
+               if (getsockname(this->fd,(sockaddr*)&sock_us,&uslen))
+               {
+                       throw ModuleException("Could not getsockname() to find out port number for ITC port");
+               }
+       }
+
+       virtual void OnAcceptReady(int nfd)
+       {
+               new ThreadSignalSocket(parent, ServerInstance, nfd, "");
+               ServerInstance->SE->DelFd(this);
+       }
+/* Using getsockname and ntohs, we can determine which port number we were allocated */
+       int GetPort()
+       {
+               return ntohs(sock_us.sin_port);
+       }
+};
+
+SocketThread::SocketThread(InspIRCd* SI)
+{
+       ThreadSignalListener* listener = new ThreadSignalListener(this, SI, 0, "127.0.0.1");
+       if (listener->GetFd() == -1)
+               throw CoreException("Could not create ITC pipe");
+       int connFD = socket(AF_INET, SOCK_STREAM, 0);
+       if (connFD == -1)
+               throw CoreException("Could not create ITC pipe");
+       
+       struct sockaddr_in addr;
+       inet_aton("127.0.0.1", &addr.sin_addr);
+       addr.sin_family = AF_INET;
+       addr.sin_port = htons(listener->GetPort());
+
+       if (connect(connFD, reinterpret_cast<struct sockaddr*>(&addr), sizeof(addr)) == -1)
+       {
+               SI->SE->DelFd(listener);
+               closesocket(connFD);
+               throw CoreException("Could not connet to ITC pipe");
+       }
+       this->signal.connFD = connFD;
+}
+
+void SocketThread::NotifyParent()
+{
+       char dummy = '*';
+       send(signal.connFD, &dummy, 1, 0);
+}
+
+SocketThread::~SocketThread()
+{
+       if (signal.connFD >= 0)
+       {
+               shutdown(signal.connFD, 2);
+               closesocket(signal.connFD);
+       }
+}