summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-02-20 04:07:34 +0000
committerirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-02-20 04:07:34 +0000
commit592666592908800e0ab3ceb4dc18e73cc048d139 (patch)
tree484ece3821785852987bd8165960761f5324509d
parent3e956b7b38dbde7085c1e6d6010554911e34b0c7 (diff)
downloadATCD-592666592908800e0ab3ceb4dc18e73cc048d139.tar.gz
*** empty log message ***
-rw-r--r--README1
-rw-r--r--TAO/ChangeLog-99c14
-rw-r--r--TAO/tao/Connect.cpp6
-rw-r--r--TAO/tao/Invocation.cpp25
-rw-r--r--TAO/tao/Invocation.h8
5 files changed, 46 insertions, 8 deletions
diff --git a/README b/README
index b7e6960c33e..3191ba0bc65 100644
--- a/README
+++ b/README
@@ -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)