X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fthreadengines%2Fthreadengine_pthread.cpp;h=4054766deae87e31eda8e6644d68a95bc511c0aa;hb=4498f1abd163b140efcbbd9e75173665c9b1c29f;hp=5aef0f2477f343916a2e203c5617ad9db3c3bec0;hpb=59dbcc1245468218ec7e2372b2678351382a34f0;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/threadengines/threadengine_pthread.cpp b/src/threadengines/threadengine_pthread.cpp index 5aef0f247..4054766de 100644 --- a/src/threadengines/threadengine_pthread.cpp +++ b/src/threadengines/threadengine_pthread.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * InspIRCd: (C) 2002-2010 InspIRCd Development Team * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see @@ -15,8 +15,9 @@ #include "threadengines/threadengine_pthread.h" #include #include +#include -ThreadEngine::ThreadEngine(InspIRCd* Instance) +ThreadEngine::ThreadEngine() { } @@ -28,7 +29,7 @@ static void* entry_point(void* parameter) sigaddset(&set, SIGPIPE); pthread_sigmask(SIG_BLOCK, &set, NULL); - Thread* pt = reinterpret_cast(parameter); + Thread* pt = static_cast(parameter); pt->Run(); return parameter; } @@ -57,19 +58,14 @@ void ThreadData::FreeThread(Thread* thread) pthread_join(pthread_id, NULL); } -#if 0 -/* TODO this is a linux-specific syscall that allows signals to be - * sent using a single file descriptor, rather than 2 for a pipe. - * Requires glibc 2.8, kernel 2.6.22+ - */ +#ifdef HAS_EVENTFD #include class ThreadSignalSocket : public BufferedSocket { SocketThread* parent; public: - ThreadSignalSocket(SocketThread* p, InspIRCd* SI, int newfd) : - BufferedSocket(SI, newfd, const_cast("0.0.0.0")), parent(p) {} + ThreadSignalSocket(SocketThread* p, int newfd) : BufferedSocket(newfd), parent(p) {} ~ThreadSignalSocket() { @@ -80,22 +76,24 @@ class ThreadSignalSocket : public BufferedSocket eventfd_write(fd, 1); } - virtual bool OnDataReady() + void OnDataReady() { - eventfd_t data; - if (eventfd_read(fd, &data)) - return false; + recvq.clear(); parent->OnNotify(); - return true; + } + + void OnError(BufferedSocketError) + { + ServerInstance->GlobalCulls.AddItem(this); } }; -SocketThread::SocketThread(InspIRCd* SI) +SocketThread::SocketThread() { - int fd = eventfd(0, 0); // TODO nonblock + int fd = eventfd(0, O_NONBLOCK); if (fd < 0) throw new CoreException("Could not create pipe " + std::string(strerror(errno))); - signal.sock = new ThreadSignalSocket(this, SI, fd); + signal.sock = new ThreadSignalSocket(this, fd); } #else @@ -104,8 +102,8 @@ class ThreadSignalSocket : public BufferedSocket SocketThread* parent; int send_fd; public: - ThreadSignalSocket(SocketThread* p, InspIRCd* SI, int recvfd, int sendfd) : - BufferedSocket(SI, recvfd, const_cast("0.0.0.0")), parent(p), send_fd(sendfd) {} + ThreadSignalSocket(SocketThread* p, int recvfd, int sendfd) : + BufferedSocket(recvfd), parent(p), send_fd(sendfd) {} ~ThreadSignalSocket() { @@ -115,25 +113,27 @@ class ThreadSignalSocket : public BufferedSocket void Notify() { char dummy = '*'; - send(send_fd, &dummy, 1, 0); + write(send_fd, &dummy, 1); } - virtual bool OnDataReady() + void OnDataReady() { - char data; - if (ServerInstance->SE->Recv(this, &data, 1, 0) <= 0) - return false; + recvq.clear(); parent->OnNotify(); - return true; + } + + void OnError(BufferedSocketError) + { + ServerInstance->GlobalCulls.AddItem(this); } }; -SocketThread::SocketThread(InspIRCd* SI) +SocketThread::SocketThread() { int fds[2]; if (pipe(fds)) throw new CoreException("Could not create pipe " + std::string(strerror(errno))); - signal.sock = new ThreadSignalSocket(this, SI, fds[0], fds[1]); + signal.sock = new ThreadSignalSocket(this, fds[0], fds[1]); } #endif @@ -144,5 +144,4 @@ void SocketThread::NotifyParent() SocketThread::~SocketThread() { - delete signal.sock; }