aboutsummaryrefslogtreecommitdiff
path: root/dep/acelite/ace/Connector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dep/acelite/ace/Connector.cpp')
-rw-r--r--dep/acelite/ace/Connector.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/dep/acelite/ace/Connector.cpp b/dep/acelite/ace/Connector.cpp
index 820ca875c16..3a1edfc881a 100644
--- a/dep/acelite/ace/Connector.cpp
+++ b/dep/acelite/ace/Connector.cpp
@@ -1,4 +1,4 @@
-// $Id: Connector.cpp 89510 2010-03-17 12:21:14Z vzykov $
+// $Id: Connector.cpp 91527 2010-08-27 15:03:31Z shuston $
#ifndef ACE_CONNECTOR_CPP
#define ACE_CONNECTOR_CPP
@@ -121,9 +121,9 @@ ACE_NonBlocking_Connect_Handler<SVC_HANDLER>::close (SVC_HANDLER *&sh)
return false;
// Remove from Reactor.
- if (this->reactor ()->remove_handler (
+ if (-1 == this->reactor ()->remove_handler (
h,
- ACE_Event_Handler::ALL_EVENTS_MASK) == -1)
+ ACE_Event_Handler::ALL_EVENTS_MASK | ACE_Event_Handler::DONT_CALL))
return false;
}
@@ -174,6 +174,20 @@ ACE_NonBlocking_Connect_Handler<SVC_HANDLER>::handle_input (ACE_HANDLE)
}
template <class SVC_HANDLER> int
+ACE_NonBlocking_Connect_Handler<SVC_HANDLER>::handle_close (ACE_HANDLE handle,
+ ACE_Reactor_Mask m)
+{
+ // epoll on Linux will, at least sometimes, return EPOLLERR when a connect
+ // fails, triggering a total removal from the reactor. This is different from
+ // select()-based systems which select the fd for read on a connect failure.
+ // So just call handle_input() to rejoin common handling for a failed
+ // connect.
+ if (m == ACE_Event_Handler::ALL_EVENTS_MASK)
+ return this->handle_input (handle);
+ return -1;
+}
+
+template <class SVC_HANDLER> int
ACE_NonBlocking_Connect_Handler<SVC_HANDLER>::handle_output (ACE_HANDLE handle)
{
// Called when a connection is establishment asynchronous.