summaryrefslogtreecommitdiff
path: root/TAO/tao/Transport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/Transport.cpp')
-rw-r--r--TAO/tao/Transport.cpp74
1 files changed, 70 insertions, 4 deletions
diff --git a/TAO/tao/Transport.cpp b/TAO/tao/Transport.cpp
index a0978632a82..ce7224a2287 100644
--- a/TAO/tao/Transport.cpp
+++ b/TAO/tao/Transport.cpp
@@ -387,6 +387,14 @@ TAO_Transport::register_handler (void)
return 0;
}
+ if (TAO_debug_level > 6)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - Transport[%d]::register_handler - ")
+ ACE_TEXT ("registering event handler with reactor\n"),
+ this->id ()));
+ }
+
// Set the flag in the Connection Handler and in the Wait Strategy
// @@Maybe we should set these flags after registering with the
// reactor. What if the registration fails???
@@ -397,6 +405,64 @@ TAO_Transport::register_handler (void)
ACE_Event_Handler::READ_MASK);
}
+int
+TAO_Transport::remove_handler (void)
+{
+ if (TAO_debug_level > 4)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - Transport[%d]::remove_handler\n"),
+ this->id ()));
+ }
+
+ ACE_Reactor * const r = this->orb_core_->reactor ();
+
+ // @@note: This should be okay since the remove handler call will
+ // not make a nested call into the transport.
+ ACE_GUARD_RETURN (ACE_Lock,
+ ace_mon,
+ *this->handler_lock_,
+ false);
+
+
+ if (this->event_handler_i ()->reactor () == 0)
+ {
+ return 0;
+ }
+
+ if (TAO_debug_level > 6)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - Transport[%d]::remove_handler - ")
+ ACE_TEXT ("removing event handler from reactor\n"),
+ this->id ()));
+ }
+
+ // Set the flag in the Wait Strategy
+ this->ws_->is_registered (false);
+
+ // Remove the handler from the reactor
+ if (r->remove_handler (this->event_handler_i (),
+ ACE_Event_Handler::READ_MASK|
+ ACE_Event_Handler::DONT_CALL) == -1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) - Transport[%d]::remove_handler - ")
+ ACE_TEXT ("reactor->remove_handler failed\n"),
+ this->id ()));
+ return -1;
+ }
+ else
+ {
+ // reset the reactor property of the event handler or
+ // Transport::register_handler() will not re-register
+ // when called after us again.
+ this->event_handler_i ()->reactor (0);
+ return 0;
+ }
+}
+
#if TAO_HAS_SENDFILE == 1
ssize_t
TAO_Transport::sendfile (TAO_MMAP_Allocator * /* allocator */,
@@ -1317,17 +1383,17 @@ TAO_Transport::send_message_shared_i (TAO_Stub *stub,
size_t const message_length = message_block->length ();
#endif /* TAO_HAS_TRANSPORT_CURRENT == 1 */
- switch (message_semantics)
+ switch (message_semantics.type_)
{
- case TAO_TWOWAY_REQUEST:
+ case TAO_Message_Semantics::TAO_TWOWAY_REQUEST:
ret = this->send_synchronous_message_i (message_block, max_wait_time);
break;
- case TAO_REPLY:
+ case TAO_Message_Semantics::TAO_REPLY:
ret = this->send_reply_message_i (message_block, max_wait_time);
break;
- case TAO_ONEWAY_REQUEST:
+ case TAO_Message_Semantics::TAO_ONEWAY_REQUEST:
ret = this->send_asynchronous_message_i (stub,
message_block,
max_wait_time);