summaryrefslogtreecommitdiff
path: root/modules/CIAO/ciao/Servant_Activator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/CIAO/ciao/Servant_Activator.cpp')
-rw-r--r--modules/CIAO/ciao/Servant_Activator.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/modules/CIAO/ciao/Servant_Activator.cpp b/modules/CIAO/ciao/Servant_Activator.cpp
new file mode 100644
index 00000000000..c0e1bc93d9d
--- /dev/null
+++ b/modules/CIAO/ciao/Servant_Activator.cpp
@@ -0,0 +1,191 @@
+#include "Servant_Activator.h"
+#include "CIAO_common.h"
+#include "Port_Activator.h"
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID (ciao,
+ Servant_Activator,
+ "$Id$")
+
+namespace CIAO
+{
+ Servant_Activator::Servant_Activator (CORBA::ORB_ptr o)
+ : orb_ (CORBA::ORB::_duplicate (o))
+ // @@ TODO, avoid this magic number
+ , pa_ (64)
+ , slot_index_ (0)
+ {
+ }
+
+ Servant_Activator::~Servant_Activator (void)
+ {
+ {
+ ACE_GUARD (TAO_SYNCH_MUTEX,
+ guard,
+ this->mutex_);
+
+ size_t const sz = this->slot_index_;
+
+ for (size_t t = 0; t != sz; ++t)
+ {
+ Port_Activator *&tmp = this->pa_[t];
+
+ delete tmp;
+ }
+ }
+ }
+
+ bool
+ Servant_Activator::update_port_activator (
+ const PortableServer::ObjectId &oid)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ CORBA::String_var str =
+ PortableServer::ObjectId_to_string (oid);
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->mutex_,
+ 0);
+ size_t const sz = this->slot_index_;
+ for (size_t t = 0; t != sz; ++t)
+ {
+ Port_Activator *&tmp = this->pa_[t];
+ if (ACE_OS::strcmp (tmp->oid (), str.in ()) == 0)
+ {
+ tmp->oid ("dummy");
+ //delete tmp;
+ //--this->slot_index_;
+ }
+ }
+ }
+ return true;
+ }
+
+ PortableServer::Servant
+ Servant_Activator::incarnate (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::ForwardRequest))
+ {
+ CORBA::String_var str =
+ PortableServer::ObjectId_to_string (oid);
+
+ if (CIAO::debug_level () > 9)
+ ACE_DEBUG ((LM_DEBUG,
+ "CIAO (%P|%t) - Servant_Activator::incarnate, "
+ "activating port name [%s] \n",
+ str.in ()));
+
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->mutex_,
+ 0);
+
+ size_t const sz = this->slot_index_;
+
+ Port_Activator *tmp = 0;
+
+ for (size_t t = 0; t != sz; ++t)
+ {
+ if (this->pa_.get (tmp, t) == -1)
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ 0);
+
+ if (tmp == 0)
+ {
+ if (CIAO::debug_level () > 9)
+ ACE_ERROR ((LM_ERROR,
+ "CIAO (%P|%t) - Servant_Activator::incarnate (),"
+ " value from the array is null \n"));
+ continue;
+ }
+ if (ACE_OS::strcmp (tmp->oid (),
+ str.in ()) == 0)
+ {
+ // We should try avoiding making outbound calls with the
+ // lock held. Oh well, let us get some sense of sanity in
+ // CIAO to do think about these.
+ if (CIAO::debug_level () > 5)
+ ACE_DEBUG ((LM_DEBUG, "Activating Port %s\n",
+ str.in ()));
+
+ return this->pa_[t]->activate (oid);
+ }
+ }
+ }
+ ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
+ 0);
+ }
+
+ void
+ Servant_Activator::etherealize (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr ,
+ PortableServer::Servant servant,
+ CORBA::Boolean ,
+ CORBA::Boolean)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ CORBA::String_var str =
+ PortableServer::ObjectId_to_string (oid);
+
+ size_t const sz = this->slot_index_;
+
+ Port_Activator *tmp = 0;
+
+ for (size_t t = 0; t != sz; ++t)
+ {
+ if (this->pa_.get (tmp, t) == -1)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Could not get Port Activator\n"));
+ continue;
+ }
+
+ if (tmp == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Port Activator is NULL\n"));
+ continue;
+ }
+ if (ACE_OS::strcmp (tmp->oid (),
+ str.in ()) == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Deactivating Port %s\n",
+ str.in ()));
+ this->pa_[t]->deactivate (servant);
+ }
+ }
+ }
+
+ bool
+ Servant_Activator::register_port_activator (Port_Activator *pa)
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->mutex_,
+ false);
+
+ // @@ TODO, need to implement a better algorithm here.
+ //
+ if (this->slot_index_ >= this->pa_.size ())
+ this->pa_.size ((this->slot_index_ + 1));
+
+ if (this->pa_.set (pa, this->slot_index_) == 0)
+ {
+ ++this->slot_index_;
+
+ if (CIAO::debug_level () > 9)
+ ACE_DEBUG ((LM_DEBUG,
+ "CIAO (%P|%t) - Servant_Activator::register_port_activator"
+ " with port name [%s],"
+ " the slot_index_ is [%d] \n",
+ pa->name (),
+ this->slot_index_));
+
+ return true;
+ }
+
+ return false;
+ }
+}