diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2009-05-17 01:34:10 +0200 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2009-05-17 01:34:10 +0200 |
commit | a3e566c4d3631076e29f3651554603184b6351a7 (patch) | |
tree | 71effee59fd4364174f7a845204f946dbc18ff2a /src/Net/FdManager.cpp | |
parent | c8d469cc3de8ef2fb95f7b47355ebf5318a4c22f (diff) | |
download | mad-a3e566c4d3631076e29f3651554603184b6351a7.tar mad-a3e566c4d3631076e29f3651554603184b6351a7.zip |
Gnulib durch boost ersetzt
Diffstat (limited to 'src/Net/FdManager.cpp')
-rw-r--r-- | src/Net/FdManager.cpp | 62 |
1 files changed, 23 insertions, 39 deletions
diff --git a/src/Net/FdManager.cpp b/src/Net/FdManager.cpp index 499ad62..c7abe73 100644 --- a/src/Net/FdManager.cpp +++ b/src/Net/FdManager.cpp @@ -35,10 +35,6 @@ FdManager FdManager::fdManager; FdManager::FdManager() : running(false) { - gl_rwlock_init(handlerLock); - gl_rwlock_init(eventLock); - gl_rwlock_init(runLock); - pipe(interruptPipe); int flags = fcntl(interruptPipe[0], F_GETFL, 0); @@ -55,23 +51,19 @@ FdManager::~FdManager() { close(interruptPipe[0]); close(interruptPipe[1]); - - gl_rwlock_destroy(runLock); - gl_rwlock_destroy(eventLock); - gl_rwlock_destroy(handlerLock); } bool FdManager::registerFd(int fd, const sigc::slot<void, short> &handler, short events) { struct pollfd pollfd = {fd, events, 0}; - gl_rwlock_wrlock(handlerLock); - gl_rwlock_wrlock(eventLock); + boost::lock(handlerLock, eventLock); pollfds.insert(std::make_pair(fd, pollfd)); bool ret = handlers.insert(std::make_pair(fd, handler)).second; - gl_rwlock_unlock(eventLock); - gl_rwlock_unlock(handlerLock); + + eventLock.unlock(); + handlerLock.unlock(); interrupt(); @@ -79,12 +71,11 @@ bool FdManager::registerFd(int fd, const sigc::slot<void, short> &handler, short } bool FdManager::unregisterFd(int fd) { - gl_rwlock_wrlock(handlerLock); - gl_rwlock_wrlock(eventLock); + boost::lock(handlerLock, eventLock); pollfds.erase(fd); bool ret = handlers.erase(fd); - gl_rwlock_unlock(eventLock); - gl_rwlock_unlock(handlerLock); + eventLock.unlock(); + handlerLock.unlock(); interrupt(); @@ -92,36 +83,30 @@ bool FdManager::unregisterFd(int fd) { } bool FdManager::setFdEvents(int fd, short events) { - gl_rwlock_wrlock(eventLock); + boost::unique_lock<boost::shared_mutex> lock(eventLock); + std::map<int, struct pollfd>::iterator pollfd = pollfds.find(fd); - if(pollfd == pollfds.end()) { - gl_rwlock_unlock(eventLock); + if(pollfd == pollfds.end()) return false; - } if(pollfd->second.events != events) { pollfd->second.events = events; interrupt(); } - gl_rwlock_unlock(eventLock); - return true; } short FdManager::getFdEvents(int fd) { - gl_rwlock_rdlock(eventLock); + boost::shared_lock<boost::shared_mutex> lock(eventLock); std::map<int, struct pollfd>::const_iterator pollfd = pollfds.find(fd); if(pollfd == pollfds.end()) return -1; - short ret = pollfd->second.events; - gl_rwlock_unlock(eventLock); - - return ret; + return pollfd->second.events; } void FdManager::readInterrupt() { @@ -137,16 +122,15 @@ void FdManager::interrupt() { } void FdManager::ioThread() { - gl_rwlock_wrlock(runLock); + runLock.lock(); running = true; - gl_rwlock_unlock(runLock); + runLock.unlock_and_lock_shared(); - gl_rwlock_rdlock(runLock); while(running) { - gl_rwlock_unlock(runLock); + runLock.unlock_shared(); - gl_rwlock_rdlock(handlerLock); - gl_rwlock_rdlock(eventLock); + handlerLock.lock_shared(); + eventLock.lock_shared(); readInterrupt(); size_t count = pollfds.size(); @@ -159,11 +143,11 @@ void FdManager::ioThread() { ++pollfd; } - gl_rwlock_unlock(eventLock); - gl_rwlock_unlock(handlerLock); + eventLock.unlock_shared(); + handlerLock.unlock_shared(); if(poll(fdarray, count, -1) > 0) { - gl_rwlock_rdlock(handlerLock); + handlerLock.lock_shared(); std::queue<sigc::slot<void> > calls; @@ -172,7 +156,7 @@ void FdManager::ioThread() { calls.push(sigc::bind(handlers[fdarray[n].fd], fdarray[n].revents)); } - gl_rwlock_unlock(handlerLock); + handlerLock.unlock_shared(); while(!calls.empty()) { calls.front()(); @@ -183,10 +167,10 @@ void FdManager::ioThread() { delete [] fdarray; - gl_rwlock_rdlock(runLock); + runLock.lock_shared(); } - gl_rwlock_unlock(runLock); + runLock.unlock_shared(); } } |