summaryrefslogtreecommitdiff
path: root/TAO/tao/Adapter_Registry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/Adapter_Registry.cpp')
-rw-r--r--TAO/tao/Adapter_Registry.cpp187
1 files changed, 187 insertions, 0 deletions
diff --git a/TAO/tao/Adapter_Registry.cpp b/TAO/tao/Adapter_Registry.cpp
new file mode 100644
index 00000000000..b927960ae3c
--- /dev/null
+++ b/TAO/tao/Adapter_Registry.cpp
@@ -0,0 +1,187 @@
+// $Id$
+
+#include "tao/Object.h"
+#include "tao/Stub.h"
+#include "tao/Adapter_Registry.h"
+#include "tao/Adapter.h"
+#include "tao/SystemException.h"
+#include "tao/debug.h"
+
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_string.h"
+#include "ace/CORBA_macros.h"
+
+ACE_RCSID (tao,
+ Adapter_Registry,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Adapter_Registry::TAO_Adapter_Registry (TAO_ORB_Core *oc)
+ : orb_core_ (oc),
+ adapters_capacity_ (16), // @@ Make it configurable
+ adapters_count_ (0),
+ adapters_ (0)
+{
+ ACE_NEW (this->adapters_,
+ TAO_Adapter*[this->adapters_capacity_]);
+}
+
+TAO_Adapter_Registry::~TAO_Adapter_Registry (void)
+{
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ delete this->adapters_[i];
+
+ delete[] this->adapters_;
+}
+
+void
+TAO_Adapter_Registry::close (int wait_for_completion)
+{
+ try
+ {
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ {
+ this->adapters_[i]->close (wait_for_completion);
+ }
+ }
+ catch (const::CORBA::Exception &ex)
+ {
+ if (TAO_debug_level > 3)
+ {
+ ex._tao_print_exception (
+ "Exception in TAO_Adapter_Registry::close ()");
+ }
+ return;
+ }
+
+ return;
+}
+
+void
+TAO_Adapter_Registry::check_close (int wait_for_completion)
+{
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ {
+ this->adapters_[i]->check_close (wait_for_completion);
+ }
+}
+
+void
+TAO_Adapter_Registry::insert (TAO_Adapter *adapter)
+{
+ if (this->adapters_capacity_ == this->adapters_count_)
+ {
+ this->adapters_capacity_ *= 2;
+ TAO_Adapter **tmp = 0;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_Adapter*[this->adapters_capacity_],
+ CORBA::NO_MEMORY ());
+
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ tmp[i] = this->adapters_[i];
+ delete[] this->adapters_;
+ this->adapters_ = tmp;
+ }
+
+ int const priority = adapter->priority ();
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ {
+ if (this->adapters_[i]->priority () >= priority)
+ {
+ for (size_t j = this->adapters_count_ + 1;
+ j > i;
+ --j)
+ {
+ this->adapters_[j] = this->adapters_[j - 1];
+ }
+ this->adapters_[i] = adapter;
+ ++this->adapters_count_;
+ return;
+ }
+ }
+ this->adapters_[this->adapters_count_++] = adapter;
+}
+
+void
+TAO_Adapter_Registry::dispatch (TAO::ObjectKey &key,
+ TAO_ServerRequest &request,
+ CORBA::Object_out forward_to)
+{
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ {
+ int const r = this->adapters_[i]->dispatch (key, request, forward_to);
+
+ if (r != TAO_Adapter::DS_MISMATCHED_KEY)
+ {
+ return;
+ }
+ }
+
+ if (CORBA::is_nil (forward_to))
+ {
+ throw ::CORBA::OBJECT_NOT_EXIST ();
+ }
+}
+
+CORBA::Object_ptr
+TAO_Adapter_Registry::create_collocated_object (TAO_Stub *stub,
+ const TAO_MProfile &mprofile)
+{
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ {
+ CORBA::Object_ptr x =
+ this->adapters_[i]->create_collocated_object (stub, mprofile);
+ if (x != 0)
+ {
+ if (!stub->collocated_servant ())
+ {
+ // This adapter created an object but it was not able to locate
+ // a servant so we need to give the rest of the adapters a chance to
+ // initialise the stub and find a servant or forward us or whatever.
+ for (CORBA::Long go_on = 1; go_on && i != this->adapters_count_;
+ ++i)
+ {
+ // initialize_collocated_object only returns 0 if it has completely
+ // initialised the object.
+ go_on = this->adapters_[i]->initialize_collocated_object (
+ stub);
+ }
+ }
+ return x;
+ }
+ }
+ return 0;
+}
+
+CORBA::Long
+TAO_Adapter_Registry::initialize_collocated_object (TAO_Stub *stub)
+{
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ {
+ int const retval =
+ this->adapters_[i]->initialize_collocated_object (stub);
+ if (retval == 0)
+ {
+ // initialize_collocated_object only returns 0 if it has completely
+ // initialised the object. We can return early.
+ return retval;
+ }
+ }
+ return 0;
+}
+
+TAO_Adapter *
+TAO_Adapter_Registry::find_adapter (const char *name) const
+{
+ for (TAO_Adapter **i = this->adapters_;
+ i != this->adapters_ + this->adapters_count_;
+ ++i)
+ if (ACE_OS::strcmp ((*i)->name (), name) == 0)
+ return *i;
+
+ return 0;
+
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL