From 0ce519e355b3b2f271439aeac0064db11a06c77b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 10 Oct 2008 16:10:57 +0200 Subject: Interrupt-Funktion implementiert --- src/Net/Connection.cpp | 1 - src/Net/FdManager.cpp | 28 +++++++++++++++++++++++++--- src/Net/FdManager.h | 7 +++++-- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/Net/Connection.cpp b/src/Net/Connection.cpp index 72f9848..5454dcf 100644 --- a/src/Net/Connection.cpp +++ b/src/Net/Connection.cpp @@ -238,7 +238,6 @@ bool Connection::rawSend(const uint8_t *data, unsigned long length) { transS.push(trans); updateEvents(); - doSend(); // TODO !!! return true; } 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 +#include +#include + +#include 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() { diff --git a/src/Net/FdManager.h b/src/Net/FdManager.h index f6a528f..1308a79 100644 --- a/src/Net/FdManager.h +++ b/src/Net/FdManager.h @@ -34,6 +34,11 @@ class FdManager { std::map pollfds; std::map > handlers; + int interruptPipe[2]; + + void readInterrupt(); + void interrupt(); + FdManager(); public: @@ -47,8 +52,6 @@ class FdManager { bool setFdEvents(int fd, short events); short getFdEvents(int fd) const; - void interrupt(); - void run(); }; -- cgit v1.2.3