summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/Selector.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2014-10-15 08:20:15 +0200
committerBenoit Foucher <benoit@zeroc.com>2014-10-15 08:20:15 +0200
commit4c6a4a6e77eeb513e2031912698a1fa839d9065a (patch)
treefdfad1d1dceb1fcc614da334b7058efc99925703 /cpp/src/Ice/Selector.cpp
parentICE-5739 missing AMD test in c++ optional (diff)
downloadice-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.cpp33
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();