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.cpp196
1 files changed, 196 insertions, 0 deletions
diff --git a/TAO/tao/Adapter_Registry.cpp b/TAO/tao/Adapter_Registry.cpp
new file mode 100644
index 00000000000..f56ce3d18d1
--- /dev/null
+++ b/TAO/tao/Adapter_Registry.cpp
@@ -0,0 +1,196 @@
+// $Id$
+
+#include "Object.h"
+#include "Adapter_Registry.h"
+#include "Adapter.h"
+#include "SystemException.h"
+#include "debug.h"
+
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID (tao,
+ Adapter_Registry,
+ "$Id$")
+
+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
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC (())
+{
+ ACE_TRY
+ {
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ {
+ this->adapters_[i]->close (wait_for_completion
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ if (TAO_debug_level > 3)
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Exception in TAO_Adapter_Registry::close () \n");
+ }
+ return;
+ }
+ ACE_ENDTRY;
+
+ return;
+}
+
+void
+TAO_Adapter_Registry::check_close (int wait_for_completion
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC (())
+{
+ ACE_TRY
+ {
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ {
+ this->adapters_[i]->check_close (wait_for_completion
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHALL
+ {
+ if (TAO_debug_level > 3)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P|%t) Exception in TAO_Adapter_Registry::check_close () \n")));
+ }
+ return;
+ }
+ ACE_ENDTRY;
+
+ return;
+}
+void
+TAO_Adapter_Registry::insert (TAO_Adapter *adapter
+ ACE_ENV_ARG_DECL)
+{
+ if (this->adapters_capacity_ == this->adapters_count_)
+ {
+ this->adapters_capacity_ *= 2;
+ TAO_Adapter **tmp;
+ ACE_NEW_THROW_EX (tmp,
+ TAO_Adapter*[this->adapters_capacity_],
+ CORBA::NO_MEMORY ());
+ ACE_CHECK;
+
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ tmp[i] = this->adapters_[i];
+ delete[] this->adapters_;
+ this->adapters_ = tmp;
+ }
+
+ int 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
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ {
+ int r = this->adapters_[i]->dispatch (key,
+ request,
+ forward_to
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (r != TAO_Adapter::DS_MISMATCHED_KEY)
+ {
+ return;
+ }
+ }
+
+ if (CORBA::is_nil (forward_to))
+ {
+ ACE_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)
+ return x;
+ }
+ return 0;
+}
+
+CORBA::Long
+TAO_Adapter_Registry::initialize_collocated_object (TAO_Stub *stub,
+ CORBA::Object_ptr obj)
+{
+ for (size_t i = 0; i != this->adapters_count_; ++i)
+ {
+ int retval =
+ this->adapters_[i]->initialize_collocated_object (stub,
+ obj);
+ if (retval != 0)
+ 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;
+
+}
+