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.cpp62
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();
}
}