summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-01-18 07:10:33 +0000
committercoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-01-18 07:10:33 +0000
commit6675fbb0b36f86f7b852971cb18dba8c77dbe06d (patch)
tree78b00d399ab3508176c8ed0b6378521bc9a9872a
parentfc989aed9b5598fb71b370579fee7410235931ee (diff)
downloadATCD-6675fbb0b36f86f7b852971cb18dba8c77dbe06d.tar.gz
ChangeLogTag:Sun Jan 18 01:04:22 1998 <coryan@MILONGA>
-rw-r--r--TAO/ChangeLog-98c11
-rw-r--r--TAO/TAO_IDL/be/be_attribute.cpp2
-rw-r--r--TAO/TAO_IDL/be/be_codegen.cpp3
-rw-r--r--TAO/TAO_IDL/be/be_interface.cpp120
-rw-r--r--TAO/TAO_IDL/be_include/be_interface.h4
-rw-r--r--TAO/tao/servant_base.h7
6 files changed, 108 insertions, 39 deletions
diff --git a/TAO/ChangeLog-98c b/TAO/ChangeLog-98c
index f65e4a1ec4e..d7ceca8661b 100644
--- a/TAO/ChangeLog-98c
+++ b/TAO/ChangeLog-98c
@@ -1,3 +1,14 @@
+Sun Jan 18 01:04:22 1998 <coryan@MILONGA>
+
+ * TAO_IDL/be/be_attribute.cpp:
+ * TAO_IDL/be/be_codegen.cpp:
+ * TAO_IDL/be/be_interface.cpp:
+ * TAO_IDL/be_include/be_interface.h:
+ * tao/servant_base.h:
+ Added support for collocation in the _narrow method, this
+ required a complete implementation of _downcast() for each
+ skeleton.
+
Sat Jan 17 20:54:26 1998 <coryan@MILONGA>
* TAO_IDL/be/be_attribute.cpp:
diff --git a/TAO/TAO_IDL/be/be_attribute.cpp b/TAO/TAO_IDL/be/be_attribute.cpp
index c4e8712d5d3..294a7c4c0b2 100644
--- a/TAO/TAO_IDL/be/be_attribute.cpp
+++ b/TAO/TAO_IDL/be/be_attribute.cpp
@@ -586,7 +586,7 @@ be_attribute::gen_server_skeletons (void)
*ss << "void " << intf->full_skel_name () << "::_set_"
<< this->local_name () << "_skel ("
<< "CORBA::ServerRequest &_tao_server_request, "
- << "void *_tao_object_reference, void */*context*/, "
+ << "void *_tao_object_reference, void * /*context*/, "
<< "CORBA::Environment &_tao_environment)" << nl;
*ss << "{\n";
ss->incr_indent ();
diff --git a/TAO/TAO_IDL/be/be_codegen.cpp b/TAO/TAO_IDL/be/be_codegen.cpp
index 005735ec430..d1214f1a8b9 100644
--- a/TAO/TAO_IDL/be/be_codegen.cpp
+++ b/TAO/TAO_IDL/be/be_codegen.cpp
@@ -270,6 +270,9 @@ TAO_CodeGen::client_stubs (const char *fname)
*this->client_stubs_ << "#include \"" <<
idl_global->be_get_client_hdr_fname () << "\"\n\n";
+ *this->client_stubs_ << "#include \"" <<
+ idl_global->be_get_server_hdr_fname () << "\"\n\n";
+
// generate the code that includes the inline file if not included in the
// header file
*this->client_stubs_ << "#if !defined (__ACE_INLINE__)\n";
diff --git a/TAO/TAO_IDL/be/be_interface.cpp b/TAO/TAO_IDL/be/be_interface.cpp
index 6982232d628..20bdc2c7a76 100644
--- a/TAO/TAO_IDL/be/be_interface.cpp
+++ b/TAO/TAO_IDL/be/be_interface.cpp
@@ -377,8 +377,11 @@ be_interface::gen_client_header (void)
ch->decr_indent ();
*ch << "protected:\n";
ch->incr_indent ();
- *ch << this->local_name () << " (void); // default constructor" << nl;
- *ch << this->local_name () << " (STUB_Object *objref);\n";
+ *ch << this->local_name () << " (" << be_idt << be_idt_nl
+ << "STUB_Object *objref = 0," << be_nl
+ << "TAO_ServantBase *servant = 0," << be_nl
+ << "CORBA::Boolean collocated = CORBA::B_FALSE" << be_uidt_nl
+ << ");\n" << be_uidt;
ch->decr_indent ();
// dtor is public...
@@ -431,23 +434,28 @@ be_interface::gen_client_inline (void)
TAO_OutStream *ci = cg->client_inline ();
ci->indent (); // start from the current indentation level
- // generate the constructors and destructor
*ci << "ACE_INLINE" << nl;
- *ci << this->name () << "::" << this->local_name () <<
- " (void) // default constructor" << nl;
- *ci << "{}" << nl << nl;
-
- *ci << "ACE_INLINE" << nl;
- *ci << this->name () << "::" << this->local_name () <<
- " (STUB_Object *objref) // constructor" << nl;
- *ci << "\t: ACE_CORBA_1 (Object) (objref)" << nl;
- *ci << "{}" << nl << nl;
+ *ci << this->name () << "::"
+ << this->local_name () << "(" << be_idt << be_idt_nl
+ << "STUB_Object *objref," << be_nl
+ << "TAO_ServantBase *servant," << be_nl
+ << "CORBA::Boolean collocated" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << " : ACE_CORBA_1 (Object) (objref, servant, collocated)" << be_nl
+ << "{}" << be_nl << be_nl;
*ci << "ACE_INLINE" << nl;
*ci << this->name () << "::~" << this->local_name () <<
" (void) // destructor" << nl;
*ci << "{}\n\n";
+ // _nil method
+ *ci << "ACE_INLINE " << this->name () << "_ptr" << be_nl
+ << this->name () << "::_nil (void)" << be_nl
+ << "{" << be_idt_nl
+ << "return (" << this->name () << "_ptr)0;" << be_uidt_nl
+ << "}\n" << be_nl;
+
// generate the ifdefined macro for the _var type
ci->gen_ifdef_macro (this->flatname (), "_var");
@@ -510,14 +518,19 @@ be_interface::gen_client_stubs (void)
// The _narrow method
*cs << this->name () << "_ptr " << this->name ()
- << "::_narrow (CORBA::Object_ptr obj, CORBA::Environment &env)" << nl;
- *cs << "{\n";
- cs->incr_indent ();
- *cs << "if (CORBA::is_nil (obj)) return " << this->name () << "::_nil ();" <<
- nl;
- *cs << "if (obj->_is_a (\"" << this->repoID () << "\", env))" << nl;
- *cs << "{\n";
- cs->incr_indent ();
+ << "::_narrow (" << be_idt << be_idt_nl
+ << "CORBA::Object_ptr obj," << be_nl
+ << "CORBA::Environment &env" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << "{" << be_idt_nl
+ << "if (CORBA::is_nil (obj))" << be_idt_nl
+ << "return " << this->name () << "::_nil ();" << be_uidt_nl
+ << "if (!obj->_is_a (\"" << this->repoID () << "\", env))"
+ << be_idt_nl
+ << "return " << this->name () << "::_nil ();" << be_uidt_nl;
+
+ *cs << "if (!obj->_is_collocated () || !obj->_servant())" << be_nl
+ << "{" << be_idt_nl;
*cs << "STUB_Object *istub;" << nl;
*cs << this->name () << "_ptr new_obj; // to be returned " << nl;
#if 0 // XXXASG - I was told that emitting this line of code is the root cause
@@ -539,19 +552,20 @@ be_interface::gen_client_stubs (void)
<< "// construct obj ref using the stub object" << nl;
*cs << "return new_obj;\n";
cs->decr_indent ();
- *cs << "} // end of if" << nl;
- *cs << "return " << this->name () << "::_nil (); // _narrow failed\n";
- cs->decr_indent ();
- *cs << "} // end of _narrow" << nl << nl;
-
- // _nil method
- *cs << this->name () << "_ptr " << this->name () << "::_nil (void)" <<
- nl;
- *cs << "{\n";
- cs->incr_indent ();
- *cs << "return (" << this->name () << "_ptr)NULL;\n";
- cs->decr_indent ();
- *cs << "} // end of _nil" << nl << nl;
+ *cs << "} // end of if\n" << nl;
+
+ *cs << "STUB_Object *stub = obj->_servant ()->_create_stub (env);" << be_nl
+ << "if (env.exception () != 0)" << be_idt_nl
+ << "return " << this->name () << "::_nil ();" << be_uidt_nl
+ << "void* servant = obj->_servant ()->_downcast (\""
+ << this->repoID () << "\");" << be_nl
+ << "return new "
+ << this->full_coll_name () << "(" << be_idt << be_idt_nl
+ << "ACE_reinterpret_cast(" << this->full_skel_name ()
+ << "_ptr, servant)," << be_nl
+ << "stub" << be_uidt_nl
+ << ");" << be_uidt << be_uidt_nl
+ << "}" << be_nl << be_nl;
// the _bind method
*cs << this->name () << "_ptr " << this->name () << "::_bind (" <<
@@ -714,6 +728,11 @@ int be_interface::gen_server_header (void)
<< "CORBA::Environment &_tao_environment" << be_uidt
<< ");\n" << be_uidt;
+ sh->indent ();
+ *sh << "virtual void* _downcast (" << be_idt << be_idt_nl
+ << "const char* logical_type_id" << be_uidt_nl
+ << ");\n" << be_uidt;
+
// generate code for elements in the scope (e.g., operations)
if (be_scope::gen_server_header () == -1)
{
@@ -870,9 +889,30 @@ int be_interface::gen_server_skeletons (void)
<< "CORBA::_tc_Object->id (_tao_environment))))"
<< be_idt_nl << "return CORBA::B_TRUE;" << be_uidt_nl
<< "else" << be_idt_nl
- << "return CORBA::B_TRUE;" << be_uidt << be_uidt << be_uidt_nl
+ << "return CORBA::B_FALSE;" << be_uidt << be_uidt << be_uidt_nl
<< "}\n\n";
+ ss->indent ();
+ *ss << "void* " << this->full_skel_name ()
+ << "::_downcast (" << be_idt << be_idt_nl
+ << "const char* logical_type_id" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << "{" << be_idt_nl;
+
+ if (this->traverse_inheritance_graph (be_interface::downcast_helper, ss) == -1)
+ {
+ return -1;
+ }
+
+ *ss << "if (ACE_OS::strcmp (logical_type_id, "
+ << "\"IDL:omg.org/CORBA/Object:1.0\") == 0)" << be_idt_nl
+ << "return ACE_static_cast(PortableServer::Servant, this);"
+ << be_uidt_nl;
+
+ *ss << "return 0;" << be_uidt_nl
+ << "}\n\n";
+
+
// now the dispatch method
ss->indent ();
*ss << "void " << this->full_skel_name () <<
@@ -1830,6 +1870,18 @@ be_interface::is_a_helper (be_interface * /*derived*/,
}
int
+be_interface::downcast_helper (be_interface * /* derived */,
+ be_interface *base,
+ TAO_OutStream *os)
+{
+ *os << "if (ACE_OS::strcmp (logical_type_id, \""
+ << base->repoID () << "\") == 0)" << be_idt_nl
+ << "return ACE_static_cast ("
+ << base->full_skel_name () << "_ptr, this);" << be_uidt_nl;
+ return 0;
+}
+
+int
be_interface::gen_skel_helper (be_interface *derived,
be_interface *ancestor,
TAO_OutStream *os)
diff --git a/TAO/TAO_IDL/be_include/be_interface.h b/TAO/TAO_IDL/be_include/be_interface.h
index 397da2c5766..24536da765d 100644
--- a/TAO/TAO_IDL/be_include/be_interface.h
+++ b/TAO/TAO_IDL/be_include/be_interface.h
@@ -136,6 +136,10 @@ public:
static int is_a_helper (be_interface *, be_interface *, TAO_OutStream *os);
// helper method passed to the template method
+ static int downcast_helper (be_interface *,
+ be_interface *,
+ TAO_OutStream *os);
+
static int gen_optable_helper (be_interface *,
be_interface *,
TAO_OutStream *os);
diff --git a/TAO/tao/servant_base.h b/TAO/tao/servant_base.h
index f430ac2bd38..7e9f05d1e88 100644
--- a/TAO/tao/servant_base.h
+++ b/TAO/tao/servant_base.h
@@ -55,6 +55,9 @@ public:
virtual void *_downcast (const char *repository_id);
// Get the correct vtable
+ virtual STUB_Object *_create_stub (CORBA_Environment &_env);
+ // This is an auxiliar method for _this() and _narrow().
+
protected:
TAO_ServantBase (void);
// Default constructor, only derived classes can be created.
@@ -68,10 +71,6 @@ protected:
// internal (implementation) method its name should start with '_'
protected:
- STUB_Object *_create_stub (CORBA_Environment &_env);
- // This is an auxiliar method for _this().
-
-protected:
TAO_Operation_Table *optable_;
// The operation table for this servant, it is initialized by the
// most derived class.