diff options
-rw-r--r-- | TAO/ChangeLog | 22 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp | 8 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_interface/interface_ss.cpp | 32 | ||||
-rw-r--r-- | TAO/TAO_IDL/be_include/be_visitor_interface/amh_ss.h | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/be_include/be_visitor_interface/interface_ss.h | 5 |
5 files changed, 64 insertions, 5 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog index ab77b2cc45c..8fb6fd8e33a 100644 --- a/TAO/ChangeLog +++ b/TAO/ChangeLog @@ -1,3 +1,25 @@ +Thu Dec 11 14:03:16 2003 Jeff Parsons <j.parsons@vanderbilt.edu> + + * TAO_IDL/be/be_visitor_interface/amh_ss.cpp: + * TAO_IDL/be/be_visitor_interface/interface_ss.cpp: + * TAO_IDL/be_include/be_visitor_interface/amh_ss.h: + * TAO_IDL/be_include/be_visitor_interface/interface_ss.h: + + Added virtual method to the be_visitor_interface_ss visitor called + genrerate_send_reply, which is a no-op, but when overridden + in the be_visitor_amh_interface_ss visitor, generates an explicit + send_reply call on _tao_server_request. This new method is then + used in the generation of the _is_a_skel, _nonexistent_skel, + _interface_skel, and _component_skel methods, and the explicit + send_reply call gets generated for the AMH version of the + interface. This addition was needed because the above generated + methods need a reply to be sent right away, and this is not + handled under the hood in asynchronous_upcall_dispatch() as it + is in synchronous_upcall_dispatch(). This fix closes + http://deuce.doc.wustl.edu/bugzilla/show_bug.cgi?id=1670. Thanks + to Carlos O'Ryan <coryan@atdesk.com> for pointing out the + problem and suggesting the fix. + Thu Dec 11 14:01:34 2003 Balachandran Natarajan <bala@dre.vanderbilt.edu> * docs/tutorials/Quoter/Simple/ImprovedServer/Quoter_Simple_ImprovedServer.mpc: diff --git a/TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp b/TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp index ed3ab084134..bd72c875591 100644 --- a/TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp +++ b/TAO/TAO_IDL/be/be_visitor_interface/amh_ss.cpp @@ -148,6 +148,14 @@ be_visitor_amh_interface_ss::dispatch_method (be_interface *node) << "}"; } +void +be_visitor_amh_interface_ss::generate_send_reply (TAO_OutStream * os) +{ + *os << be_nl << be_nl + << "_tao_server_request.tao_send_reply ();"; +} + + int be_visitor_amh_interface_ss::generate_amh_classes (be_interface *) { diff --git a/TAO/TAO_IDL/be/be_visitor_interface/interface_ss.cpp b/TAO/TAO_IDL/be/be_visitor_interface/interface_ss.cpp index 071c54d5b13..1811875179f 100644 --- a/TAO/TAO_IDL/be/be_visitor_interface/interface_ss.cpp +++ b/TAO/TAO_IDL/be/be_visitor_interface/interface_ss.cpp @@ -215,7 +215,11 @@ be_visitor_interface_ss::visit_interface (be_interface *node) } *os << be_uidt_nl - << "}" << be_uidt << be_uidt_nl + << "}" << be_uidt; + + this->generate_send_reply (os); + + *os << be_uidt_nl << "}" << be_nl << be_nl; @@ -254,7 +258,11 @@ be_visitor_interface_ss::visit_interface (be_interface *node) } *os << be_uidt_nl - << "}" << be_uidt << be_uidt_nl + << "}" << be_uidt; + + this->generate_send_reply (os); + + *os << be_uidt_nl << "}" << be_nl << be_nl; // Generate code for the _interface skeleton. @@ -295,8 +303,12 @@ be_visitor_interface_ss::visit_interface (be_interface *node) *os << "if (_tao_result == 0)" << be_idt_nl << "{" << be_idt_nl << "ACE_THROW (CORBA::MARSHAL ());" << be_uidt_nl - << "}" << be_uidt << be_uidt_nl; - *os << "}" << be_nl << be_nl; + << "}" << be_uidt; + + this->generate_send_reply (os); + + *os << be_uidt_nl + << "}" << be_nl << be_nl; // Generate code for the _component skeleton. *os << "void " << full_skel_name @@ -333,7 +345,11 @@ be_visitor_interface_ss::visit_interface (be_interface *node) } *os << be_uidt_nl - << "}" << be_uidt << be_uidt_nl + << "}" << be_uidt; + + this->generate_send_reply (os); + + *os << be_uidt_nl << "}" << be_nl << be_nl; // Generate code for the _is_a override. @@ -537,6 +553,12 @@ be_visitor_interface_ss::this_method (be_interface *node) } void +be_visitor_interface_ss::generate_send_reply (TAO_OutStream *) +{ + // no-op for regular interfaces +} + +void be_visitor_interface_ss::dispatch_method (be_interface *node) { TAO_OutStream *os = this->ctx_->stream (); diff --git a/TAO/TAO_IDL/be_include/be_visitor_interface/amh_ss.h b/TAO/TAO_IDL/be_include/be_visitor_interface/amh_ss.h index d836cc22d59..b9b5f6a6717 100644 --- a/TAO/TAO_IDL/be_include/be_visitor_interface/amh_ss.h +++ b/TAO/TAO_IDL/be_include/be_visitor_interface/amh_ss.h @@ -29,6 +29,8 @@ protected: virtual void this_method (be_interface *node); virtual void dispatch_method (be_interface *node); + virtual void generate_send_reply (TAO_OutStream * os); + virtual int generate_amh_classes (be_interface *node); virtual int generate_proxy_classes (be_interface *node); virtual int generate_downcast_implementation (be_interface *node, diff --git a/TAO/TAO_IDL/be_include/be_visitor_interface/interface_ss.h b/TAO/TAO_IDL/be_include/be_visitor_interface/interface_ss.h index fee57ebfe38..26017450331 100644 --- a/TAO/TAO_IDL/be_include/be_visitor_interface/interface_ss.h +++ b/TAO/TAO_IDL/be_include/be_visitor_interface/interface_ss.h @@ -52,6 +52,11 @@ protected: virtual void this_method (be_interface *node); virtual void dispatch_method (be_interface *node); + // Some AMH skeletons must explicitly send the reply, for regular + // classes the following function is empty, for AMH code it + // generates the explicit call. + virtual void generate_send_reply (TAO_OutStream * os); + virtual int generate_amh_classes (be_interface *node); virtual int generate_proxy_classes (be_interface *node); virtual int generate_downcast_implementation (be_interface *node, |