diff options
author | Marc Laukien <marc@zeroc.com> | 2001-12-10 20:50:09 +0000 |
---|---|---|
committer | Marc Laukien <marc@zeroc.com> | 2001-12-10 20:50:09 +0000 |
commit | e392f0d3834ec78954fd4d614f595f76a88f1fbe (patch) | |
tree | 3bd8ee5549e4a1192da6124c178beb696288c5bd /cpp/src/Ice/ThreadPool.cpp | |
parent | Fix Makefile bug. (diff) | |
download | ice-e392f0d3834ec78954fd4d614f595f76a88f1fbe.tar.bz2 ice-e392f0d3834ec78954fd4d614f595f76a88f1fbe.tar.xz ice-e392f0d3834ec78954fd4d614f595f76a88f1fbe.zip |
fixes
Diffstat (limited to 'cpp/src/Ice/ThreadPool.cpp')
-rw-r--r-- | cpp/src/Ice/ThreadPool.cpp | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/cpp/src/Ice/ThreadPool.cpp b/cpp/src/Ice/ThreadPool.cpp index a5cd8a6de34..8fc3aa78bb2 100644 --- a/cpp/src/Ice/ThreadPool.cpp +++ b/cpp/src/Ice/ThreadPool.cpp @@ -39,10 +39,10 @@ IceInternal::ThreadPool::_register(SOCKET fd, const EventHandlerPtr& handler) } void -IceInternal::ThreadPool::unregister(SOCKET fd) +IceInternal::ThreadPool::unregister(SOCKET fd, bool callFinished) { JTCSyncT<JTCMonitorT<JTCMutex> > sync(*this); - _removes.push_back(fd); + _removes.push_back(make_pair(fd, callFinished)); setInterrupt(); } @@ -328,12 +328,15 @@ IceInternal::ThreadPool::run() // // Handlers are permanently removed. // - for (vector<SOCKET>::iterator p = _removes.begin(); p != _removes.end(); ++p) + for (vector<pair<SOCKET, bool> >::iterator p = _removes.begin(); p != _removes.end(); ++p) { - map<SOCKET, EventHandlerPtr>::iterator q = _handlerMap.find(*p); + map<SOCKET, EventHandlerPtr>::iterator q = _handlerMap.find(p->first); assert(q != _handlerMap.end()); - FD_CLR(*p, &_fdSet); - q->second->finished(); + FD_CLR(p->first, &_fdSet); + if (p->second) // Call finished() on the handler? + { + q->second->finished(); + } if (q->second->server()) { --_servers; @@ -352,6 +355,13 @@ IceInternal::ThreadPool::run() { notifyAll(); // For waitUntil...Finished() methods. } + + // + // Selected filedescriptors may have changed, I + // therefore need to repeat the select(). + // + shutdown = clearInterrupt(); + goto repeatSelect; } // |