diff options
author | Benoit Foucher <benoit@zeroc.com> | 2014-10-15 08:20:15 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2014-10-15 08:20:15 +0200 |
commit | 4c6a4a6e77eeb513e2031912698a1fa839d9065a (patch) | |
tree | fdfad1d1dceb1fcc614da334b7058efc99925703 /cpp/src/Ice/Selector.cpp | |
parent | ICE-5739 missing AMD test in c++ optional (diff) | |
download | ice-4c6a4a6e77eeb513e2031912698a1fa839d9065a.tar.bz2 ice-4c6a4a6e77eeb513e2031912698a1fa839d9065a.tar.xz ice-4c6a4a6e77eeb513e2031912698a1fa839d9065a.zip |
Fixed ICE-5454: close acceptor on adapter deactivation
Diffstat (limited to 'cpp/src/Ice/Selector.cpp')
-rw-r--r-- | cpp/src/Ice/Selector.cpp | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/cpp/src/Ice/Selector.cpp b/cpp/src/Ice/Selector.cpp index e7cc3e1bfc7..ef36a25c71f 100644 --- a/cpp/src/Ice/Selector.cpp +++ b/cpp/src/Ice/Selector.cpp @@ -173,7 +173,7 @@ Selector::update(EventHandler* handler, SocketOperation remove, SocketOperation } void -Selector::finish(EventHandler* handler) +Selector::finish(IceInternal::EventHandler* handler) { handler->_registered = SocketOperationNone; handler->__decRef(); @@ -414,13 +414,30 @@ Selector::disable(EventHandler* handler, SocketOperation status) } } -void -Selector::finish(EventHandler* handler) +bool +Selector::finish(EventHandler* handler, bool closeNow) { if(handler->_registered) { - update(handler, handler->_registered, SocketOperationNone); + if(closeNow) + { + // + // Don't bother to un-register if the call wants to close + // the FD now, kqueue/epoll will automatically unregister + // the FD when it's closed. + // + handler->_registered = SocketOperationNone; + } + else + { + // + // If close on finish is requested, we can safely + // unregister the FD from the selector. + // + update(handler, handler->_registered, SocketOperationNone); + } } + return closeNow; } #if defined(ICE_USE_KQUEUE) @@ -603,13 +620,15 @@ Selector::disable(EventHandler* handler, SocketOperation status) } } -void -Selector::finish(EventHandler* handler) +bool +Selector::finish(EventHandler* handler, bool closeNow) { if(handler->_registered) { update(handler, handler->_registered, SocketOperationNone); + return false; // Don't close now if selecting. } + return closeNow; } void @@ -798,7 +817,7 @@ Selector::updateImpl(EventHandler* handler) if(interrupted()) { continue; - } + } Ice::SocketException ex(__FILE__, __LINE__); ex.error = IceInternal::getSocketErrno(); |