summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Mesnier <mesnier_p@ociweb.com>2013-04-04 23:19:29 +0000
committerPhil Mesnier <mesnier_p@ociweb.com>2013-04-04 23:19:29 +0000
commit5e70e351aaab8159dbf4d9d1441411838b2b78ae (patch)
tree5792fac6b4896f5c779d18357c6f2c2c3a62a20c
parent2d188312d074465f2fae0719912b9b92a946a612 (diff)
downloadATCD-5e70e351aaab8159dbf4d9d1441411838b2b78ae.tar.gz
Thu Apr 4 23:15:58 UTC 2013 Phil Mesnier <mesnier_p@ociweb.com>
-rw-r--r--TAO/ChangeLog_Asynch_ImR35
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/AsyncAccessManager.cpp62
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/Forwarder.cpp76
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/Forwarder.h2
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp159
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/INS_Locator.h21
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp155
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.h19
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp46
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/Locator_Repository.cpp8
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/Locator_Repository.h4
-rw-r--r--TAO/tao/Adapter.h7
-rw-r--r--TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.cpp1
-rw-r--r--TAO/tao/IORTable/IORTable.h1
-rw-r--r--TAO/tao/IORTable/IORTable.mpc2
-rw-r--r--TAO/tao/IORTable/IORTable.pidl14
-rw-r--r--TAO/tao/IORTable/IOR_Table_Impl.cpp31
-rw-r--r--TAO/tao/IORTable/IOR_Table_Impl.h10
-rw-r--r--TAO/tao/IORTable/Locate_ResponseHandler.cpp418
-rw-r--r--TAO/tao/IORTable/Locate_ResponseHandler.h272
-rw-r--r--TAO/tao/IORTable/Locate_ResponseHandler.inl112
-rw-r--r--TAO/tao/IORTable/Table_Adapter.cpp21
-rw-r--r--TAO/tao/IORTable/Table_Adapter.h4
-rw-r--r--TAO/tao/Messaging/AMH_Response_Handler.cpp7
-rw-r--r--TAO/tao/Messaging/AMH_Response_Handler.h3
25 files changed, 1287 insertions, 203 deletions
diff --git a/TAO/ChangeLog_Asynch_ImR b/TAO/ChangeLog_Asynch_ImR
index f6f8056ee4d..e251b4811c6 100644
--- a/TAO/ChangeLog_Asynch_ImR
+++ b/TAO/ChangeLog_Asynch_ImR
@@ -1,3 +1,38 @@
+Thu Apr 4 23:15:58 UTC 2013 Phil Mesnier <mesnier_p@ociweb.com>
+
+ * orbsvcs/ImplRepo_Service/AsyncAccessManager.cpp:
+ * orbsvcs/ImplRepo_Service/Forwarder.h:
+ * orbsvcs/ImplRepo_Service/Forwarder.cpp:
+ * orbsvcs/ImplRepo_Service/INS_Locator.h:
+ * orbsvcs/ImplRepo_Service/INS_Locator.cpp:
+ * orbsvcs/ImplRepo_Service/ImR_Locator_i.h:
+ * orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp:
+ * orbsvcs/ImplRepo_Service/LiveCheck.cpp:
+ * orbsvcs/ImplRepo_Service/Locator_Repository.h:
+ * orbsvcs/ImplRepo_Service/Locator_Repository.cpp:
+
+ * tao/Adapter.h:
+
+ * tao/DynamicInterface/AMH_DSI_Response_Handler.cpp:
+
+ * tao/IORTable/IORTable.h:
+ * tao/IORTable/IORTable.mpc:
+ * tao/IORTable/IORTable.pidl:
+ * tao/IORTable/IOR_Table_Impl.h:
+ * tao/IORTable/IOR_Table_Impl.cpp:
+ * tao/IORTable/Locate_ResponseHandler.h:
+ * tao/IORTable/Locate_ResponseHandler.inl:
+ * tao/IORTable/Locate_ResponseHandler.cpp:
+ * tao/IORTable/Table_Adapter.h:
+ * tao/IORTable/Table_Adapter.cpp:
+
+ * tao/Messaging/AMH_Response_Handler.h:
+ * tao/Messaging/AMH_Response_Handler.cpp:
+
+ Adding support for an asynchronous IORTable locator. This commit
+ also contains a lot of intermediate debugging artifacts. It still
+ crashes. Committing for easy distribution to other test hosts.
+
Wed Apr 3 14:20:28 UTC 2013 Phil Mesnier <mesnier_p@ociweb.com>
* orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp:
diff --git a/TAO/orbsvcs/ImplRepo_Service/AsyncAccessManager.cpp b/TAO/orbsvcs/ImplRepo_Service/AsyncAccessManager.cpp
index db60df4d9fb..5a713f9efbe 100644
--- a/TAO/orbsvcs/ImplRepo_Service/AsyncAccessManager.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/AsyncAccessManager.cpp
@@ -20,11 +20,15 @@ AsyncAccessManager::AsyncAccessManager (const Server_Info &info,
refcount_(1),
lock_()
{
+ ACE_DEBUG ((LM_DEBUG,"AAM(%x), ctor, name = %s\n",
+ this, info.name.c_str()));
this->info_ = new Server_Info (info);
}
AsyncAccessManager::~AsyncAccessManager (void)
{
+ ACE_DEBUG ((LM_DEBUG, "AAM (%x): dtor, name = %s\n", this,
+ info_->name.c_str()));
delete this->info_;
}
@@ -38,6 +42,8 @@ bool
AsyncAccessManager::has_server (const char *s)
{
int result = ACE_OS::strcmp (this->info_->name.c_str(),s);
+ ACE_DEBUG ((LM_DEBUG, "AAM (%x): has_server test, my name = %s, s = %s result = %d\n",
+ this, info_->name.c_str(), s, result));
return result == 0;
}
@@ -48,6 +54,13 @@ AsyncAccessManager::add_interest (ImR_ResponseHandler *rh)
ACE_GUARD (TAO_SYNCH_MUTEX, mon, this->lock_);
this->rh_list_.push_back (rh);
}
+ if (this->locator_.debug() > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) AsyncAccessManager::add_interest: ")
+ ACE_TEXT ("server = <%C>, status = %d count = %d\n"),
+ this->info_->name.c_str(), this->status_, this->rh_list_.size()));
+ }
if (this->status_ == AAM_SERVER_READY || this->status_ == AAM_SERVER_STARTED_RUNNING)
{
@@ -55,6 +68,10 @@ AsyncAccessManager::add_interest (ImR_ResponseHandler *rh)
{
this->status_ = AAM_SERVER_READY;
this->final_state();
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) AsyncAccessManager::add_interest: ")
+ ACE_TEXT ("server = <%C>, server is alive\n"),
+ this->info_->name.c_str()));
return;
}
}
@@ -86,11 +103,24 @@ AsyncAccessManager::add_interest (ImR_ResponseHandler *rh)
}
}
}
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) AsyncAccessManager::add_interest: ")
+ ACE_TEXT ("server = <%C>, status = %d returning\n"),
+ this->info_->name.c_str(), this->status_));
}
void
AsyncAccessManager::final_state (void)
{
+ if (this->locator_.debug() > 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) AsyncAccessManager::final_state: ")
+ ACE_TEXT ("status = %d, server = <%C> list size = %d\n"),
+ this->status_, this->info_->name.c_str(), rh_list_.size()));
+ }
+
for (size_t i = 0; i < this->rh_list_.size(); i++)
{
ImR_ResponseHandler *rh = this->rh_list_[i];
@@ -98,6 +128,8 @@ AsyncAccessManager::final_state (void)
{
if (this->status_ == AAM_SERVER_READY)
{
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) AsyncAccessManager::final_state calling send_ior\n")));
rh->send_ior (this->info_->partial_ior.c_str());
}
else
@@ -153,6 +185,13 @@ AsyncAccessManager::status (AAM_Status s)
void
AsyncAccessManager::activator_replied (bool success)
{
+ // if (this->locator_.debug() > 0)
+ // {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) AsyncAccessManager::activator_replied: ")
+ ACE_TEXT ("success = %d, status = %d\n"),
+ success, this->status_));
+ // }
if (success)
{
this->status (AAM_WAIT_FOR_RUNNING);
@@ -174,6 +213,13 @@ AsyncAccessManager::server_is_shutting_down (void)
void
AsyncAccessManager::server_is_running (const char *partial_ior)
{
+ // if (this->locator_.debug() > 0)
+ // {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) AsyncAccessManager::server_is_running: ")
+ ACE_TEXT ("name = %C, status = %d\n"),
+ this->info_->name.c_str(), this->status_));
+ // }
this->status (AAM_WAIT_FOR_ALIVE);
this->info_->partial_ior = partial_ior;
@@ -273,12 +319,15 @@ AsyncAccessManager::add_ref (void)
{
ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_, 0);
++this->refcount_;
+
+ ACE_DEBUG ((LM_DEBUG, "AAM (%x): add_ref count now = %d\n", this, this->refcount_));
return this;
}
void
AsyncAccessManager::remove_ref (void)
{
+ ACE_DEBUG ((LM_DEBUG, "AAM (%x): remove_ref count pre decr = %d\n", this, this->refcount_));
ACE_GUARD (TAO_SYNCH_MUTEX, mon, this->lock_);
if (--this->refcount_ == 0)
{
@@ -292,20 +341,24 @@ AsyncAccessManager::remove_ref (void)
AsyncAccessManager_ptr::AsyncAccessManager_ptr (void)
: val_ (0)
{
+ ACE_DEBUG ((LM_DEBUG,"AAM_Ptr (%x) ctor default\n", this));
}
AsyncAccessManager_ptr::AsyncAccessManager_ptr (AsyncAccessManager *aam)
:val_ (aam)
{
+ ACE_DEBUG ((LM_DEBUG,"AAM_Ptr (%x) ctor taking ownership of aam = %x\n", this, aam));
}
AsyncAccessManager_ptr::AsyncAccessManager_ptr (const AsyncAccessManager_ptr &aam_ptr)
:val_ (aam_ptr.clone())
{
+ ACE_DEBUG ((LM_DEBUG,"AAM_Ptr (%x) ctor taking ownership of aam_clone = %x\n", this, val_));
}
AsyncAccessManager_ptr::~AsyncAccessManager_ptr (void)
{
+ ACE_DEBUG ((LM_DEBUG,"AAM_Ptr (%x) dtor releasing %x\n", this, val_));
if (val_ != 0)
{
val_->remove_ref();
@@ -315,6 +368,8 @@ AsyncAccessManager_ptr::~AsyncAccessManager_ptr (void)
AsyncAccessManager_ptr &
AsyncAccessManager_ptr::operator= (const AsyncAccessManager_ptr &aam_ptr)
{
+ ACE_DEBUG ((LM_DEBUG,"AAM_Ptr (%x) assignment releasing %x, taking ownership of aam_clone = %x\n", this, val_, *aam_ptr));
+
if (val_ != *aam_ptr)
{
if (val_ != 0)
@@ -329,6 +384,7 @@ AsyncAccessManager_ptr::operator= (const AsyncAccessManager_ptr &aam_ptr)
AsyncAccessManager_ptr &
AsyncAccessManager_ptr::operator= (AsyncAccessManager *aam)
{
+ ACE_DEBUG ((LM_DEBUG,"AAM_Ptr (%x) assignment releasing %x, taking ownership of aam = %x\n", this, val_, aam));
if (val_ != aam)
{
if (val_ != 0)
@@ -459,16 +515,20 @@ AsyncLiveListener::AsyncLiveListener (const char *server,
pinger_ (pinger),
status_ (LS_UNKNOWN)
{
+ ACE_DEBUG ((LM_DEBUG, "AsyncLiveListener ctor, this = %x\n", this));
}
AsyncLiveListener::~AsyncLiveListener (void)
{
+ ACE_DEBUG ((LM_DEBUG, "AsyncLiveListener dtor, this = %x\n", this));
}
bool
AsyncLiveListener::start (void)
{
bool rtn = this->pinger_.add_listener (this);
+ ACE_DEBUG ((LM_DEBUG,
+ "AsyncLiveListener::start, add_listener returned %d\n", rtn));
if (!rtn)
delete this;
return rtn;
@@ -484,6 +544,8 @@ AsyncLiveListener::status_changed (LiveStatus status)
}
else
{
+ ACE_DEBUG ((LM_DEBUG,
+ "AsyncLiveListener::status_changed, status = %d, deleting(%x)\n", status, this));
this->aam_->ping_replied (status);
delete this;
}
diff --git a/TAO/orbsvcs/ImplRepo_Service/Forwarder.cpp b/TAO/orbsvcs/ImplRepo_Service/Forwarder.cpp
index b242d737989..4be5dec24f0 100644
--- a/TAO/orbsvcs/ImplRepo_Service/Forwarder.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/Forwarder.cpp
@@ -191,56 +191,56 @@ ImR_DSI_ResponseHandler::send_ior (const char *pior)
// Check that the returned ior is the expected partial ior with
// missing ObjectKey.
- if (ior.find ("corbaloc:") != 0 || ior[ior.length () - 1] != '/')
+ if (ior.find ("corbaloc:") == 0 && ior[ior.length () -1] == '/')
{
- ACE_ERROR ((LM_ERROR,
- ACE_TEXT ("ImR_ResponseHandler::send_ior (): Invalid corbaloc ior.\n")
- ACE_TEXT ("\t<%s>\n"),
- ior.c_str()));
-
- CORBA::OBJECT_NOT_EXIST ex (CORBA::SystemException::_tao_minor_code
- ( TAO_IMPLREPO_MINOR_CODE, 0),
- CORBA::COMPLETED_NO);
- TAO_AMH_DSI_Exception_Holder h(&ex);
- this->resp_->invoke_excep(&h);
- delete this;
- return;
- }
+ ior += this->key_str_.in();
- ior += this->key_str_.in();
+ CORBA::Object_var forward_obj =
+ this->orb_->string_to_object (ior.c_str ());
- CORBA::Object_var forward_obj =
- this->orb_->string_to_object (ior.c_str ());
-
- if (!CORBA::is_nil (forward_obj.in ()))
- {
- CORBA::Exception *fwd = new PortableServer::ForwardRequest (forward_obj.in ());
- TAO_AMH_DSI_Exception_Holder h(fwd);
- this->resp_->invoke_excep(&h);
- delete this;
+ if (!CORBA::is_nil (forward_obj.in ()))
+ {
+ this->resp_->invoke_location_forward(forward_obj.in(), true);
+ delete this;
+ return;
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("ImR_DSI_ResponseHandler::send_ior (): Forward_to ")
+ ACE_TEXT ("reference is nil.\n")));
+ }
}
else
{
ACE_ERROR ((LM_ERROR,
- ACE_TEXT ("ImR_DSI_ResponseHandler::send_ior (): Forward_to ")
- ACE_TEXT ("reference is nil.\n")));
-
- CORBA::Exception *ex = new CORBA::OBJECT_NOT_EXIST (CORBA::SystemException::_tao_minor_code
- ( TAO_IMPLREPO_MINOR_CODE, 0),
- CORBA::COMPLETED_NO);
- TAO_AMH_DSI_Exception_Holder h(ex);
- this->resp_->invoke_excep(&h);
- delete this;
+ ACE_TEXT ("ImR_ResponseHandler::send_ior (): Invalid corbaloc ior.\n")
+ ACE_TEXT ("\t<%s>\n"),
+ ior.c_str()));
}
+
+ this->invoke_excep_i (new CORBA::OBJECT_NOT_EXIST
+ (CORBA::SystemException::_tao_minor_code
+ ( TAO_IMPLREPO_MINOR_CODE, 0),
+ CORBA::COMPLETED_NO));
}
void
-ImR_DSI_ResponseHandler::send_exception (CORBA::Exception *)
+ImR_DSI_ResponseHandler::invoke_excep_i (CORBA::Exception *ex)
{
- CORBA::Exception *ex = new CORBA::TRANSIENT (CORBA::SystemException::_tao_minor_code
- ( TAO_IMPLREPO_MINOR_CODE, 0),
- CORBA::COMPLETED_NO);
TAO_AMH_DSI_Exception_Holder h(ex);
- resp_->invoke_excep(&h);
+ this->resp_->invoke_excep(&h);
delete this;
}
+
+void
+ImR_DSI_ResponseHandler::send_exception (CORBA::Exception *ex)
+{
+ //discard the exception, always throw a transient:
+ delete ex;
+
+ this->invoke_excep_i (new CORBA::TRANSIENT
+ (CORBA::SystemException::_tao_minor_code
+ (TAO_IMPLREPO_MINOR_CODE, 0),
+ CORBA::COMPLETED_NO));
+}
diff --git a/TAO/orbsvcs/ImplRepo_Service/Forwarder.h b/TAO/orbsvcs/ImplRepo_Service/Forwarder.h
index 6a1bf51f838..cc5b91aa674 100644
--- a/TAO/orbsvcs/ImplRepo_Service/Forwarder.h
+++ b/TAO/orbsvcs/ImplRepo_Service/Forwarder.h
@@ -60,6 +60,8 @@ public:
void send_exception (CORBA::Exception *ex);
private:
+ void invoke_excep_i (CORBA::Exception *ex);
+
CORBA::String_var key_str_;
CORBA::String_var server_name_;
CORBA::ORB_var orb_;
diff --git a/TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp b/TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp
index fb50d46c937..eb8dcdb7f12 100644
--- a/TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/INS_Locator.cpp
@@ -13,6 +13,7 @@
#include "INS_Locator.h"
#include "ImR_Locator_i.h"
#include "tao/ORB_Constants.h"
+#include "tao/ORB_Core.h"
INS_Locator::INS_Locator (ImR_Locator_i& loc)
: imr_locator_ (loc)
@@ -25,112 +26,82 @@ INS_Locator::locate (const char* object_key)
ACE_ASSERT (object_key != 0);
try
{
- ACE_CString key (object_key);
- ssize_t poaidx = key.find ('/');
- if (poaidx >= 0)
- {
- key = key.substring (0, poaidx);
- }
-
- if (imr_locator_.debug () > 0)
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("ImR: Activating server <%s>.\n"),
- key.c_str ()));
-
CORBA::String_var located =
- this->imr_locator_.activate_server_by_object (key.c_str ());
+ this->imr_locator_.activate_server_by_object (object_key);
+ return located._retn();
+ }
+ catch (CORBA::Exception &)
+ {
+ throw CORBA::TRANSIENT (CORBA::SystemException::_tao_minor_code
+ (TAO_IMPLREPO_MINOR_CODE, 0),
+ CORBA::COMPLETED_NO);
+ }
+}
- ACE_CString tmp = located.in ();
- tmp += object_key;
+void
+INS_Locator::async_locate (::IORTable::Locate_ResponseHandler handler,
+ const char* object_key)
+{
+ ACE_ASSERT (object_key != 0);
- if (imr_locator_.debug () > 0)
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("ImR: Forwarding invocation on <%s> to <%s>\n"),
- key.c_str (), tmp.c_str()));
+ if (imr_locator_.debug () > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("ImR: Activating server <%s> asynchronously .\n"),
+ object_key));
- return CORBA::string_dup (tmp.c_str ());
- }
- catch (const ImplementationRepository::CannotActivate&)
+ Server_Info_Ptr si;
+ ACE_CString key;
+ ACE_CString full (object_key);
+ if (this->imr_locator_.split_key (full, key, si))
{
- throw CORBA::TRANSIENT (
- CORBA::SystemException::_tao_minor_code (
- TAO_IMPLREPO_MINOR_CODE,
- 0),
- CORBA::COMPLETED_NO);
+ ImR_ResponseHandler *rh;
+ ACE_NEW (rh, INS_Loc_ResponseHandler (key.c_str(), handler));
+ this->imr_locator_.activate_server_by_info (si, rh);
}
- catch (const ImplementationRepository::NotFound&)
+ else
{
- ACE_CString objkey (object_key);
+ ACE_DEBUG ((LM_DEBUG, "async_locate: split key failed!\n"));
- // check to see if there are more slashes beyond the first one
- ssize_t poaidx2 = objkey.rfind ('/');
- ssize_t poaidx1 = objkey.find ('/');
- if (poaidx1 <= 0 || poaidx2 <= 0 || poaidx1 == poaidx2)
- {
- throw CORBA::TRANSIENT (
- CORBA::SystemException::_tao_minor_code (
- TAO_IMPLREPO_MINOR_CODE,
- 0),
- CORBA::COMPLETED_NO);
- }
+ handler->raise_excep (CORBA::TRANSIENT (CORBA::SystemException::_tao_minor_code
+ (TAO_IMPLREPO_MINOR_CODE, 0),
+ CORBA::COMPLETED_NO));
+ }
+}
- // remove the data field beyond the last delimiter
- // which is assumed to be the object id.
- ACE_CString key2 = objkey.substring(0, poaidx2);
- while (poaidx2 > poaidx1)
- {
- try
- {
- if (imr_locator_.debug () > 0)
- {
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("ImR: Try activating server using <%s>.\n"),
- key2.c_str ()));
- }
- CORBA::String_var located =
- this->imr_locator_.activate_server_by_object (key2.c_str ());
+//----------------------------------------------------------------------------------------
+INS_Loc_ResponseHandler::INS_Loc_ResponseHandler (const char *key,
+ ::IORTable::Locate_ResponseHandler handler)
+ : key_(key),
+ rh_ (handler)
+{
+ CORBA::ORB_var orb = rh_->orb_core()->orb();
+ ACE_DEBUG ((LM_DEBUG, "INS_Loc_ResponseHandler ctor, rh_ = %x, orb = %x\n",
+ rh_.ptr(), orb.ptr()));
+}
- ACE_CString tmp = located.in ();
- tmp += object_key;
+void
+INS_Loc_ResponseHandler::send_ior (const char *pior)
+{
+ CORBA::ORB_var orb = rh_->orb_core()->orb();
+ ACE_DEBUG ((LM_DEBUG, "INS_Loc_ResponseHandler send_ior, rh_ = %x, orb = %x, key = %s\n",
+ rh_.ptr(), orb.ptr(), key_.c_str()));
- if (imr_locator_.debug () > 0)
- {
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("ImR: Forwarding invocation on <%s> ")
- ACE_TEXT ("to <%s>\n"), key2.c_str (), tmp.c_str()));
- }
+ ACE_CString ior = pior;
+ ior += key_;
+ rh_->forward_ior (ior.c_str(), false);
+ delete this;
+}
- return CORBA::string_dup (tmp.c_str ());
- }
- catch (const ImplementationRepository::CannotActivate&)
- {
- throw CORBA::TRANSIENT (
- CORBA::SystemException::_tao_minor_code (
- TAO_IMPLREPO_MINOR_CODE,
- 0),
- CORBA::COMPLETED_NO);
- }
- catch (const ImplementationRepository::NotFound&)
- {
- poaidx2 = key2.rfind ('/');
- if (poaidx2 > poaidx1)
- {
- // continue to try again
- key2 = key2.substring(0, poaidx2);
- continue;
- }
- else
- {
- break;
- }
- }
- } // while()
+void
+INS_Loc_ResponseHandler::send_exception (CORBA::Exception *ex)
+{
+ ACE_DEBUG ((LM_DEBUG, "INS_Loc_ResponseHandler send_exception, rh_ = %x\n",
+ rh_.ptr()));
- // No match is found
- throw CORBA::TRANSIENT (CORBA::SystemException::_tao_minor_code (
- TAO_IMPLREPO_MINOR_CODE,
- 0),
- CORBA::COMPLETED_NO);
- }
+ delete ex;
+ rh_->raise_excep (CORBA::TRANSIENT (CORBA::SystemException::_tao_minor_code
+ (TAO_IMPLREPO_MINOR_CODE, 0),
+ CORBA::COMPLETED_NO));
+ delete this;
}
diff --git a/TAO/orbsvcs/ImplRepo_Service/INS_Locator.h b/TAO/orbsvcs/ImplRepo_Service/INS_Locator.h
index 1e892df895f..3aee6001873 100644
--- a/TAO/orbsvcs/ImplRepo_Service/INS_Locator.h
+++ b/TAO/orbsvcs/ImplRepo_Service/INS_Locator.h
@@ -22,10 +22,25 @@
#endif /* ACE_LACKS_PRAGMA_ONCE */
#include "tao/LocalObject.h"
-
+#include "ImR_ResponseHandler.h"
+#include "tao/IORTable/Locate_ResponseHandler.h"
class ImR_Locator_i;
+class INS_Loc_ResponseHandler : public ImR_ResponseHandler
+{
+public:
+ INS_Loc_ResponseHandler (const char *key, ::IORTable::Locate_ResponseHandler rh);
+
+ // dummy implementations used for internal operations
+ virtual void send_ior (const char *pior);
+ virtual void send_exception (CORBA::Exception *ex);
+
+private:
+ ACE_CString key_;
+ TAO_AMH_Locate_ResponseHandler_var rh_;
+};
+
/**
* @class INS_Locator
*
@@ -35,7 +50,7 @@ class ImR_Locator_i;
* to dynamically receive a IOR to forward in response to an INS request.
*/
class INS_Locator
- : public virtual IORTable::Locator,
+ : public virtual IORTable::AsyncLocator,
public virtual ::CORBA::LocalObject
{
public:
@@ -43,6 +58,8 @@ public:
/// Locate the appropriate IOR.
char* locate (const char *object_key);
+ void async_locate (::IORTable::Locate_ResponseHandler handler,
+ const char *object_key);
private:
ImR_Locator_i& imr_locator_;
diff --git a/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp b/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp
index 6036d21b820..55c4fa3d0c5 100644
--- a/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp
@@ -405,6 +405,29 @@ ImR_Locator_i::notify_child_death
_tao_rh->notify_child_death ();
}
+char*
+ImR_Locator_i::activate_server_by_name (const char* name, bool manual_start)
+{
+ ImR_SyncResponseHandler rh ("", this->orb_.in());
+ this->activate_server_by_name (name, manual_start, &rh);
+ return rh.wait_for_result ();
+}
+
+char*
+ImR_Locator_i::activate_server_by_object (const char* object_name)
+{
+ Server_Info_Ptr si;
+ ACE_CString key;
+ ACE_CString full (object_name);
+ if (this->split_key (full, key, si))
+ {
+ ImR_SyncResponseHandler rh (key.c_str(), this->orb_.in());
+ this->activate_server_by_info (si, &rh);
+ return rh.wait_for_result ();
+ }
+ throw ImplementationRepository::NotFound();
+}
+
void
ImR_Locator_i::activate_server
(ImplementationRepository::AMH_AdministrationResponseHandler_ptr _tao_rh,
@@ -424,6 +447,40 @@ ImR_Locator_i::activate_server
activate_server_by_name (server, true, rh);
}
+bool
+ImR_Locator_i::get_info_for_name (const char* name, Server_Info_Ptr &si)
+{
+ ACE_CString serverKey;
+ ACE_CString server_id;
+ bool jacorb_server = false;
+ this->parse_id (name, server_id, serverKey, jacorb_server);
+ si = this->repository_->get_server (serverKey);
+ return !si.null();
+}
+
+bool
+ImR_Locator_i::split_key (ACE_CString &full, ACE_CString &key, Server_Info_Ptr &si)
+{
+ key = full;
+ if (this->get_info_for_name (full.c_str(), si))
+ {
+ return true;
+ }
+
+ ACE_CString::size_type pos = full.rfind ('/');
+ while (pos != ACE_CString::npos)
+ {
+ ACE_CString server = full.substring (0, pos);
+ if (this->get_info_for_name (server.c_str (), si))
+ {
+ return true;
+ }
+ pos = server.rfind ('/');
+ }
+
+ return false;
+}
+
void
ImR_Locator_i::activate_server_by_name (const char* name, bool manual_start,
ImR_ResponseHandler *rh)
@@ -432,59 +489,24 @@ ImR_Locator_i::activate_server_by_name (const char* name, bool manual_start,
// servers unless manual_start=true
ACE_ASSERT (name != 0);
- ACE_CString serverKey;
- ACE_CString server_id;
- bool jacorb_server = false;
- this->parse_id (name, server_id, serverKey, jacorb_server);
- UpdateableServerInfo info (this->repository_.get(), serverKey);
- if (info.null ())
+ Server_Info_Ptr si;
+ if (!this->get_info_for_name(name, si))
{
- ACE_ERROR ((
- LM_ERROR,
- ACE_TEXT ("ImR: Cannot find info for server <%C>\n"),
- name));
- throw ImplementationRepository::NotFound ();
+ rh->send_exception ( new ImplementationRepository::NotFound );
+ return;
}
- //MDM
- info.edit()->start_count = 0;
+ UpdateableServerInfo info (this->repository_.get(), si, true);
this->activate_server_i (info, manual_start, rh);
}
-char*
-ImR_Locator_i::activate_server_by_name (const char* name, bool manual_start)
-{
- ImR_SyncResponseHandler rh (this->orb_.in());
- this->activate_server_by_name (name, manual_start, &rh);
- return rh.wait_for_result ();
-}
-
-char*
-ImR_Locator_i::activate_server_by_object (const char* object_name)
+void
+ImR_Locator_i::activate_server_by_info (const Server_Info_Ptr &si,
+ ImR_ResponseHandler *rh)
{
- ACE_ASSERT (object_name != 0);
-
- // We assume that the first part of the object name is the server name.
- // So a name of foo/bar means that the server name is foo.
- ACE_CString server_name (object_name);
- ACE_CString::size_type pos = server_name.find ('/');
- if (pos != ACE_CString::npos)
- {
- try
- {
- return activate_server_by_name (object_name, false);
- }
- catch (ImplementationRepository::NotFound&)
- {
- server_name = server_name.substr (pos + 1);
- return activate_server_by_name (server_name.c_str (), false);
- }
- }
- else
- {
- return activate_server_by_name (server_name.c_str (), false);
- }
+ UpdateableServerInfo info (this->repository_.get(), si, true);
+ this->activate_server_i (info, false, rh);
}
void
@@ -498,7 +520,8 @@ ImR_Locator_i::activate_server_i (UpdateableServerInfo& info,
AsyncAccessManager *aam_raw;
ACE_NEW (aam_raw, AsyncAccessManager (*info, manual_start, *this));
aam = aam_raw;
- this->aam_set_.insert (aam);
+ int result = this->aam_set_.insert (aam);
+ ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::activate_server_i(PC) insert_aam returned %d\n", result));
}
else
{
@@ -508,10 +531,13 @@ ImR_Locator_i::activate_server_i (UpdateableServerInfo& info,
AsyncAccessManager *aam_raw;
ACE_NEW (aam_raw, AsyncAccessManager (*info, manual_start, *this));
aam = aam_raw;
- this->aam_set_.insert_tail (aam);
+ ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::activate_server_i calling insert_aam size = %d\n", aam_set_.size()));
+ int result = this->aam_set_.insert_tail (aam);
+ ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::activate_server_i after insert_aam size = %d returned %d\n", aam_set_.size(), result));
}
}
aam->add_interest (rh);
+ ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::activate_server_i returning\n"));
}
CORBA::Object_ptr
@@ -593,7 +619,7 @@ ImR_Locator_i::add_or_update_server
ACE_CString serverKey;
ACE_CString server_id;
bool jacorb_server = false;
- this->parse_id(server, server_id, serverKey, jacorb_server);
+ this->parse_id (server, server_id, serverKey, jacorb_server);
UpdateableServerInfo info(this->repository_.get(), serverKey);
if (info.null ())
{
@@ -655,10 +681,10 @@ ImR_Locator_i::add_or_update_server
}
void
-ImR_Locator_i::parse_id(const char* id,
- ACE_CString& server_id,
- ACE_CString& name,
- bool& jacorb_server)
+ImR_Locator_i::parse_id (const char* id,
+ ACE_CString& server_id,
+ ACE_CString& name,
+ bool& jacorb_server)
{
const char *pos = ACE_OS::strchr (id, ':');
if (pos)
@@ -925,7 +951,8 @@ ImR_Locator_i::server_is_running
ACE_NEW (aam_raw, AsyncAccessManager (*temp_info, true, *this));
AsyncAccessManager_ptr aam (aam_raw);
aam->started_running ();
- this->aam_set_.insert (aam);
+ int result = this->aam_set_.insert (aam);
+ ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::server_is_running insert_aam returned %d\n", result));
}
else
{
@@ -953,11 +980,14 @@ ImR_Locator_i::server_is_running
aam->server_is_running (partial_ior);
else
{
+ ACE_DEBUG ((LM_DEBUG, "Server_Is_Running, %s not found in aam set\n",
+ name.c_str()));
AsyncAccessManager *aam_raw;
ACE_NEW (aam_raw, AsyncAccessManager (*info, true, *this));
AsyncAccessManager_ptr aam (aam_raw);
aam->started_running ();
- this->aam_set_.insert (aam);
+ int result = this->aam_set_.insert (aam);
+ ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::server_is_running insert_aam returned %d\n", result));
}
}
_tao_rh->server_is_running ();
@@ -1315,18 +1345,24 @@ ImR_Locator_i::root_poa (void)
void
ImR_Locator_i::remove_aam (AsyncAccessManager_ptr &aam)
{
- this->aam_set_.remove (aam);
+ ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::remove_aam calling remove\n"));
+ int result = this->aam_set_.remove (aam);
+ ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::remove_aam, remove returned %d\n", result));
+
}
AsyncAccessManager *
ImR_Locator_i::find_aam (const char *name)
{
+ ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::find_aam called for %s, set size = %d\n", name, aam_set_.size()));
+
for (AAM_Set::ITERATOR i = this->aam_set_.begin();
i != this->aam_set_.end();
++i)
{
if ((*i)->has_server (name))
{
+ ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::find_aam add ref and return\n"));
return (*i)->add_ref();
}
}
@@ -1386,8 +1422,9 @@ SyncListener::status_changed (LiveStatus status)
//---------------------------------------------------------------------------
-ImR_SyncResponseHandler::ImR_SyncResponseHandler (CORBA::ORB_ptr orb)
+ImR_SyncResponseHandler::ImR_SyncResponseHandler (const char *objkey, CORBA::ORB_ptr orb)
:excep_ (0),
+ key_ (objkey),
orb_ (CORBA::ORB::_duplicate (orb))
{
}
@@ -1399,7 +1436,10 @@ ImR_SyncResponseHandler::~ImR_SyncResponseHandler (void)
void
ImR_SyncResponseHandler::send_ior (const char *pior)
{
- this->result_ = pior;
+ ACE_DEBUG ((LM_DEBUG,"ImR_SyncResponseHandler send_ior called\n"));
+ ACE_CString full (pior);
+ full += this->key_;
+ this->result_ = full.c_str();
}
void
@@ -1439,6 +1479,7 @@ ImR_Loc_ResponseHandler::~ImR_Loc_ResponseHandler (void)
void
ImR_Loc_ResponseHandler::send_ior (const char *)
{
+ ACE_DEBUG ((LM_DEBUG,"ImR_Loc_ResponseHandler send_ior called, opid = %d\n", op_id_));
switch (this->op_id_)
{
case LOC_ACTIVATE_SERVER:
diff --git a/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.h b/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.h
index 409347df184..40ffd1c289d 100644
--- a/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.h
+++ b/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.h
@@ -123,15 +123,19 @@ public:
(ImplementationRepository::AMH_AdministrationResponseHandler_ptr _tao_rh,
const char * name);
- // Used by the INS_Locator to start a sever given an object name
+ // Used by the INS_Locator to start a sever given an object name synchronously
char* activate_server_by_object (const char* object_name);
char* activate_server_by_name (const char * name, bool manual_start);
- // Helper function also used by the Forwarder
+ // Asynchronous versions, used by both INS_Locator and Forwarder
+ void activate_server_by_info (const Server_Info_Ptr &si,
+ ImR_ResponseHandler *rh);
- void activate_server_by_name (const char * name,
- bool manual_start,
- ImR_ResponseHandler *rh);
+ void activate_server_by_name (const char * name,
+ bool manual_start,
+ ImR_ResponseHandler *rh);
+
+ bool split_key (ACE_CString &full, ACE_CString &key, Server_Info_Ptr &si);
// interfaces to aid with collaboration
@@ -144,6 +148,8 @@ public:
private:
+ bool get_info_for_name (const char *name, Server_Info_Ptr &si);
+
void activate_server_i (UpdateableServerInfo& info,
bool manual_start,
ImR_ResponseHandler *rh);
@@ -231,7 +237,7 @@ class SyncListener : public LiveListener
class ImR_SyncResponseHandler : public ImR_ResponseHandler
{
public:
- ImR_SyncResponseHandler (CORBA::ORB_ptr orb);
+ ImR_SyncResponseHandler (const char *key, CORBA::ORB_ptr orb);
virtual ~ImR_SyncResponseHandler (void);
virtual void send_ior (const char *pior);
@@ -242,6 +248,7 @@ public:
private:
CORBA::String_var result_;
CORBA::Exception *excep_;
+ ACE_CString key_;
CORBA::ORB_var orb_;
};
diff --git a/TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp b/TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp
index ccfb7affe78..8e560694b7c 100644
--- a/TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp
@@ -71,6 +71,7 @@ LiveEntry::add_listener (LiveListener* ll)
{
ACE_GUARD (TAO_SYNCH_MUTEX, mon, this->lock_);
this->listeners_.insert (ll);
+ // ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::add_listener\n", this->server_.c_str()));
}
LiveStatus
@@ -100,7 +101,12 @@ LiveEntry::status (LiveStatus l)
this->retry_count_ = 0;
ACE_Time_Value now (ACE_High_Res_Timer::gettimeofday_hr());
this->next_check_ = now + owner_->ping_interval();
+ ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::status updating next check to now + %d ms\n",
+ this->server_.c_str(),
+ owner_->ping_interval().msec()));
}
+ ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::status updating listeners, size = %d\n",
+ this->server_.c_str(), this->listeners_.size()));
Listen_Set remove;
@@ -139,6 +145,8 @@ LiveEntry::status (LiveStatus l)
if (this->listeners_.size() > 0)
{
+ ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::status requesting new ping\n",
+ this->server_.c_str()));
this->owner_->schedule_ping (this);
}
}
@@ -155,22 +163,30 @@ LiveEntry::do_ping (PortableServer::POA_ptr poa)
ACE_Time_Value now (ACE_High_Res_Timer::gettimeofday_hr());
if (this->liveliness_ == LS_PING_AWAY || this->listeners_.size() == 0)
{
+ ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::do_ping, ping_away_ is %d, listeners size = %d\n",
+ this->server_.c_str(), (this->liveliness_ == LS_PING_AWAY), this->listeners_.size()));
return false;
}
if (this->next_check_ > now || this->liveliness_ == LS_DEAD)
{
ACE_Time_Value diff = next_check_ - now;
+ ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::do_ping, too soon = %d, nc = %d, now = %d, come back in %d ms, status = %d\n",
+ this->server_.c_str(), (this->next_check_ > now), this->next_check_.msec(), now.msec(), diff.msec(), liveliness_));
return false;
}
switch (this->liveliness_)
{
case LS_UNKNOWN:
+ ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::do_ping, unknown, seting next_check_ to now\n",
+ this->server_.c_str()));
this->next_check_ = now;
break;
case LS_ALIVE:
case LS_TIMEDOUT:
+ ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::do_ping, alive or timed out, seting next_check_ to ping interval\n",
+ this->server_.c_str()));
this->next_check_ = now + owner_->ping_interval();
break;
case LS_TRANSIENT:
@@ -179,10 +195,14 @@ LiveEntry::do_ping (PortableServer::POA_ptr poa)
if (ms != -1)
{
ACE_Time_Value next (ms / 1000, (ms % 1000) * 1000);
+ ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::do_ping, transient, adding %d ms (should be %d)\n",
+ this->server_.c_str(), next.msec(), ms));
this->next_check_ = now + next;
}
else
{
+ ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::do_ping, transient, but no next\n",
+ this->server_.c_str()));
return false;
}
}
@@ -195,6 +215,8 @@ LiveEntry::do_ping (PortableServer::POA_ptr poa)
this->liveliness_ = LS_PING_AWAY;
this->retry_count_++;
}
+ ACE_DEBUG ((LM_DEBUG, "LiveEntry(%s)::do_ping, sending ping, retry count = %d\n",
+ this->server_.c_str(), retry_count_));
PortableServer::ServantBase_var callback = new PingReceiver (this, poa);
PortableServer::ObjectId_var oid = poa->activate_object (callback.in());
CORBA::Object_var obj = poa->id_to_reference (oid.in());
@@ -220,6 +242,7 @@ PingReceiver::~PingReceiver (void)
void
PingReceiver::ping (void)
{
+ ACE_DEBUG ((LM_DEBUG, "PingReceiver::ping\n"));
this->entry_->status (LS_ALIVE);
PortableServer::ObjectId_var oid = this->poa_->servant_to_id (this);
poa_->deactivate_object (oid.in());
@@ -230,6 +253,7 @@ PingReceiver::ping_excep (Messaging::ExceptionHolder * excep_holder)
{
try
{
+ ACE_DEBUG ((LM_DEBUG, "PingReceiver::ping_excep\n"));
excep_holder->raise_exception ();
}
catch (CORBA::TRANSIENT &ex)
@@ -288,6 +312,8 @@ void
LiveCheck::init (CORBA::ORB_ptr orb,
const ACE_Time_Value &pi )
{
+ ACE_DEBUG ((LM_DEBUG, "LiveCheck::init (), ping interval = %d ms\n",
+ pi.msec()));
this->ping_interval_ = pi;
ACE_Reactor *r = orb->orb_core()->reactor();
this->reactor (r);
@@ -311,12 +337,14 @@ LiveCheck::ping_interval (void) const
int
LiveCheck::handle_timeout (const ACE_Time_Value &,
- const void */*tok*/)
+ const void *tok)
{
- // long token = reinterpret_cast<long>(tok);
+ long token = reinterpret_cast<long>(tok);
if (!this->running_)
return -1;
+ ACE_DEBUG ((LM_DEBUG, "LiveCheck::handle_timeout (tok = %d) entry_map.size = %d\n",
+ token, this->entry_map_.current_size()));
bool want_reping = false;
ACE_Time_Value next;
LiveEntryMap::iterator the_end = this->entry_map_.end();
@@ -395,6 +423,8 @@ LiveCheck::handle_timeout (const ACE_Time_Value &,
ACE_Time_Value now (ACE_High_Res_Timer::gettimeofday_hr());
ACE_Time_Value delay = next - now;
++this->token_;
+ ACE_DEBUG ((LM_DEBUG, "LiveCheck::handle_timeout schdeuling next (tok = %d) - in %d ms \n",
+ this->token_, delay.msec()));
this->reactor()->schedule_timer (this, reinterpret_cast<void *>(this->token_), delay);
}
@@ -450,6 +480,9 @@ LiveCheck::add_per_client_listener (LiveListener *l,
entry->add_listener (l);
++this->token_;
+ ACE_DEBUG ((LM_DEBUG,
+ "LiveCheck::add_per_client_listener schdeuling next (tok = %d) now\n",
+ this->token_));
this->reactor()->schedule_timer (this,
reinterpret_cast<void *>(this->token_),
ACE_Time_Value::zero);
@@ -486,6 +519,9 @@ LiveCheck::schedule_ping (LiveEntry *entry)
LiveStatus status = entry->status();
if (status == LS_PING_AWAY || status == LS_DEAD)
{
+ ACE_DEBUG ((LM_DEBUG,
+ "LiveCheck::schedule_ping ignoring, status = %d\n",
+ status));
return;
}
@@ -494,6 +530,9 @@ LiveCheck::schedule_ping (LiveEntry *entry)
++this->token_;
if (next <= now)
{
+ ACE_DEBUG ((LM_DEBUG,
+ "LiveCheck::schedule_ping (tok = %d) - immediate \n",
+ this->token_));
this->reactor()->schedule_timer (this,
reinterpret_cast<void *>(this->token_),
ACE_Time_Value::zero);
@@ -501,6 +540,9 @@ LiveCheck::schedule_ping (LiveEntry *entry)
else
{
ACE_Time_Value delay = next - now;
+ ACE_DEBUG ((LM_DEBUG,
+ "LiveCheck::schedule_ping (tok = %d) - in %dms \n",
+ this->token_, delay.msec()));
this->reactor()->schedule_timer (this,
reinterpret_cast<void *>(this->token_),
delay);
diff --git a/TAO/orbsvcs/ImplRepo_Service/Locator_Repository.cpp b/TAO/orbsvcs/ImplRepo_Service/Locator_Repository.cpp
index 9dcc0d4383b..fd18d93299d 100644
--- a/TAO/orbsvcs/ImplRepo_Service/Locator_Repository.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/Locator_Repository.cpp
@@ -444,11 +444,17 @@ UpdateableServerInfo::UpdateableServerInfo (
}
UpdateableServerInfo::UpdateableServerInfo (Locator_Repository* repo,
- const Server_Info_Ptr& si)
+ const Server_Info_Ptr& si,
+ bool reset_start_count)
: repo_(repo),
si_(si),
needs_update_(false)
{
+ if (reset_start_count)
+ {
+ needs_update_ = repo_ != 0;
+ si_->start_count = 0;
+ }
}
UpdateableServerInfo::UpdateableServerInfo (const Server_Info& si)
diff --git a/TAO/orbsvcs/ImplRepo_Service/Locator_Repository.h b/TAO/orbsvcs/ImplRepo_Service/Locator_Repository.h
index f9ab1888e63..d38a66525a5 100644
--- a/TAO/orbsvcs/ImplRepo_Service/Locator_Repository.h
+++ b/TAO/orbsvcs/ImplRepo_Service/Locator_Repository.h
@@ -214,7 +214,9 @@ public:
/// constructor
/// @param repo the repo to report updates to
/// @param si an already retrieved Server_Info_Ptr
- UpdateableServerInfo(Locator_Repository* repo, const Server_Info_Ptr& si);
+ UpdateableServerInfo(Locator_Repository* repo,
+ const Server_Info_Ptr& si,
+ bool reset_start_count = false);
/// constructor (no repo updates will be performed)
/// @param si a Server_Info to create a non-stored Server_Info_Ptr from
diff --git a/TAO/tao/Adapter.h b/TAO/tao/Adapter.h
index 6a0fd845adc..c0185c7e32a 100644
--- a/TAO/tao/Adapter.h
+++ b/TAO/tao/Adapter.h
@@ -86,7 +86,12 @@ public:
/// Forward the request to another object reference, this decouples
/// the ORB from the PortableServer::ForwardRequest exception
- DS_FORWARD
+ DS_FORWARD,
+
+ /// The request will be forwarded, but using an async call to locate
+ /// the target. Some other entity will actually complete the forward
+ /// or fail.
+ DS_DEFERRED_FORWARD
};
/// Return the name, i.e. the object id used to resolve it in the
diff --git a/TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.cpp b/TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.cpp
index 82d61a2c887..85634b6c6e1 100644
--- a/TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.cpp
+++ b/TAO/tao/DynamicInterface/AMH_DSI_Response_Handler.cpp
@@ -289,6 +289,7 @@ TAO_AMH_DSI_Exception_Holder::_tao_unmarshal (
void
TAO_AMH_DSI_Exception_Holder::raise_invoke ()
{
+ auto_ptr< ::CORBA::Exception> safety (this->exception_);
this->exception_->_raise ();
}
diff --git a/TAO/tao/IORTable/IORTable.h b/TAO/tao/IORTable/IORTable.h
index 7bae99afdb1..f29071c3d3f 100644
--- a/TAO/tao/IORTable/IORTable.h
+++ b/TAO/tao/IORTable/IORTable.h
@@ -40,6 +40,7 @@ TAO_Requires_IORTable_Initializer = TAO_IORTable_Initializer::init ();
TAO_END_VERSIONED_NAMESPACE_DECL
#define TAO_IORTABLE_SAFE_INCLUDE
+#include "tao/IORTable/Locate_ResponseHandler.h"
#include "tao/IORTable/IORTableC.h"
#undef TAO_IORTABLE_SAFE_INCLUDE
diff --git a/TAO/tao/IORTable/IORTable.mpc b/TAO/tao/IORTable/IORTable.mpc
index 7ab07c8d446..b2dd0ab5d6f 100644
--- a/TAO/tao/IORTable/IORTable.mpc
+++ b/TAO/tao/IORTable/IORTable.mpc
@@ -17,7 +17,7 @@ project(*core_idl) : tao_versioning_idl_defaults, install {
}
}
-project(IORTable) : taolib, tao_output, install, taoidldefaults {
+project(IORTable) : taolib, portableserver, dynamicinterface, tao_output, install, taoidldefaults {
after += *core_idl
sharedname = TAO_IORTable
dynamicflags += TAO_IORTable_BUILD_DLL
diff --git a/TAO/tao/IORTable/IORTable.pidl b/TAO/tao/IORTable/IORTable.pidl
index 3725767eaf7..0088477dcd6 100644
--- a/TAO/tao/IORTable/IORTable.pidl
+++ b/TAO/tao/IORTable/IORTable.pidl
@@ -64,6 +64,20 @@ module IORTable
string locate (in string object_key)
raises (NotFound);
};
+
+ /// Callback interface to locate object keys dynamically
+ /**
+ * The application can provide a callback interface to locate object
+ * keys dynamically.
+ */
+ native Locate_ResponseHandler;
+ local interface AsyncLocator : Locator
+ {
+ /// Uses AMH semantics to send IOR for @a object_key via the supplied
+ /// response handler
+ void async_locate (in Locate_ResponseHandler rh, in string object_key);
+
+ };
};
#endif /* TAO_IORTABLE_IORTABLE_PIDL */
diff --git a/TAO/tao/IORTable/IOR_Table_Impl.cpp b/TAO/tao/IORTable/IOR_Table_Impl.cpp
index 64e1ead30b5..664e60231eb 100644
--- a/TAO/tao/IORTable/IOR_Table_Impl.cpp
+++ b/TAO/tao/IORTable/IOR_Table_Impl.cpp
@@ -8,6 +8,8 @@
*/
#include "tao/IORTable/IOR_Table_Impl.h"
+#include "tao/PortableServer/ForwardRequestC.h"
+#include "tao/DynamicInterface/AMH_DSI_Response_Handler.h"
#include "ace/Guard_T.h"
TAO_BEGIN_VERSIONED_NAMESPACE_DECL
@@ -43,6 +45,7 @@ TAO::Objref_Traits <TAO_IOR_Table_Impl>::marshal (const TAO_IOR_Table_Impl_ptr,
}
TAO_IOR_Table_Impl::TAO_IOR_Table_Impl (void)
+ : use_async_(false)
{
}
@@ -68,6 +71,32 @@ TAO_IOR_Table_Impl::find (const char *object_key)
}
void
+TAO_IOR_Table_Impl::async_find (::IORTable::Locate_ResponseHandler handler,
+ const char *object_key)
+{
+ // We don't want the lock held during locate, so make it go out
+ // of scope before then.
+ {
+ ACE_CString key (object_key);
+ ACE_CString ior;
+ TAO_AMH_Locate_ResponseHandler_var rh = handler;
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+ if (this->map_.find (key, ior) == 0)
+ {
+ rh->forward_ior (ior.c_str(), false);
+ return;
+ }
+ if (CORBA::is_nil (this->async_locator_.in ()))
+ {
+ rh->raise_excep (IORTable::NotFound ());
+ return;
+ }
+ }
+
+ this->async_locator_->async_locate (handler, object_key);
+}
+
+void
TAO_IOR_Table_Impl::bind (const char * object_key, const char * IOR)
{
ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
@@ -95,6 +124,8 @@ TAO_IOR_Table_Impl::set_locator (IORTable::Locator_ptr locator)
{
ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
this->locator_ = IORTable::Locator::_duplicate (locator);
+ this->async_locator_ = IORTable::AsyncLocator::_narrow (locator);
+ this->use_async_ = !CORBA::is_nil (this->async_locator_.in());
}
TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/tao/IORTable/IOR_Table_Impl.h b/TAO/tao/IORTable/IOR_Table_Impl.h
index 275a4dd3eea..19c24eb0dda 100644
--- a/TAO/tao/IORTable/IOR_Table_Impl.h
+++ b/TAO/tao/IORTable/IOR_Table_Impl.h
@@ -54,9 +54,17 @@ public:
/// Constructor
TAO_IOR_Table_Impl (void);
+ bool async_available (void) const
+ {
+ return this->use_async_;
+ }
+
/// Find the object, using the locator if it is not on the table.
char *find (const char *object_key);
+ void async_find (::IORTable::Locate_ResponseHandler rh,
+ const char *object_key);
+
/**
* @name The IORTable::Table methods
*
@@ -83,6 +91,8 @@ private:
/// The locator
IORTable::Locator_var locator_;
+ IORTable::AsyncLocator_var async_locator_;
+ bool use_async_;
/// Synchronization
TAO_SYNCH_MUTEX lock_;
diff --git a/TAO/tao/IORTable/Locate_ResponseHandler.cpp b/TAO/tao/IORTable/Locate_ResponseHandler.cpp
new file mode 100644
index 00000000000..4f72e2142c0
--- /dev/null
+++ b/TAO/tao/IORTable/Locate_ResponseHandler.cpp
@@ -0,0 +1,418 @@
+// -*- C++ -*-
+//=============================================================================
+/**
+ * @file Locate_ResponseHandler.cpp
+ *
+ * $Id$
+ *
+ * @author Phil Mesnier <mesnier_p@ociweb>
+ */
+//=============================================================================
+
+#include "Locate_ResponseHandler.h"
+#if 0
+#include "tao/DynamicInterface/Request.h"
+#include "tao/DynamicInterface/ExceptionList.h"
+#include "tao/DynamicInterface/DII_Invocation.h"
+#include "tao/DynamicInterface/Server_Request.h"
+#endif
+
+#include "tao/Exception.h"
+#include "tao/ORB_Core.h"
+#include "tao/GIOP_Utils.h"
+#include "tao/PortableServer/Root_POA.h"
+//#include "tao/Valuetype/ValueFactory.h"
+#include "tao/Object.h"
+#include "tao/Pluggable_Messaging_Utils.h"
+//#include "tao/AnyTypeCode/Any_Impl.h"
+
+#if !defined (__ACE_INLINE__)
+# include "Locate_ResponseHandler.inl"
+#endif /* ! __ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+#if 0
+const char*
+TAO_AMH_DSI_Exception_Holder::_tao_obv_static_repository_id ()
+{
+ return "IDL:TAO_AMH_DSI_Exception_Holder:1.0";
+}
+
+TAO_AMH_DSI_Exception_Holder::TAO_AMH_DSI_Exception_Holder (CORBA::Exception *ex)
+ : exception_ (ex)
+{
+}
+
+TAO_AMH_DSI_Exception_Holder::~TAO_AMH_DSI_Exception_Holder ()
+{
+}
+
+void
+tao_TAO_AMH_DSI_Exception_Holder_add_ref (TAO_AMH_DSI_Exception_Holder * p)
+{
+ CORBA::add_ref (p);
+}
+
+void
+tao_TAO_AMH_DSI_Exception_Holder_remove_ref (TAO_AMH_DSI_Exception_Holder * p)
+{
+ CORBA::remove_ref (p);
+}
+
+
+TAO_AMH_DSI_Exception_Holder_var::TAO_AMH_DSI_Exception_Holder_var (void)
+ : ptr_ (0)
+{
+}
+
+TAO_AMH_DSI_Exception_Holder_var::TAO_AMH_DSI_Exception_Holder_var (
+ TAO_AMH_DSI_Exception_Holder * p)
+ : ptr_ (p)
+{
+}
+
+TAO_AMH_DSI_Exception_Holder_var::TAO_AMH_DSI_Exception_Holder_var (
+ const TAO_AMH_DSI_Exception_Holder * p)
+ : ptr_ (const_cast<TAO_AMH_DSI_Exception_Holder *> (p))
+{
+}
+
+TAO_AMH_DSI_Exception_Holder *
+TAO_AMH_DSI_Exception_Holder_var::ptr (void) const
+{
+ return this->ptr_;
+}
+
+TAO_AMH_DSI_Exception_Holder_var::TAO_AMH_DSI_Exception_Holder_var (
+ const TAO_AMH_DSI_Exception_Holder_var & p)
+{
+ CORBA::add_ref (p.ptr ());
+ this->ptr_ = p.ptr ();
+}
+
+TAO_AMH_DSI_Exception_Holder_var::~TAO_AMH_DSI_Exception_Holder_var (void)
+{
+ CORBA::remove_ref (this->ptr_);
+}
+
+TAO_AMH_DSI_Exception_Holder_var &
+TAO_AMH_DSI_Exception_Holder_var::operator= (TAO_AMH_DSI_Exception_Holder *p)
+{
+ CORBA::remove_ref (this->ptr_);
+ this->ptr_ = p;
+ return *this;
+}
+
+TAO_AMH_DSI_Exception_Holder_var &
+TAO_AMH_DSI_Exception_Holder_var::operator= (
+ const TAO_AMH_DSI_Exception_Holder_var & p)
+{
+ if (this != &p)
+ {
+ CORBA::remove_ref (this->ptr_);
+ TAO_AMH_DSI_Exception_Holder *tmp = p.ptr ();
+ CORBA::add_ref (tmp);
+ this->ptr_ = tmp;
+ }
+
+ return *this;
+}
+
+TAO_AMH_DSI_Exception_Holder_var::operator const TAO_AMH_DSI_Exception_Holder* (
+ ) const // cast
+{
+ return this->ptr_;
+}
+
+TAO_AMH_DSI_Exception_Holder_var::operator TAO_AMH_DSI_Exception_Holder*& ()
+{
+ return this->ptr_;
+}
+
+TAO_AMH_DSI_Exception_Holder *
+TAO_AMH_DSI_Exception_Holder_var::operator-> (void) const
+{
+ return this->ptr_;
+}
+
+TAO_AMH_DSI_Exception_Holder *
+TAO_AMH_DSI_Exception_Holder_var::in (void) const
+{
+ return this->ptr_;
+}
+
+TAO_AMH_DSI_Exception_Holder *&
+TAO_AMH_DSI_Exception_Holder_var::inout (void)
+{
+ return this->ptr_;
+}
+
+TAO_AMH_DSI_Exception_Holder *&
+TAO_AMH_DSI_Exception_Holder_var::out (void)
+{
+ CORBA::remove_ref (this->ptr_);
+ this->ptr_ = 0;
+ return this->ptr_;
+}
+
+TAO_AMH_DSI_Exception_Holder *
+TAO_AMH_DSI_Exception_Holder_var::_retn (void)
+{
+ // yield ownership of managed obj reference
+ TAO_AMH_DSI_Exception_Holder* tmp = this->ptr_;
+ this->ptr_ = 0;
+ return tmp;
+}
+
+void
+TAO_AMH_DSI_Exception_Holder_var::tao_add_ref (TAO_AMH_DSI_Exception_Holder *p)
+{
+ CORBA::add_ref (p);
+}
+
+void
+TAO_AMH_DSI_Exception_Holder_var::tao_remove_ref (
+ TAO_AMH_DSI_Exception_Holder *p)
+{
+ CORBA::remove_ref (p);
+}
+
+TAO_AMH_DSI_Exception_Holder_out::TAO_AMH_DSI_Exception_Holder_out (
+ TAO_AMH_DSI_Exception_Holder * &p)
+ : ptr_ (p)
+{
+ this->ptr_ = 0;
+}
+
+TAO_AMH_DSI_Exception_Holder_out::TAO_AMH_DSI_Exception_Holder_out (
+ TAO_AMH_DSI_Exception_Holder_var & p)
+ : ptr_ (p.out ())
+{
+ CORBA::remove_ref (this->ptr_);
+ this->ptr_ = 0;
+}
+
+TAO_AMH_DSI_Exception_Holder_out::TAO_AMH_DSI_Exception_Holder_out (
+ const TAO_AMH_DSI_Exception_Holder_out &p)
+ : ptr_ (const_cast<TAO_AMH_DSI_Exception_Holder_out&> (p).ptr_)
+{}
+
+TAO_AMH_DSI_Exception_Holder_out &
+TAO_AMH_DSI_Exception_Holder_out::operator= (
+ const TAO_AMH_DSI_Exception_Holder_out &p)
+{
+ this->ptr_ = const_cast<TAO_AMH_DSI_Exception_Holder_out &> (p).ptr_;
+ return *this;
+}
+
+TAO_AMH_DSI_Exception_Holder_out &
+TAO_AMH_DSI_Exception_Holder_out::operator= (
+ const TAO_AMH_DSI_Exception_Holder_var &p)
+{
+ TAO_AMH_DSI_Exception_Holder *tmp = p.ptr ();
+ CORBA::add_ref (tmp);
+ this->ptr_ = tmp;
+ return *this;
+}
+
+TAO_AMH_DSI_Exception_Holder_out &
+TAO_AMH_DSI_Exception_Holder_out::operator= (TAO_AMH_DSI_Exception_Holder *p)
+{
+ this->ptr_ = p;
+ return *this;
+}
+
+TAO_AMH_DSI_Exception_Holder_out::operator TAO_AMH_DSI_Exception_Holder*& ()
+{
+ return this->ptr_;
+}
+
+TAO_AMH_DSI_Exception_Holder *&
+TAO_AMH_DSI_Exception_Holder_out::ptr (void) // ptr
+{
+ return this->ptr_;
+}
+
+TAO_AMH_DSI_Exception_Holder *
+TAO_AMH_DSI_Exception_Holder_out::operator-> (void)
+{
+ return this->ptr_;
+}
+
+TAO_AMH_DSI_Exception_Holder *
+TAO_AMH_DSI_Exception_Holder::_downcast (CORBA::ValueBase * v)
+{
+ return dynamic_cast < TAO_AMH_DSI_Exception_Holder * >(v);
+}
+
+const char *
+TAO_AMH_DSI_Exception_Holder::_tao_obv_repository_id (void) const
+{
+ return this->_tao_obv_static_repository_id ();
+}
+
+void
+TAO_AMH_DSI_Exception_Holder::_tao_any_destructor (void *_tao_void_pointer)
+{
+ TAO_AMH_DSI_Exception_Holder *tmp =
+ static_cast<TAO_AMH_DSI_Exception_Holder *> (_tao_void_pointer);
+ delete tmp;
+}
+
+CORBA::Boolean
+TAO_AMH_DSI_Exception_Holder::_tao_unmarshal (
+ TAO_InputCDR &strm,
+ TAO_AMH_DSI_Exception_Holder *&new_object)
+{
+ ::CORBA::ValueBase *base = 0;
+ ::CORBA::Boolean is_indirected = 0;
+ ::CORBA::Boolean is_null_object = 0;
+ ::CORBA::Boolean const retval =
+ ::CORBA::ValueBase::_tao_unmarshal_pre (
+ strm,
+ base,
+ TAO_AMH_DSI_Exception_Holder::_tao_obv_static_repository_id (),
+ is_null_object,
+ is_indirected
+ );
+
+ ::CORBA::ValueBase_var owner (base);
+
+ if (!retval)
+ return 0;
+
+ if (is_null_object)
+ return 1;
+
+ if (!is_indirected && base != 0 && ! base->_tao_unmarshal_v (strm))
+ return 0;
+
+
+ // Now base must be null or point to the unmarshaled object.
+ // Align the pointer to the right subobject.
+ new_object = TAO_AMH_DSI_Exception_Holder::_downcast (base);
+ if (is_indirected)
+ new_object->_add_ref ();
+
+ owner._retn ();
+ return 1;
+}
+
+void
+TAO_AMH_DSI_Exception_Holder::raise_invoke ()
+{
+ this->exception_->_raise ();
+}
+#endif
+
+// The pseudo-object _nil method.
+TAO_AMH_Locate_ResponseHandler_ptr
+TAO_AMH_Locate_ResponseHandler::_nil (void)
+{
+ return (TAO_AMH_Locate_ResponseHandler_ptr) 0;
+}
+
+
+TAO_AMH_Locate_ResponseHandler::TAO_AMH_Locate_ResponseHandler (
+ TAO_ServerRequest & sr)
+ : TAO_AMH_Response_Handler ()
+{
+ this->init (sr,0);
+}
+
+TAO_AMH_Locate_ResponseHandler::~TAO_AMH_Locate_ResponseHandler (void)
+{
+}
+
+void
+TAO_AMH_Locate_ResponseHandler::raise_excep (const CORBA::Exception &ex)
+{
+ this->_tao_rh_send_exception (ex);
+}
+
+void
+TAO_AMH_Locate_ResponseHandler::forward_ior (const char *ior, CORBA::Boolean is_perm)
+{
+ CORBA::ORB_var orb = this->orb_core_->orb();
+ CORBA::Object_var fwd = orb->string_to_object (ior);
+ this->_tao_rh_send_location_forward (fwd, is_perm);
+}
+
+
+void *
+TAO_AMH_Locate_ResponseHandler::_downcast (const char *)
+{
+ return this;
+}
+
+TAO_AMH_Locate_ResponseHandler_ptr
+TAO_AMH_Locate_ResponseHandler::_narrow (CORBA::Object_ptr obj)
+{
+ return TAO_AMH_Locate_ResponseHandler::_unchecked_narrow (obj);
+}
+
+TAO_AMH_Locate_ResponseHandler_ptr
+TAO_AMH_Locate_ResponseHandler::_unchecked_narrow (CORBA::Object_ptr obj)
+{
+ if (CORBA::is_nil (obj))
+ return TAO_AMH_Locate_ResponseHandler::_nil ();
+
+ return dynamic_cast < TAO_AMH_Locate_ResponseHandler_ptr > (obj);
+}
+
+const char*
+TAO_AMH_Locate_ResponseHandler::_interface_repository_id (void) const
+{
+ return 0;
+}
+
+#if 0
+
+CORBA::TypeCode_ptr
+TAO_AMH_DSI_Exception_Holder::_tao_type (void) const
+{
+ return 0;
+}
+
+void
+TAO_AMH_DSI_Exception_Holder::_tao_obv_truncatable_repo_ids (
+ Repository_Id_List &) const
+{
+}
+
+CORBA::Boolean
+TAO_AMH_DSI_Exception_Holder::_tao_match_formal_type (ptrdiff_t ) const
+{
+ return false;
+}
+
+CORBA::Boolean
+TAO_AMH_DSI_Exception_Holder::_tao_marshal_v (TAO_OutputCDR &) const
+{
+ return true;
+}
+
+CORBA::Boolean
+TAO_AMH_DSI_Exception_Holder::_tao_unmarshal_v (TAO_InputCDR &)
+{
+ return true;
+}
+
+CORBA::Boolean
+TAO_AMH_DSI_Exception_Holder::_tao_marshal__Test_TAO_AMH_DSI_Exception_Holder (
+ TAO_OutputCDR &)
+{
+ return true;
+}
+
+CORBA::Boolean
+TAO_AMH_DSI_Exception_Holder::_tao_unmarshal__Test_TAO_AMH_DSI_Exception_Holder (
+ TAO_InputCDR &)
+{
+ return true;
+}
+
+#endif
+
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/tao/IORTable/Locate_ResponseHandler.h b/TAO/tao/IORTable/Locate_ResponseHandler.h
new file mode 100644
index 00000000000..49d9f69ce2f
--- /dev/null
+++ b/TAO/tao/IORTable/Locate_ResponseHandler.h
@@ -0,0 +1,272 @@
+// -*- C++ -*-
+
+
+//=============================================================================
+/**
+ * @file Locate_ResponseHandler.h
+ *
+ * $Id$
+ *
+ * @author Phil Mesnier <mesnier_p@ociweb>
+ */
+//=============================================================================
+
+
+#ifndef TAO_LOCATE_RESPONSEHANDLER_H
+#define TAO_LOCATE_RESPONSEHANDLER_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/orbconf.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "iortable_export.h"
+#include "tao/Versioned_Namespace.h"
+#include "tao/Messaging/AMH_Response_Handler.h"
+#include "tao/Valuetype/ValueBase.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+namespace CORBA
+{
+ class Exception;
+}
+
+class TAO_AMH_Locate_ResponseHandler;
+typedef
+typedef TAO_AMH_Locate_ResponseHandler *TAO_AMH_Locate_ResponseHandler_ptr;
+
+/**
+ * @class TAO_AMH_Locate_ResponseHandler_var
+ *
+ * @brief The T_var class for response handler
+ *
+ * As any other pseudo object, this class has a T_var class too.
+ *
+ */
+class TAO_IORTable_Export TAO_AMH_Locate_ResponseHandler_var
+{
+public:
+ TAO_AMH_Locate_ResponseHandler_var (void);
+ TAO_AMH_Locate_ResponseHandler_var (TAO_AMH_Locate_ResponseHandler_ptr);
+ TAO_AMH_Locate_ResponseHandler_var (
+ const TAO_AMH_Locate_ResponseHandler_var &);
+ ~TAO_AMH_Locate_ResponseHandler_var (void);
+
+ TAO_AMH_Locate_ResponseHandler_var &operator= (
+ TAO_AMH_Locate_ResponseHandler_ptr);
+ TAO_AMH_Locate_ResponseHandler_var &operator= (
+ const TAO_AMH_Locate_ResponseHandler_var &);
+ TAO_AMH_Locate_ResponseHandler_ptr operator-> (void) const;
+
+ operator const TAO_AMH_Locate_ResponseHandler_ptr &() const;
+ operator TAO_AMH_Locate_ResponseHandler_ptr &();
+
+ TAO_AMH_Locate_ResponseHandler_ptr in (void) const;
+ TAO_AMH_Locate_ResponseHandler_ptr &inout (void);
+ TAO_AMH_Locate_ResponseHandler_ptr &out (void);
+ TAO_AMH_Locate_ResponseHandler_ptr _retn (void);
+ TAO_AMH_Locate_ResponseHandler_ptr ptr (void) const;
+
+private:
+ TAO_AMH_Locate_ResponseHandler_ptr ptr_;
+};
+
+#if 0
+class TAO_AMH_Locate_Exception_Holder;
+typedef TAO_AMH_Locate_Exception_Holder *TAO_AMH_Locate_Exception_Holder_ptr;
+
+/**
+ * @class TAO_AMH_Locate_Exception_Holder_var
+ *
+ * @brief The T_var class for exception holder
+ *
+ * As any other pseudo object, this class has a T_var class too.
+ *
+ */
+class TAO_IORTable_Export TAO_AMH_Locate_Exception_Holder_var
+{
+public:
+ TAO_AMH_Locate_Exception_Holder_var (void);
+ TAO_AMH_Locate_Exception_Holder_var (TAO_AMH_Locate_Exception_Holder*);
+ TAO_AMH_Locate_Exception_Holder_var (const TAO_AMH_Locate_Exception_Holder*);
+ TAO_AMH_Locate_Exception_Holder_var (const TAO_AMH_Locate_Exception_Holder_var &);
+ ~TAO_AMH_Locate_Exception_Holder_var (void);
+
+ TAO_AMH_Locate_Exception_Holder_var &operator= (TAO_AMH_Locate_Exception_Holder*);
+ TAO_AMH_Locate_Exception_Holder_var &operator= (
+ const TAO_AMH_Locate_Exception_Holder_var &);
+ TAO_AMH_Locate_Exception_Holder* operator-> (void) const;
+
+ operator const TAO_AMH_Locate_Exception_Holder* () const;
+ operator TAO_AMH_Locate_Exception_Holder*& ();
+
+ TAO_AMH_Locate_Exception_Holder* in (void) const;
+ TAO_AMH_Locate_Exception_Holder*& inout (void);
+ TAO_AMH_Locate_Exception_Holder*& out (void);
+ TAO_AMH_Locate_Exception_Holder* _retn (void);
+ TAO_AMH_Locate_Exception_Holder* ptr (void) const;
+
+ // Hooks used by template sequence and valuetype manager classes
+ // for non-defined forward declared valuetypes.
+ static void tao_add_ref (TAO_AMH_Locate_Exception_Holder *);
+ static void tao_remove_ref (TAO_AMH_Locate_Exception_Holder *);
+
+private:
+ TAO_AMH_Locate_Exception_Holder* ptr_;
+};
+
+/**
+ * @class TAO_AMH_Locate_Exception_Holder_out
+ *
+ * @brief The T_out class for exception holder
+ *
+ */
+class TAO_IORTable_Export TAO_AMH_Locate_Exception_Holder_out
+{
+public:
+ TAO_AMH_Locate_Exception_Holder_out (TAO_AMH_Locate_Exception_Holder* &);
+ TAO_AMH_Locate_Exception_Holder_out (TAO_AMH_Locate_Exception_Holder_var &);
+ TAO_AMH_Locate_Exception_Holder_out (const TAO_AMH_Locate_Exception_Holder_out &);
+ TAO_AMH_Locate_Exception_Holder_out &operator= (
+ const TAO_AMH_Locate_Exception_Holder_out &);
+ TAO_AMH_Locate_Exception_Holder_out &operator= (
+ const TAO_AMH_Locate_Exception_Holder_var &);
+ TAO_AMH_Locate_Exception_Holder_out &operator= (
+ TAO_AMH_Locate_Exception_Holder*);
+ operator TAO_AMH_Locate_Exception_Holder*& ();
+ TAO_AMH_Locate_Exception_Holder*& ptr (void);
+ TAO_AMH_Locate_Exception_Holder* operator-> (void);
+
+private:
+ TAO_AMH_Locate_Exception_Holder* &ptr_;
+};
+
+/**
+ * @class TAO_AMH_Locate_Exception_Holder
+ *
+ * @brief This is the class for holding exception.
+ *
+ */
+class TAO_IORTable_Export TAO_AMH_Locate_Exception_Holder
+ : public virtual CORBA::DefaultValueRefCountBase,
+ public virtual CORBA::ValueBase
+{
+public:
+ typedef TAO_AMH_Locate_Exception_Holder_var _var_type;
+ TAO_AMH_Locate_Exception_Holder (CORBA::Exception *ex);
+
+ virtual ~TAO_AMH_Locate_Exception_Holder (void);
+
+ static TAO_AMH_Locate_Exception_Holder* _downcast ( CORBA::ValueBase* );
+
+ static CORBA::Boolean _tao_unmarshal ( TAO_InputCDR &,
+ TAO_AMH_Locate_Exception_Holder *& );
+ virtual const char* _tao_obv_repository_id (void) const;
+ static const char* _tao_obv_static_repository_id (void);
+
+ static void _tao_any_destructor (void *);
+
+ virtual void raise_invoke ( );
+
+ CORBA::TypeCode_ptr _tao_type (void) const;
+ void _tao_obv_truncatable_repo_ids (Repository_Id_List &) const;
+ CORBA::Boolean _tao_match_formal_type (ptrdiff_t ) const;
+
+protected:
+ TAO_AMH_Locate_Exception_Holder (void);
+ /// *** Terrible Hack ? ***
+ virtual CORBA::Boolean _tao_marshal_v (TAO_OutputCDR &) const;
+ virtual CORBA::Boolean _tao_unmarshal_v (TAO_InputCDR &);
+
+private:
+ TAO_AMH_Locate_Exception_Holder (const TAO_AMH_Locate_Exception_Holder &);
+ void operator= (const TAO_AMH_Locate_Exception_Holder &);
+ CORBA::Exception *exception_;
+
+protected:
+ virtual CORBA::Boolean _tao_marshal__Test_TAO_AMH_Locate_Exception_Holder (
+ TAO_OutputCDR &);
+ virtual CORBA::Boolean _tao_unmarshal__Test_TAO_AMH_Locate_Exception_Holder (
+ TAO_InputCDR &);
+};
+
+#endif
+
+/**
+ * @class TAO_AMH_Locate_ResponseHandler
+ *
+ * @brief This is the main class for DSI using AMH.
+ *
+ * With ordinary DSI, the POA calls _dispatch, which in turn calls invoke
+ * on the DSI handler. Invoke completely handles the request, and packages
+ * the result in the request object so that it can be marshalled and sent
+ * back to the caller.
+ *
+ * With the AMH variation, the DSI handler's invoke method starts the
+ * processing, but delegates the result packaging to a response handler.
+ * This way, if the invocation takes a long time, or involves blocking
+ * calls, then the result handling can be managed by another thread.
+ * This is particularly useful for gateway implementations, where the
+ * middle tier should not have to block waiting for replies.
+ *
+ * As this is built on the CORBA object model, there are separate classes
+ * representing the interface and the implementation.
+ *
+ */
+class TAO_IORTable_Export TAO_AMH_Locate_ResponseHandler
+ : public virtual TAO_AMH_Response_Handler
+{
+public:
+ typedef TAO_AMH_Locate_ResponseHandler_ptr _ptr_type;
+ typedef TAO_AMH_Locate_ResponseHandler_var _var_type;
+
+ TAO_AMH_Locate_ResponseHandler (TAO_ServerRequest &sr);
+ ~TAO_AMH_Locate_ResponseHandler (void);
+
+ virtual void raise_excep (const CORBA::Exception &ex);
+
+ virtual void forward_ior (const char *ior, CORBA::Boolean is_perm);
+
+ /// Returns a CORBA::Object_ptr for the target object.
+ CORBA::Object_ptr _this ();
+
+ /// CORBA Object related methods
+ static TAO_AMH_Locate_ResponseHandler* _duplicate (
+ TAO_AMH_Locate_ResponseHandler_ptr);
+ static TAO_AMH_Locate_ResponseHandler* _nil (void);
+ static TAO_AMH_Locate_ResponseHandler* _narrow (CORBA::Object_ptr);
+ static TAO_AMH_Locate_ResponseHandler* _unchecked_narrow (CORBA::Object_ptr);
+
+protected:
+
+ /// Return 0. Should never be used.
+ virtual const char *_interface_repository_id (void) const;
+
+ /// Simply returns "this"
+ virtual void *_downcast (const char *repository_id);
+
+private:
+ TAO_ORB_Core *orb_core_;
+};
+
+
+namespace IORTable
+{
+ // satisfy the native type requirement for the asnyc locate interface
+ typedef const TAO_AMH_Locate_ResponseHandler_var &Locate_ResponseHandler;
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "Locate_ResponseHandler.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_LOCATE_RESPONSEHANDLER_H */
diff --git a/TAO/tao/IORTable/Locate_ResponseHandler.inl b/TAO/tao/IORTable/Locate_ResponseHandler.inl
new file mode 100644
index 00000000000..ea0497f7d37
--- /dev/null
+++ b/TAO/tao/IORTable/Locate_ResponseHandler.inl
@@ -0,0 +1,112 @@
+// -*- C++ -*-
+// $Id$
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE TAO_AMH_Locate_ResponseHandler_ptr
+TAO_AMH_Locate_ResponseHandler::_duplicate (TAO_AMH_Locate_ResponseHandler_ptr x)
+{
+ if (x != 0)
+ {
+ x->_add_ref ();
+ }
+
+ return x;
+}
+
+
+// Inline operations for class TAO_AMH_Locate_ResponseHandler_var
+ACE_INLINE
+TAO_AMH_Locate_ResponseHandler_var::TAO_AMH_Locate_ResponseHandler_var (void)
+ : ptr_ (TAO_AMH_Locate_ResponseHandler::_nil ())
+{
+}
+
+ACE_INLINE
+TAO_AMH_Locate_ResponseHandler_var::TAO_AMH_Locate_ResponseHandler_var (TAO_AMH_Locate_ResponseHandler_ptr p)
+ : ptr_ (p)
+{}
+
+ACE_INLINE
+TAO_AMH_Locate_ResponseHandler_var::~TAO_AMH_Locate_ResponseHandler_var (void)
+{
+ CORBA::release(ptr_);
+}
+
+ACE_INLINE TAO_AMH_Locate_ResponseHandler_ptr
+TAO_AMH_Locate_ResponseHandler_var::ptr (void) const
+{
+ return this->ptr_;
+}
+
+ACE_INLINE
+TAO_AMH_Locate_ResponseHandler_var::TAO_AMH_Locate_ResponseHandler_var (const TAO_AMH_Locate_ResponseHandler_var &p)
+ : ptr_ (TAO_AMH_Locate_ResponseHandler::_duplicate (p.ptr ()))
+{}
+
+ACE_INLINE TAO_AMH_Locate_ResponseHandler_var &
+TAO_AMH_Locate_ResponseHandler_var::operator= (TAO_AMH_Locate_ResponseHandler_ptr p)
+{
+ CORBA::release (this->ptr_);
+ this->ptr_ = p;
+ return *this;
+}
+
+ACE_INLINE TAO_AMH_Locate_ResponseHandler_var &
+TAO_AMH_Locate_ResponseHandler_var::operator= (const TAO_AMH_Locate_ResponseHandler_var &p)
+{
+ if (this != &p)
+ {
+ CORBA::release (this->ptr_);
+ this->ptr_ = TAO_AMH_Locate_ResponseHandler::_duplicate (p.ptr ());
+ }
+ return *this;
+}
+
+ACE_INLINE
+TAO_AMH_Locate_ResponseHandler_var::operator const TAO_AMH_Locate_ResponseHandler_ptr &() const
+{
+ return this->ptr_;
+}
+
+ACE_INLINE
+TAO_AMH_Locate_ResponseHandler_var::operator TAO_AMH_Locate_ResponseHandler_ptr &()
+{
+ return this->ptr_;
+}
+
+ACE_INLINE TAO_AMH_Locate_ResponseHandler_ptr
+TAO_AMH_Locate_ResponseHandler_var::operator-> (void) const
+{
+ return this->ptr_;
+}
+
+ACE_INLINE TAO_AMH_Locate_ResponseHandler_ptr
+TAO_AMH_Locate_ResponseHandler_var::in (void) const
+{
+ return this->ptr_;
+}
+
+ACE_INLINE TAO_AMH_Locate_ResponseHandler_ptr &
+TAO_AMH_Locate_ResponseHandler_var::inout (void)
+{
+ return this->ptr_;
+}
+
+ACE_INLINE TAO_AMH_Locate_ResponseHandler_ptr &
+TAO_AMH_Locate_ResponseHandler_var::out (void)
+{
+ CORBA::release (this->ptr_);
+ this->ptr_ = TAO_AMH_Locate_ResponseHandler::_nil ();
+ return this->ptr_;
+}
+
+ACE_INLINE TAO_AMH_Locate_ResponseHandler_ptr
+TAO_AMH_Locate_ResponseHandler_var::_retn (void)
+{
+ // yield ownership
+ TAO_AMH_Locate_ResponseHandler_ptr val = this->ptr_;
+ this->ptr_ = TAO_AMH_Locate_ResponseHandler::_nil ();
+ return val;
+}
+TAO_END_VERSIONED_NAMESPACE_DECL
diff --git a/TAO/tao/IORTable/Table_Adapter.cpp b/TAO/tao/IORTable/Table_Adapter.cpp
index 34634eae681..994ead28bdd 100644
--- a/TAO/tao/IORTable/Table_Adapter.cpp
+++ b/TAO/tao/IORTable/Table_Adapter.cpp
@@ -9,6 +9,8 @@
#include "tao/IORTable/Table_Adapter.h"
#include "tao/IORTable/IOR_Table_Impl.h"
+#include "tao/IORTable/Locate_ResponseHandler.h"
+
#include "tao/ORB_Core.h"
#include "tao/Server_Strategy_Factory.h"
#include "tao/Object.h"
@@ -93,6 +95,15 @@ TAO_Table_Adapter::dispatch (TAO::ObjectKey &key,
rootref = this->root_;
}
+ if (this->root_->async_available ())
+ {
+ // construct a callback handler
+ TAO_AMH_Locate_ResponseHandler_var rh;
+ ACE_NEW_RETURN (rh, TAO_AMH_Locate_ResponseHandler (request), DS_MISMATCHED_KEY);
+ this->find_object (rh, key);
+ return 0;
+ }
+
if (this->find_object (key, forward_to))
{
request.forward_location (forward_to);
@@ -189,6 +200,16 @@ TAO_Table_Adapter::find_object (TAO::ObjectKey &key,
return true;
}
+
+void
+TAO_Table_Adapter::find_object (IORTable::Locate_ResponseHandler rh,
+ TAO::ObjectKey &key)
+{
+ CORBA::String_var object_key;
+ TAO::ObjectKey::encode_sequence_to_string (object_key.out (), key);
+ root_->async_find (rh, object_key.in ());
+}
+
// ****************************************************************
TAO_Table_Adapter_Factory::TAO_Table_Adapter_Factory (void)
diff --git a/TAO/tao/IORTable/Table_Adapter.h b/TAO/tao/IORTable/Table_Adapter.h
index b0bef6fc05b..73b3a6d10b8 100644
--- a/TAO/tao/IORTable/Table_Adapter.h
+++ b/TAO/tao/IORTable/Table_Adapter.h
@@ -65,6 +65,10 @@ private:
bool find_object (TAO::ObjectKey &key,
CORBA::Object_out forward_to);
+ void find_object (::IORTable::Locate_ResponseHandler rh,
+ TAO::ObjectKey &key);
+
+
/// The ORB Core we belong to
TAO_ORB_Core &orb_core_;
diff --git a/TAO/tao/Messaging/AMH_Response_Handler.cpp b/TAO/tao/Messaging/AMH_Response_Handler.cpp
index bf2ea0b9bbd..8ef72f378fe 100644
--- a/TAO/tao/Messaging/AMH_Response_Handler.cpp
+++ b/TAO/tao/Messaging/AMH_Response_Handler.cpp
@@ -77,6 +77,7 @@ TAO_AMH_Response_Handler::init(TAO_ServerRequest &server_request,
response_expected_ = server_request.response_expected_;
transport_ = server_request.transport ();
orb_core_ = server_request.orb_core ();
+ ACE_DEBUG ((LM_DEBUG, "AMH_Response_Handler::init, orb_core_ = %x\n", orb_core_));
allocator_ = allocator;
TAO_GIOP_Message_Version v;
@@ -86,6 +87,12 @@ TAO_AMH_Response_Handler::init(TAO_ServerRequest &server_request,
this->transport_->add_reference ();
}
+TAO_ORB_Core *
+TAO_AMH_Response_Handler::orb_core (void) const
+{
+ return this->orb_core_;
+}
+
void
TAO_AMH_Response_Handler::_tao_rh_init_reply (void)
{
diff --git a/TAO/tao/Messaging/AMH_Response_Handler.h b/TAO/tao/Messaging/AMH_Response_Handler.h
index 12261a60cfa..0b4218679ae 100644
--- a/TAO/tao/Messaging/AMH_Response_Handler.h
+++ b/TAO/tao/Messaging/AMH_Response_Handler.h
@@ -89,6 +89,8 @@ public:
virtual void _remove_ref (void);
//@}
+ TAO_ORB_Core *orb_core (void) const;
+
protected:
/// Sets up the various parameters in anticipation of returning a reply
@@ -106,6 +108,7 @@ protected:
void _tao_rh_send_location_forward (CORBA::Object_ptr fwd,
CORBA::Boolean is_perm);
+
/// The outgoing CDR stream
/**
* The IDL-generated ResponseHandler implementations used this field