diff options
Diffstat (limited to 'src/Net/FdManager.cpp')
-rw-r--r-- | src/Net/FdManager.cpp | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/Net/FdManager.cpp b/src/Net/FdManager.cpp index aab634d..f58a32e 100644 --- a/src/Net/FdManager.cpp +++ b/src/Net/FdManager.cpp @@ -19,6 +19,10 @@ #include "FdManager.h" #include <signal.h> +#include <unistd.h> +#include <sys/fcntl.h> + +#include <sigc++/hide.h> namespace Mad { @@ -28,12 +32,22 @@ FdManager FdManager::fdManager; FdManager::FdManager() { - // TODO Auto-generated constructor stub + pipe(interruptPipe); + + int flags = fcntl(interruptPipe[0], F_GETFL, 0); + fcntl(interruptPipe[0], F_SETFL, flags | O_NONBLOCK); + flags = fcntl(interruptPipe[1], F_GETFL, 0); + fcntl(interruptPipe[1], F_SETFL, flags | O_NONBLOCK); + + registerFd(interruptPipe[0], sigc::hide(sigc::mem_fun(this, &FdManager::readInterrupt)), POLLIN); } FdManager::~FdManager() { - // TODO Auto-generated destructor stub + unregisterFd(interruptPipe[0]); + + close(interruptPipe[0]); + close(interruptPipe[1]); } @@ -73,8 +87,16 @@ short FdManager::getFdEvents(int fd) const { return pollfd->second.events; } +void FdManager::readInterrupt() { + char buf[20]; + + while(read(interruptPipe[0], buf, sizeof(buf)) > 0) {} +} + void FdManager::interrupt() { - // TODO Implement this. + char buf = 0; + + write(interruptPipe[1], &buf, sizeof(buf)); } void FdManager::run() { |