diff options
author | irfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1999-02-20 04:07:34 +0000 |
---|---|---|
committer | irfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1999-02-20 04:07:34 +0000 |
commit | 592666592908800e0ab3ceb4dc18e73cc048d139 (patch) | |
tree | 484ece3821785852987bd8165960761f5324509d | |
parent | 3e956b7b38dbde7085c1e6d6010554911e34b0c7 (diff) | |
download | ATCD-592666592908800e0ab3ceb4dc18e73cc048d139.tar.gz |
*** empty log message ***
-rw-r--r-- | README | 1 | ||||
-rw-r--r-- | TAO/ChangeLog-99c | 14 | ||||
-rw-r--r-- | TAO/tao/Connect.cpp | 6 | ||||
-rw-r--r-- | TAO/tao/Invocation.cpp | 25 | ||||
-rw-r--r-- | TAO/tao/Invocation.h | 8 |
5 files changed, 46 insertions, 8 deletions
@@ -300,6 +300,7 @@ David Trumble <trumble@cvg.enet.dec.com> John Morey <jmorey@crl.com> George Reynolds <george@dvcorp.com> Hans Rohnert <hans.rohnert@mchp.siemens.de> +Hans Horsmann <Hans.Horsmann@icn.siemens.de> Alex V. Maclinovsky <alexm@teltrunk1.tait.co.nz> Todd Blanchard <tblancha@evolving.com> Rob Clairmont <rclairmo@bnr.ca> diff --git a/TAO/ChangeLog-99c b/TAO/ChangeLog-99c index 5faa8644bb9..e6dce5f671a 100644 --- a/TAO/ChangeLog-99c +++ b/TAO/ChangeLog-99c @@ -1,6 +1,18 @@ +Fri Feb 19 21:52:45 1999 Irfan Pyarali <irfan@cs.wustl.edu> + + * tao/Invocation.cpp: The Twoway_Invocation class was re-fetching + the profile and transport objects *after* sending the + request. But during a nested upcall the transport hint in the + current profile can change (if an invocation over the same + object reference is required). The solution is to keep a + reference to the transport object in the stack and pass it down + to the invoke_i() method of the GIOP_Invocation class. Thanks + to Hans Horsmann <Hans.Horsmann@icn.siemens.de> for reporting + this bug. + Thu Feb 18 20:07:10 1999 Yamuna Krishnamurthy <yamuna@cs.wustl.edu> - * TAO_IDL/be/be_visitor_factory.cpp: + * TAO_IDL/be/be_visitor_factory.cpp: Added missing context states in the TAO_Compiled_Visitor_Factory for servant implementation files Thanks to Mason Taube <taube@westcon.prc.com> for bringing it to our notice. diff --git a/TAO/tao/Connect.cpp b/TAO/tao/Connect.cpp index 7d705035abc..a698d6a32eb 100644 --- a/TAO/tao/Connect.cpp +++ b/TAO/tao/Connect.cpp @@ -905,7 +905,11 @@ TAO_ST_Client_Connection_Handler::send_request (TAO_ORB_Core* orb_core, this->input_available_ = 0; // We can get events now, b/c we want them! - r->resume_handler (this); + + int result = r->resume_handler (this); + ACE_UNUSED_ARG (result); + ACE_ASSERT (result == 0); + // We're no longer expecting a response! this->expecting_response_ = 0; } diff --git a/TAO/tao/Invocation.cpp b/TAO/tao/Invocation.cpp index 3a896780dd0..c03ddf7e206 100644 --- a/TAO/tao/Invocation.cpp +++ b/TAO/tao/Invocation.cpp @@ -288,6 +288,15 @@ TAO_GIOP_Invocation::invoke (CORBA::Boolean is_roundtrip, TAO_Profile *profile = this->data_->profile_in_use (); TAO_Transport *transport = profile->transport (); + return this->invoke_i (profile, transport, is_roundtrip, ACE_TRY_ENV); +} + +TAO_GIOP_ReplyStatusType +TAO_GIOP_Invocation::invoke_i (TAO_Profile *profile, + TAO_Transport *transport, + CORBA::Boolean is_roundtrip, + CORBA::Environment &ACE_TRY_ENV) +{ if (transport == 0 || transport->send_request (this->orb_core_, this->out_stream_, @@ -430,8 +439,12 @@ TAO_GIOP_ReplyStatusType TAO_GIOP_Twoway_Invocation::invoke (CORBA::ExceptionList &exceptions, CORBA::Environment &ACE_TRY_ENV) { + TAO_Profile *profile = this->data_->profile_in_use (); + TAO_Transport *transport = profile->transport (); + TAO_GIOP_ReplyStatusType retval = - TAO_GIOP_Invocation::invoke (1, ACE_TRY_ENV); + TAO_GIOP_Invocation::invoke_i (profile, transport, + 1, ACE_TRY_ENV); ACE_CHECK_RETURN (retval); ACE_UNUSED_ARG (retval); @@ -471,7 +484,6 @@ TAO_GIOP_Twoway_Invocation::invoke (CORBA::ExceptionList &exceptions, // (explicitly coded) handlers called. We assume a POSIX.1c/C/C++ // environment. - TAO_Transport *transport = this->data_->profile_in_use ()->transport (); TAO_GIOP::Message_Type m = TAO_GIOP::recv_request (transport, this->inp_stream_, this->orb_core_); @@ -710,14 +722,15 @@ TAO_GIOP_Twoway_Invocation::invoke (TAO_Exception_Data *excepts, CORBA::ULong except_count, CORBA::Environment &ACE_TRY_ENV) { + TAO_Profile *profile = this->data_->profile_in_use (); + TAO_Transport *transport = profile->transport (); + TAO_GIOP_ReplyStatusType retval = - TAO_GIOP_Invocation::invoke (1, ACE_TRY_ENV); + TAO_GIOP_Invocation::invoke_i (profile, transport, + 1, ACE_TRY_ENV); ACE_CHECK_RETURN (retval); ACE_UNUSED_ARG (retval); - TAO_Profile *profile = this->data_->profile_in_use (); - TAO_Transport *transport = profile->transport (); - // This blocks until the response is read. In the current version, // there is only one client thread that ever uses this connection, // so most response messages are illegal. diff --git a/TAO/tao/Invocation.h b/TAO/tao/Invocation.h index 321f7dc6754..712717a0d48 100644 --- a/TAO/tao/Invocation.h +++ b/TAO/tao/Invocation.h @@ -32,6 +32,8 @@ #include "tao/GIOP.h" struct TAO_Exception_Data; +class TAO_Profile; +class TAO_Transport; class TAO_Export TAO_GIOP_Invocation { @@ -73,6 +75,12 @@ protected: CORBA_Environment &TAO_IN_ENV = CORBA::default_environment ()); // Sends the request, does not wait for the response. + TAO_GIOP_ReplyStatusType invoke_i (TAO_Profile *profile, + TAO_Transport *transport, + CORBA::Boolean is_roundtrip, + CORBA_Environment &TAO_IN_ENV = CORBA::default_environment ()); + // This method implements invoke(), using a pre-determined profile and transport. + TAO_GIOP_ReplyStatusType close_connection (void); // resets the forwarding profile and behaves like // we are fowarded (to the same server) |