summaryrefslogtreecommitdiffstats
path: root/src/Net/FdManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Net/FdManager.cpp')
-rw-r--r--src/Net/FdManager.cpp28
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() {