summaryrefslogtreecommitdiff
path: root/TAO/tao/POA.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/POA.cpp')
-rw-r--r--TAO/tao/POA.cpp3567
1 files changed, 0 insertions, 3567 deletions
diff --git a/TAO/tao/POA.cpp b/TAO/tao/POA.cpp
deleted file mode 100644
index d464bb3de11..00000000000
--- a/TAO/tao/POA.cpp
+++ /dev/null
@@ -1,3567 +0,0 @@
-// @(#) $Id$
-
-// auto_ptr class
-#include "ace/Auto_Ptr.h"
-
-#include "tao/POA.h"
-#include "tao/ORB_Core.h"
-#include "tao/ORB.h"
-#include "tao/Server_Strategy_Factory.h"
-#include "tao/Environment.h"
-#include "tao/Exception.h"
-#include "tao/debug.h"
-
-// Forwarding Servant class
-#include "tao/Forwarding_Servant.h"
-
-#if !defined (__ACE_INLINE__)
-# include "tao/POA.i"
-#endif /* ! __ACE_INLINE__ */
-
-ACE_RCSID(tao, POA, "$Id$")
-
-#if !defined (TAO_NO_IOR_TABLE)
-// This is the TAO_Object_key-prefix that is appended to all TAO Object keys.
-// Its an array of octets representing ^t^a^o/0 in octal.
-CORBA::Octet
-TAO_POA::objectkey_prefix [TAO_POA::TAO_OBJECTKEY_PREFIX_SIZE] = {
- 024, // octal for ^t
- 001, // octal for ^a
- 017, // octal for ^o
- 000
-};
-#endif /* TAO_NO_IOR_TABLE */
-
-TAO_POA::TAO_POA (const TAO_POA::String &name,
- TAO_POA_Manager &poa_manager,
- const TAO_POA_Policies &policies,
- TAO_POA *parent,
- ACE_Lock &lock,
- ACE_SYNCH_MUTEX &thread_lock,
- TAO_ORB_Core &orb_core,
- CORBA::Environment &ACE_TRY_ENV)
- : name_ (name),
- poa_manager_ (poa_manager),
- policies_ (policies),
- parent_ (parent),
- active_object_map_ (0),
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
- adapter_activator_ (),
- servant_activator_ (),
- servant_locator_ (),
- default_servant_ (),
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
- children_ (),
- lock_ (lock),
- persistent_ (policies.lifespan () == PortableServer::PERSISTENT),
- system_id_ (policies.id_assignment () == PortableServer::SYSTEM_ID),
- creation_time_ (ACE_OS::gettimeofday ()),
- orb_core_ (orb_core),
- cleanup_in_progress_ (0),
- etherealize_objects_ (1),
- outstanding_requests_ (0),
- outstanding_requests_condition_ (thread_lock),
- wait_for_completion_pending_ (0),
- waiting_destruction_ (0),
- servant_deactivation_condition_ (thread_lock),
- waiting_servant_deactivation_ (0)
-{
- // Set the folded name of this POA.
- this->set_folded_name ();
-
- // Create the active object map.
- TAO_Active_Object_Map *active_object_map = 0;
- ACE_NEW_THROW_EX (active_object_map,
- TAO_Active_Object_Map (!this->system_id (),
- this->policies ().id_uniqueness () == PortableServer::UNIQUE_ID,
- this->persistent (),
- this->orb_core_.server_factory ()->active_object_map_creation_parameters (),
- ACE_TRY_ENV),
- CORBA::NO_MEMORY ());
-
- // Give ownership of the new map to the auto pointer. Note, that it
- // is important for the auto pointer to take ownership before
- // checking for exception since we may need to delete the new map.
- auto_ptr<TAO_Active_Object_Map> new_active_object_map (active_object_map);
-
- // Check for exception in construction of the active object map.
- ACE_CHECK;
-
- // Register self with manager.
- int result = this->poa_manager_.register_poa (this);
- if (result != 0)
- {
- ACE_THROW (CORBA::OBJ_ADAPTER ());
- }
-
- // Add self to Object Adapter class.
- result = this->orb_core_.object_adapter ()->bind_poa (this->folded_name_,
- this,
- this->system_name_.out ());
- if (result != 0)
- {
- // Remove from POA Manager in case of errors. No checks of
- // further errors...
- this->poa_manager_.remove_poa (this);
-
- ACE_THROW (CORBA::OBJ_ADAPTER ());
- }
-
- // Finally everything is fine. Make sure to take ownership away
- // from the auto pointer.
- this->active_object_map_ = new_active_object_map.release ();
-}
-
-TAO_POA::~TAO_POA (void)
-{
- // Delete the active object map.
- delete this->active_object_map_;
-
- // Note: Errors are ignored here since there is nothing we can do
- // about them.
-
- // Remove POA from the POAManager.
- this->poa_manager_.remove_poa (this);
-
- // Remove POA from the Object Adapter.
- this->orb_core_.object_adapter ()->unbind_poa (this,
- this->folded_name_,
- this->system_name_.in ());
-}
-
-PortableServer::POA_ptr
-TAO_POA::create_POA_i (const char *adapter_name,
- PortableServer::POAManager_ptr poa_manager,
- const CORBA::PolicyList &policies,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // If any of the policy objects specified are not valid for the ORB
- // implementation, if conflicting policy objects are specified, or
- // if any of the specified policy objects require prior
- // administrative action that has not been performed, an
- // InvalidPolicy exception is raised containing the index in the
- // policies parameter value of the first offending policy object.
- TAO_POA_Policies tao_policies;
- tao_policies.parse_policies (policies,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::POA::_nil ());
-
- // If the poa_manager parameter is null, a new POAManager object is
- // created and associated with the new POA. Otherwise, the specified
- // POAManager object is associated with the new POA. The POAManager
- // object can be obtained using the attribute name the_POAManager.
-
- auto_ptr<TAO_POA_Manager> new_poa_manager_impl;
- TAO_POA_Manager *poa_manager_impl = 0;
- if (CORBA::is_nil (poa_manager))
- {
- ACE_NEW_THROW_EX (poa_manager_impl,
- TAO_POA_Manager (*this->orb_core_.object_adapter ()),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (PortableServer::POA::_nil ());
-
- // Give ownership to auto pointer.
- auto_ptr<TAO_POA_Manager> auto_new_poa_manager_impl (poa_manager_impl);
- new_poa_manager_impl = auto_new_poa_manager_impl;
- }
- else
- {
- PortableServer::Servant servant = poa_manager->_servant ();
- if (servant == 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- PortableServer::POA::_nil ());
- }
-
- void *ptr = servant->_downcast (servant->_interface_repository_id ());
- POA_PortableServer::POAManager *mgr = (POA_PortableServer::POAManager *) ptr;
- poa_manager_impl = ACE_dynamic_cast (TAO_POA_Manager *, mgr);
- }
-
- TAO_POA *poa = this->create_POA_i (adapter_name,
- *poa_manager_impl,
- tao_policies,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::POA::_nil ());
-
- // Give ownership of the new poa to the auto pointer.
- auto_ptr<TAO_POA> new_poa (poa);
-
- PortableServer::POA_var result = new_poa->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::POA::_nil ());
-
- // Finally everything is fine. Make sure to take ownership away
- // from the auto pointers.
- new_poa.release ();
- new_poa_manager_impl.release ();
-
- return result._retn ();
-}
-
-TAO_POA *
-TAO_POA::create_POA_i (const TAO_POA::String &adapter_name,
- TAO_POA_Manager &poa_manager,
- const TAO_POA_Policies &policies,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operaton creates a new POA as a child of the target POA. The
- // specified name identifies the new POA with respect to other POAs
- // with the same parent POA. If the target POA already has a child
- // POA with the specified name, the AdapterAlreadyExists exception
- // is raised.
- int result = this->children_.find (adapter_name);
-
- // Child was found
- if (result != -1)
- {
- ACE_THROW_RETURN (PortableServer::POA::AdapterAlreadyExists (),
- 0);
- }
-
- //
- // Child was not found
- //
-
- // The specified policy objects are associated with the POA and used
- // to control its behavior. The policy objects are effectively
- // copied before this operation returns, so the application is free
- // to destroy them while the POA is in use. Policies are not
- // inherited from the parent POA.
- TAO_POA *poa = 0;
- ACE_NEW_THROW_EX (poa,
- TAO_POA (adapter_name,
- poa_manager,
- policies,
- this,
- this->orb_core_.object_adapter ()->lock (),
- this->orb_core_.object_adapter ()->thread_lock (),
- this->orb_core_,
- ACE_TRY_ENV),
- CORBA::NO_MEMORY ());
-
- // Give ownership of the new map to the auto pointer. Note, that it
- // is important for the auto pointer to take ownership before
- // checking for exception since we may need to delete the new map.
- auto_ptr<TAO_POA> new_poa (poa);
-
- // Check for exception in construction of the POA.
- ACE_CHECK_RETURN (0);
-
- // Add to children map
- result = this->children_.bind (adapter_name,
- new_poa.get ());
- if (result != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
-
- // Note: Creating a POA using a POA manager that is in the active
- // state can lead to race conditions if the POA supports preexisting
- // objects, because the new POA may receive a request before its
- // adapter activator, servant manager, or default servant have been
- // initialized. These problems do not occur if the POA is created by
- // an adapter activator registered with a parent of the new POA,
- // because requests are queued until the adapter activator
- // returns. To avoid these problems when a POA must be explicitly
- // initialized, the application can initialize the POA by invoking
- // find_POA with a TRUE activate parameter.
-
- // Everything is fine. Don't let the auto_ptr delete the
- // implementation.
- return new_poa.release ();
-}
-
-PortableServer::POA_ptr
-TAO_POA::find_POA (const char *adapter_name,
- CORBA::Boolean activate_it,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // Lock access for the duration of this transaction.
- TAO_POA_GUARD_RETURN (ACE_Lock, monitor, this->lock (), 0);
-
- // A recursive thread lock without using a recursive thread
- // lock. Non_Servant_Upcall has a magic constructor and
- // destructor. We unlock the Object_Adapter lock for the
- // duration of the servant activator upcalls; reacquiring
- // once the upcalls complete. Even though we are releasing
- // the lock, other threads will not be able to make progress
- // since <Object_Adapter::non_servant_upcall_in_progress_>
- // has been set.
- TAO_Object_Adapter::Non_Servant_Upcall non_servant_upcall (*this->orb_core_.object_adapter ());
- ACE_UNUSED_ARG (non_servant_upcall);
-
- TAO_POA *child = this->find_POA_i (adapter_name,
- activate_it,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::POA::_nil ());
-
- // Give ownership of the new poa to the auto pointer.
- auto_ptr<TAO_POA> new_child (child);
-
- PortableServer::POA_var result = new_child->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::POA::_nil ());
-
- // Finally everything is fine. Make sure to take ownership away
- // from the auto pointer.
- new_child.release ();
-
- return result._retn ();
-}
-
-TAO_POA *
-TAO_POA::find_POA_i (const ACE_CString &child_name,
- CORBA::Boolean activate_it,
- CORBA::Environment &ACE_TRY_ENV)
-{
- TAO_POA *child;
- int result = this->children_.find (child_name,
- child);
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
- if (result != 0)
- {
- if (activate_it)
- {
- if (!CORBA::is_nil (this->adapter_activator_.in ()))
- {
- // Check the state of the POA Manager.
- this->check_poa_manager_state (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- PortableServer::POA_var self = this->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- CORBA::Boolean success =
- this->adapter_activator_->unknown_adapter (self.in (),
- child_name.c_str (),
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- if (success)
- {
- result = this->children_.find (child_name,
- child);
- }
- else
- {
- result = -1;
- }
- }
- else
- {
- result = -1;
- }
- }
- else
- {
- result = -1;
- }
- }
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
- if (result == 0)
- {
- return child;
- }
- else
- {
- // Otherwise, the AdapterNonExistent exception is raised.
- ACE_THROW_RETURN (PortableServer::POA::AdapterNonExistent (),
- 0);
- }
-}
-
-void
-TAO_POA::destroy_i (CORBA::Boolean etherealize_objects,
- CORBA::Boolean wait_for_completion,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // Is the <wait_for_completion> semantics for this thread correct?
- TAO_POA::check_for_valid_wait_for_completions (wait_for_completion,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- this->cleanup_in_progress_ = 1;
-
- // This operation destroys the POA and all descendant POAs. The POA
- // so destroyed (that is, the POA with its name) may be re-created
- // later in the same process. (This differs from the
- // POAManager::deactivate operation that does not allow a
- // re-creation of its associated POA in the same process.)
-
- // Remove POA from the parent
- if (this->parent_ != 0)
- {
- int result = this->parent_->delete_child (this->name_);
- if (result != 0)
- {
- ACE_THROW (CORBA::OBJ_ADAPTER ());
- }
- }
-
- // Remove all children POAs
- for (CHILDREN::iterator iterator = this->children_.begin ();
- iterator != this->children_.end ();
- ++iterator)
- {
- TAO_POA *child_poa = (*iterator).int_id_;
- child_poa->destroy_i (etherealize_objects,
- wait_for_completion,
- ACE_TRY_ENV);
- ACE_CHECK;
- }
-
- // When a POA is destroyed, any requests that have started execution
- // continue to completion. Any requests that have not started
- // execution are processed as if they were newly arrived, that is,
- // the POA will attempt to cause recreation of the POA by invoking
- // one or more adapter activators as described in Section 3.3.3.
-
- // If the wait_for_completion parameter is TRUE, the destroy
- // operation will return only after all requests in process have
- // completed and all invocations of etherealize have
- // completed. Otherwise, the destroy operation returns after
- // destroying the POAs.
-
- this->deactivate_all_objects_i (etherealize_objects,
- wait_for_completion,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- // If there are no outstanding requests.
- if (this->outstanding_requests_ == 0)
- {
- // Commit suicide
- delete this;
- }
- else
- {
- // Mark that we are ready for destruction.
- this->waiting_destruction_ = 1;
- }
-}
-
-int
-TAO_POA::delete_child (const TAO_POA::String &child)
-{
- int result = 0;
-
- // If we are not closing down, we must remove this child from our
- // collection.
- if (!this->cleanup_in_progress_)
- {
- result = this->children_.unbind (child);
- }
-
- // If we are closing down, we are currently iterating over our
- // children and there is not need to remove this child from our
- // collection.
-
- return result;
-}
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-PortableServer::ServantManager_ptr
-TAO_POA::get_servant_manager_i (CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the USE_SERVANT_MANAGER policy; if not
- // present, the WrongPolicy exception is raised.
- if (this->policies ().request_processing () != PortableServer::USE_SERVANT_MANAGER)
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongPolicy (),
- PortableServer::ServantManager::_nil ());
- }
-
- // This operation returns the servant manager associated with the
- // POA. If no servant manager has been associated with the POA, it
- // returns a null reference.
- if (this->policies ().servant_retention () == PortableServer::RETAIN)
- return PortableServer::ServantManager::_duplicate (this->servant_activator_.in ());
- else
- return PortableServer::ServantManager::_duplicate (this->servant_locator_.in ());
-}
-
-void
-TAO_POA::set_servant_manager_i (PortableServer::ServantManager_ptr imgr,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the USE_SERVANT_MANAGER policy; if not
- // present, the WrongPolicy exception is raised.
- if (this->policies ().request_processing () != PortableServer::USE_SERVANT_MANAGER)
- {
- ACE_THROW (PortableServer::POA::WrongPolicy ());
- }
-
- // This operation sets the default servant manager associated with
- // the POA.
- if (this->policies ().servant_retention () == PortableServer::RETAIN)
- {
- this->servant_activator_ = PortableServer::ServantActivator::_narrow (imgr,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- if (CORBA::is_nil (this->servant_activator_.in ()))
- {
- ACE_THROW (PortableServer::POA::WrongPolicy ());
- }
- }
- else
- {
- this->servant_locator_ = PortableServer::ServantLocator::_narrow (imgr,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- if (CORBA::is_nil (this->servant_locator_.in ()))
- {
- ACE_THROW (PortableServer::POA::WrongPolicy ());
- }
- }
-}
-
-PortableServer::Servant
-TAO_POA::get_servant_i (CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the USE_DEFAULT_SERVANT policy; if not
- // present, the WrongPolicy exception is raised.
- if (this->policies ().request_processing () != PortableServer::USE_DEFAULT_SERVANT)
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongPolicy (),
- 0);
- }
-
- // This operation returns the default servant associated with the
- // POA.
- PortableServer::Servant result = this->default_servant_.in ();
- if (result != 0)
- {
- // The POA invokes _add_ref once on the Servant before returning
- // it. If the application uses reference counting, the caller of
- // get_servant is responsible for invoking _remove_ref once on
- // the returned Servant when it is finished with it. A
- // conforming caller need not invoke _remove_ref on the returned
- // Servant if the type of the Servant uses the default reference
- // counting inherited from ServantBase.
- result->_add_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- return result;
- }
- else
- // If no servant has been associated with the POA, the NoServant
- // exception is raised.
- {
- ACE_THROW_RETURN (PortableServer::POA::NoServant (),
- 0);
- }
-}
-
-void
-TAO_POA::set_servant_i (PortableServer::Servant servant,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the USE_DEFAULT_SERVANT policy; if not
- // present, the WrongPolicy exception is raised.
- if (this->policies ().request_processing () != PortableServer::USE_DEFAULT_SERVANT)
- {
- ACE_THROW (PortableServer::POA::WrongPolicy ());
- }
-
- // This operation registers the specified servant with the POA as
- // the default servant. This servant will be used for all requests
- // for which no servant is found in the Active Object Map.
- this->default_servant_ = servant;
-
- // The implementation of set_servant will invoke _add_ref at least
- // once on the Servant argument before returning. When the POA no
- // longer needs the Servant, it will invoke _remove_ref on it the
- // same number of times.
- if (servant != 0)
- {
- servant->_add_ref (ACE_TRY_ENV);
- ACE_CHECK;
-
- // If we are a single threaded POA, set up the appropriate
- // locking in the servant.
- this->establish_servant_lock (servant);
- }
-}
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-int
-TAO_POA::is_servant_in_map (PortableServer::Servant servant)
-{
- while (1)
- {
- int deactivated = 0;
- int servant_in_map =
- this->active_object_map ().is_servant_in_map (servant,
- deactivated);
-
- if (!servant_in_map)
- {
- return 0;
- }
- else
- {
- if (deactivated)
- {
- if (TAO_debug_level > 0)
- ACE_DEBUG ((LM_DEBUG,
- "(%t) TAO_POA::is_servant_in_map: waiting for servant to deactivate\n"));
-
- ++this->waiting_servant_deactivation_;
-
- this->servant_deactivation_condition_.wait ();
-
- --this->waiting_servant_deactivation_;
- }
- else
- {
- return 1;
- }
- }
- }
-}
-
-int
-TAO_POA::is_user_id_in_map (const PortableServer::ObjectId &id)
-{
- while (1)
- {
- int deactivated = 0;
- int user_id_in_map =
- this->active_object_map ().is_user_id_in_map (id,
- deactivated);
-
- if (!user_id_in_map)
- {
- return 0;
- }
- else
- {
- if (deactivated)
- {
- if (TAO_debug_level > 0)
- ACE_DEBUG ((LM_DEBUG,
- "(%t) TAO_POA::is_user_id_in_map: waiting for servant to deactivate\n"));
-
- ++this->waiting_servant_deactivation_;
-
- this->servant_deactivation_condition_.wait ();
-
- --this->waiting_servant_deactivation_;
- }
- else
- {
- return 1;
- }
- }
- }
-}
-
-PortableServer::ObjectId *
-TAO_POA::activate_object_i (PortableServer::Servant servant,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the SYSTEM_ID and RETAIN policy; if not
- // present, the WrongPolicy exception is raised.
- if (!(this->policies ().id_assignment () == PortableServer::SYSTEM_ID &&
- this->policies ().servant_retention () == PortableServer::RETAIN))
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongPolicy (),
- 0);
- }
-
- // If the POA has the UNIQUE_ID policy and the specified servant is
- // already in the Active Object Map, the ServantAlreadyActive
- // exception is raised.
- if (this->policies ().id_uniqueness () == PortableServer::UNIQUE_ID &&
- this->is_servant_in_map (servant))
- {
- ACE_THROW_RETURN (PortableServer::POA::ServantAlreadyActive (),
- 0);
- }
-
- // Otherwise, the activate_object operation generates an Object Id
- // and enters the Object Id and the specified servant in the Active
- // Object Map. The Object Id is returned.
- PortableServer::ObjectId_var user_id;
- if (this->active_object_map ().bind_using_system_id_returning_user_id (servant,
- user_id.out ()) != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
-
- //
- // Everything is finally ok
- //
-
- // The implementation of activate_object will invoke _add_ref at
- // least once on the Servant argument before returning. When the POA
- // no longer needs the Servant, it will invoke _remove_ref on it the
- // same number of times.
- servant->_add_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- // If we are a single threaded POA, set up the appropriate locking
- // in the servant.
- this->establish_servant_lock (servant);
-
- return user_id._retn ();
-}
-
-void
-TAO_POA::activate_object_with_id_i (const PortableServer::ObjectId &id,
- PortableServer::Servant servant,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the RETAIN policy; if not present, the
- // WrongPolicy exception is raised.
- if (this->policies ().servant_retention () != PortableServer::RETAIN)
- {
- ACE_THROW (PortableServer::POA::WrongPolicy ());
- }
-
- // If the POA has the SYSTEM_ID policy and it detects that the
- // Object Id value was not generated by the system or for this POA,
- // the activate_object_with_id operation may raise the BAD_PARAM
- // system exception. An ORB is not required to detect all such
- // invalid Object Id values, but a portable application must not
- // invoke activate_object_with_id on a POA that has the SYSTEM_ID
- // policy with an Object Id value that was not previously generated
- // by the system for that POA, or, if the POA also has the
- // PERSISTENT policy, for a previous instantiation of the same POA.
- if (this->policies ().id_assignment () == PortableServer::SYSTEM_ID &&
- !this->is_poa_generated_id (id))
- {
- ACE_THROW (CORBA::BAD_PARAM ());
- }
-
- // If the CORBA object denoted by the Object Id value is already
- // active in this POA (there is a servant bound to it in the Active
- // Object Map), the ObjectAlreadyActive exception is raised.
- if (is_user_id_in_map (id))
- {
- ACE_THROW (PortableServer::POA::ObjectAlreadyActive ());
- }
-
- // If the POA has the UNIQUE_ID policy and the servant is already in
- // the Active Object Map, the ServantAlreadyActive exception is
- // raised.
- if (this->policies ().id_uniqueness () == PortableServer::UNIQUE_ID &&
- this->is_servant_in_map (servant))
- {
- ACE_THROW (PortableServer::POA::ServantAlreadyActive ());
- }
-
- // Otherwise, the activate_object_with_id operation enters an
- // association between the specified Object Id and the specified
- // servant in the Active Object Map.
- if (this->active_object_map ().bind_using_user_id (servant, id) != 0)
- {
- ACE_THROW (CORBA::OBJ_ADAPTER ());
- }
-
- //
- // Everything is finally ok
- //
-
- // The implementation of activate_object_with_id will invoke
- // _add_ref at least once on the Servant argument before
- // returning. When the POA no longer needs the Servant, it will
- // invoke _remove_ref on it the same number of times.
- servant->_add_ref (ACE_TRY_ENV);
- ACE_CHECK;
-
- // If we are a single threaded POA, set up the appropriate locking
- // in the servant.
- this->establish_servant_lock (servant);
-}
-
-void
-TAO_POA::deactivate_all_objects_i (CORBA::Boolean etherealize_objects,
- CORBA::Boolean wait_for_completion,
- CORBA::Environment &ACE_TRY_ENV)
-{
- this->deactivate_all_objects_i (etherealize_objects,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- this->wait_for_completions (wait_for_completion,
- ACE_TRY_ENV);
- ACE_CHECK;
-}
-
-void
-TAO_POA::wait_for_completions (CORBA::Boolean wait_for_completion,
- CORBA::Environment &ACE_TRY_ENV)
-{
- while (wait_for_completion &&
- this->outstanding_requests_ > 0)
- {
- this->wait_for_completion_pending_ = 1;
-
- int result = this->outstanding_requests_condition_.wait ();
- if (result == -1)
- {
- ACE_THROW (CORBA::OBJ_ADAPTER ());
- }
- }
-}
-
-/* static */
-void
-TAO_POA::check_for_valid_wait_for_completions (CORBA::Boolean wait_for_completion,
- CORBA::Environment &ACE_TRY_ENV)
-{
- if (wait_for_completion)
- {
- TAO_POA_Current_Impl *poa_current_impl =
- TAO_TSS_RESOURCES::instance ()->poa_current_impl_;
-
- // This thread cannot currently be in an upcall.
- if (poa_current_impl != 0)
- {
- ACE_THROW (CORBA::BAD_INV_ORDER ());
- }
- }
-}
-
-void
-TAO_POA::deactivate_all_objects_i (CORBA::Boolean etherealize_objects,
- CORBA::Environment &ACE_TRY_ENV)
-{
- this->etherealize_objects_ = etherealize_objects;
-
- // This operation is a no-op for the non-RETAIN policy.
- if (this->policies ().servant_retention () != PortableServer::RETAIN)
- {
- return;
- }
-
- // If the etherealize_objects parameter is TRUE, the POA has the
- // RETAIN policy, and a servant manager is registered with the POA,
- // the etherealize operation on the servant manager will be called
- // for each active object in the Active Object Map. The apparent
- // destruction of the POA occurs before any calls to etherealize are
- // made. Thus, for example, an etherealize method that attempts to
- // invoke operations on the POA will receive the OBJECT_NOT_EXIST
- // exception.
-
- // We must copy the user ids into a separate place since we cannot
- // remove entries while iterating through the map.
- ACE_Array<PortableServer::ObjectId> ids (this->active_object_map ().current_size ());
-
- size_t counter = 0;
- TAO_Active_Object_Map::user_id_map::iterator end
- = this->active_object_map ().user_id_map_->end ();
-
- for (TAO_Active_Object_Map::user_id_map::iterator iter
- = this->active_object_map ().user_id_map_->begin ();
- iter != end;
- ++iter)
- {
- TAO_Active_Object_Map::user_id_map::value_type map_pair = *iter;
- TAO_Active_Object_Map::Map_Entry *active_object_map_entry = map_pair.second ();
-
- if (!active_object_map_entry->deactivated_)
- {
- ids[counter] = active_object_map_entry->user_id_;
- ++counter;
- }
- }
-
- for (size_t i = 0;
- i < counter;
- ++i)
- {
- this->deactivate_object_i (ids[i],
- ACE_TRY_ENV);
- ACE_CHECK;
- }
-}
-
-void
-TAO_POA::deactivate_object_i (const PortableServer::ObjectId &id,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the RETAIN policy; if not present, the
- // WrongPolicy exception is raised.
- if (this->policies ().servant_retention () != PortableServer::RETAIN)
- {
- ACE_THROW (PortableServer::POA::WrongPolicy ());
- }
-
- TAO_Active_Object_Map::Map_Entry *active_object_map_entry = 0;
- int result = this->active_object_map ().find_servant_and_system_id_using_user_id (id,
- active_object_map_entry);
-
- // If there is no active object associated with the specified Object
- // Id, the operation raises an ObjectNotActive exception.
- if (result != 0)
- {
- ACE_THROW (PortableServer::POA::ObjectNotActive ());
- }
-
- // Decrement the reference count.
- CORBA::UShort new_count = --active_object_map_entry->reference_count_;
-
- if (new_count == 0)
- {
- this->cleanup_servant (active_object_map_entry,
- ACE_TRY_ENV);
- ACE_CHECK;
- }
- else
- {
- // It should be noted that there may be a period of time between
- // an object's deactivation and the etherealization (during
- // which outstanding requests are being processed) in which
- // arriving requests on that object should not be passed to its
- // servant. During this period, requests targeted for such an
- // object act as if the POA were in holding state until
- // etherealize completes. If etherealize is called as a
- // consequence of a deactivate call with a etherealize_objects
- // parameter of TRUE, incoming requests are rejected.
-
- // Else mark entry as closed...
- active_object_map_entry->deactivated_ = 1;
- }
-}
-
-void
-TAO_POA::cleanup_servant (TAO_Active_Object_Map::Map_Entry *active_object_map_entry,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // If a servant manager is associated with the POA,
- // ServantLocator::etherealize will be invoked with the oid and the
- // servant. (The deactivate_object operation does not wait for the
- // etherealize operation to complete before deactivate_object
- // returns.)
- //
- // Note: If the servant associated with the oid is serving multiple
- // Object Ids, ServantLocator::etherealize may be invoked multiple
- // times with the same servant when the other objects are
- // deactivated. It is the responsibility of the object
- // implementation to refrain from destroying the servant while it is
- // active with any Id.
-
- // If the POA has no ServantActivator associated with it, the POA
- // implementation calls _remove_ref when all operation invocations
- // have completed. If there is a ServantActivator, the Servant is
- // consumed by the call to ServantActivator::etherealize instead.
-
- // First check for a non-zero servant.
- if (active_object_map_entry->servant_)
- {
- // If we are a single threaded POA, teardown the appropriate
- // locking in the servant.
- //
- // Note that teardown of the servant lock must happen before the
- // _remove_ref() or etherealize() calls since they might end up
- // deleting the servant.
- //
- this->teardown_servant_lock (active_object_map_entry->servant_);
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
- if (this->etherealize_objects_ &&
- this->policies ().request_processing () == PortableServer::USE_SERVANT_MANAGER &&
- !CORBA::is_nil (this->servant_activator_.in ()))
- {
- PortableServer::POA_var self = this->_this (ACE_TRY_ENV);
- ACE_CHECK;
-
- CORBA::Boolean remaining_activations =
- this->active_object_map ().remaining_activations (active_object_map_entry->servant_);
-
- // A recursive thread lock without using a recursive thread
- // lock. Non_Servant_Upcall has a magic constructor and
- // destructor. We unlock the Object_Adapter lock for the
- // duration of the servant activator upcalls; reacquiring
- // once the upcalls complete. Even though we are releasing
- // the lock, other threads will not be able to make progress
- // since <Object_Adapter::non_servant_upcall_in_progress_>
- // has been set.
- TAO_Object_Adapter::Non_Servant_Upcall non_servant_upcall (*this->orb_core_.object_adapter ());
- ACE_UNUSED_ARG (non_servant_upcall);
-
- // If the cleanup_in_progress parameter is TRUE, the reason
- // for the etherealize operation is that either the
- // deactivate or destroy operation was called with an
- // etherealize_objects parameter of TRUE. If the parameter
- // is FALSE, the etherealize operation is called for other
- // reasons.
- this->servant_activator_->etherealize (active_object_map_entry->user_id_,
- self.in (),
- active_object_map_entry->servant_,
- this->cleanup_in_progress_,
- remaining_activations,
- ACE_TRY_ENV);
- ACE_CHECK;
- }
- else
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
- {
- active_object_map_entry->servant_->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK;
- }
- }
-
- // This operation causes the association of the Object Id specified
- // by the oid parameter and its servant to be removed from the
- // Active Object Map.
- int result = this->active_object_map ().unbind_using_user_id (active_object_map_entry->user_id_);
-
- if (result != 0)
- {
- ACE_THROW (CORBA::OBJ_ADAPTER ());
- }
-}
-
-void
-TAO_POA::check_poa_manager_state (CORBA::Environment &ACE_TRY_ENV)
-{
- PortableServer::POAManager::State state = this->poa_manager_.get_state_i ();
-
- if (state == PortableServer::POAManager::ACTIVE)
- {
- // When a POA manager is in the active state, the associated
- // POAs will receive and start processing requests (assuming
- // that appropriate thread resources are available).
- return;
- }
-
- if (state == PortableServer::POAManager::DISCARDING)
- {
- // When a POA manager is in the discarding state, the associated
- // POAs will discard all incoming requests (whose processing has
- // not yet begun). When a request is discarded, the TRANSIENT
- // system exception must be returned to the client-side to
- // indicate that the request should be re-issued. (Of course, an
- // ORB may always reject a request for other reasons and raise
- // some other system exception.)
- ACE_THROW (CORBA::TRANSIENT (
- CORBA_SystemException::_tao_minor_code (
- TAO_POA_DISCARDING,
- 0),
- CORBA::COMPLETED_NO));
- }
-
- if (state == PortableServer::POAManager::HOLDING)
- {
- // When a POA manager is in the holding state, the associated
- // POAs will queue incoming requests. The number of requests
- // that can be queued is an implementation limit. If this limit
- // is reached, the POAs may discard requests and return the
- // TRANSIENT system exception to the client to indicate that the
- // client should reissue the request. (Of course, an ORB may
- // always reject a request for other reasons and raise some
- // other system exception.)
-
- // Since there is no queuing in TAO, we immediately raise a
- // TRANSIENT exception.
- ACE_THROW (CORBA::TRANSIENT (
- CORBA_SystemException::_tao_minor_code (
- TAO_POA_HOLDING,
- 0),
- CORBA::COMPLETED_NO));
- }
-
- if (state == PortableServer::POAManager::INACTIVE)
- {
- // The inactive state is entered when the associated POAs are to
- // be shut down. Unlike the discarding state, the inactive state
- // is not a temporary state. When a POA manager is in the
- // inactive state, the associated POAs will reject new
- // requests. The rejection mechanism used is specific to the
- // vendor. The GIOP location forwarding mechanism and
- // CloseConnection message are examples of mechanisms that could
- // be used to indicate the rejection. If the client is
- // co-resident in the same process, the ORB could raise the
- // OBJ_ADAPTER exception to indicate that the object
- // implementation is unavailable.
- ACE_THROW (CORBA::OBJ_ADAPTER ());
- }
-}
-
-CORBA::Object_ptr
-TAO_POA::create_reference_i (const char *intf,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the SYSTEM_ID policy; if not present, the
- // WrongPolicy exception is raised.
- if (this->policies ().id_assignment () != PortableServer::SYSTEM_ID)
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongPolicy (),
- CORBA::Object::_nil ());
- }
-
- // This operation creates an object reference that encapsulates a
- // POA-generated Object Id value and the specified interface
- // repository id. This operation does not cause an activation to
- // take place. The resulting reference may be passed to clients, so
- // that subsequent requests on those references will cause the
- // appropriate servant manager to be invoked, if one is
- // available. The generated Object Id value may be obtained by
- // invoking POA::reference_to_id with the created reference.
- PortableServer::ObjectId_var system_id;
- if (this->active_object_map ().bind_using_system_id_returning_system_id (0,
- system_id.out ()) != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- CORBA::Object::_nil ());
- }
-
- // Create object key.
- TAO_ObjectKey_var key = this->create_object_key (system_id.in ());
-
- // Ask the ORB to create you a reference
- return this->orb_core_.orb ()->key_to_object (key.in (),
- intf,
- ACE_TRY_ENV);
-}
-
-CORBA::Object_ptr
-TAO_POA::create_reference_with_id_i (const PortableServer::ObjectId &user_id,
- const char *intf,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // If the POA has the SYSTEM_ID policy and it detects that the
- // Object Id value was not generated by the system or for this POA,
- // the create_reference_with_id operation may raise the BAD_PARAM
- // system exception. An ORB is not required to detect all such
- // invalid Object Id values, but a portable application must not
- // invoke this operation on a POA that has the SYSTEM_ID policy with
- // an Object Id value that was not previously generated by the
- // system for that POA, or, if the POA also has the PERSISTENT
- // policy, for a previous instantiation of the same POA.
- if (this->policies ().id_assignment () == PortableServer::SYSTEM_ID &&
- !this->is_poa_generated_id (user_id))
- {
- ACE_THROW_RETURN (CORBA::BAD_PARAM (),
- CORBA::Object::_nil ());
- }
-
- // This operation creates an object reference that encapsulates the
- // specified Object Id and interface repository Id values. This
- // operation does not cause an activation to take place. The
- // resulting reference may be passed to clients, so that subsequent
- // requests on those references will cause the object to be
- // activated if necessary, or the default servant used, depending on
- // the applicable policies.
- PortableServer::ObjectId_var system_id;
- if (this->active_object_map ().find_system_id_using_user_id (user_id,
- system_id.out ()) != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- CORBA::Object::_nil ());
- }
-
- // Create object key.
- TAO_ObjectKey_var key = this->create_object_key (system_id.in ());
-
- // Ask the ORB to create you a reference
- return this->orb_core_.orb ()->key_to_object (key.in (),
- intf,
- ACE_TRY_ENV);
-}
-
-PortableServer::ObjectId *
-TAO_POA::servant_to_id_i (PortableServer::Servant servant,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the RETAIN and either the UNIQUE_ID or
- // IMPLICIT_ACTIVATION policies; if not present, the WrongPolicy
- // exception is raised.
- if (!(this->policies ().servant_retention () == PortableServer::RETAIN
- && (this->policies ().id_uniqueness () == PortableServer::UNIQUE_ID
- || this->policies ().implicit_activation () == PortableServer::IMPLICIT_ACTIVATION)))
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongPolicy (),
- 0);
- }
-
- // This operation has three possible behaviors.
-
- // If the POA has the UNIQUE_ID policy and the specified servant is
- // active, the Object Id associated with that servant is returned.
- PortableServer::ObjectId_var user_id;
- if (this->policies ().id_uniqueness () == PortableServer::UNIQUE_ID &&
- this->active_object_map ().find_user_id_using_servant (servant,
- user_id.out ()) != -1)
- {
- return user_id._retn ();
- }
-
- // If the POA has the IMPLICIT_ACTIVATION policy and either the POA
- // has the MULTIPLE_ID policy or the specified servant is not
- // active, the servant is activated using a POA-generated Object Id
- // and the Interface Id associated with the servant, and that Object
- // Id is returned.
- if (this->policies ().implicit_activation () == PortableServer::IMPLICIT_ACTIVATION)
- {
- // If we reach here, then we either have the MULTIPLE_ID policy
- // or we have the UNIQUE_ID policy and we are not in the active
- // object map.
- PortableServer::ObjectId_var user_id;
- if (this->active_object_map ().bind_using_system_id_returning_user_id (servant,
- user_id.out ()) != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
-
- //
- // Everything is finally ok
- //
-
- // If this operation causes the object to be activated, _add_ref
- // is invoked at least once on the Servant argument before
- // returning. Otherwise, the POA does not increment or decrement
- // the reference count of the Servant passed to this function.
- servant->_add_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- // If we are a single threaded POA, set up the appropriate
- // locking in the servant.
- this->establish_servant_lock (servant);
-
- return user_id._retn ();
- }
-
- // Otherwise, the ServantNotActive exception is raised.
- ACE_THROW_RETURN (PortableServer::POA::ServantNotActive (),
- 0);
-}
-
-PortableServer::ObjectId *
-TAO_POA::servant_to_system_id_i (PortableServer::Servant servant,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the RETAIN and either the UNIQUE_ID or
- // IMPLICIT_ACTIVATION policies; if not present, the WrongPolicy
- // exception is raised.
- if (!(this->policies ().servant_retention () == PortableServer::RETAIN
- && (this->policies ().id_uniqueness () == PortableServer::UNIQUE_ID
- || this->policies ().implicit_activation () == PortableServer::IMPLICIT_ACTIVATION)))
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongPolicy (),
- 0);
- }
-
- // This operation has three possible behaviors.
-
- // If the POA has the UNIQUE_ID policy and the specified servant is
- // active, the Object Id associated with that servant is returned.
- PortableServer::ObjectId_var system_id;
- if (this->policies ().id_uniqueness () == PortableServer::UNIQUE_ID &&
- this->active_object_map ().find_system_id_using_servant (servant,
- system_id.out ()) != -1)
- {
- return system_id._retn ();
- }
-
- // If the POA has the IMPLICIT_ACTIVATION policy and either the POA
- // has the MULTIPLE_ID policy or the specified servant is not
- // active, the servant is activated using a POA-generated Object Id
- // and the Interface Id associated with the servant, and that Object
- // Id is returned.
- if (this->policies ().implicit_activation () == PortableServer::IMPLICIT_ACTIVATION)
- {
- // If we reach here, then we either have the MULTIPLE_ID policy
- // or we xhave the UNIQUE_ID policy and we are not in the active
- // object map.
- PortableServer::ObjectId_var system_id;
- if (this->active_object_map ().bind_using_system_id_returning_system_id (servant,
- system_id.out ()) != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
-
- //
- // Everything is finally ok
- //
-
- // If this operation causes the object to be activated, _add_ref
- // is invoked at least once on the Servant argument before
- // returning. Otherwise, the POA does not increment or decrement
- // the reference count of the Servant passed to this function.
- servant->_add_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- // If we are a single threaded POA, set up the appropriate
- // locking in the servant.
- this->establish_servant_lock (servant);
-
- return system_id._retn ();
- }
-
- // Otherwise, the ServantNotActive exception is raised.
- ACE_THROW_RETURN (PortableServer::POA::ServantNotActive (),
- 0);
-}
-
-CORBA::Object_ptr
-TAO_POA::servant_to_reference (PortableServer::Servant servant,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // Note: The allocation of an Object Id value and installation in
- // the Active Object Map caused by implicit activation may actually
- // be deferred until an attempt is made to externalize the
- // reference. The real requirement here is that a reference is
- // produced that will behave appropriately (that is, yield a
- // consistent Object Id value when asked politely).
- PortableServer::ObjectId_var id = this->servant_to_system_id (servant,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Object::_nil ());
-
- // Create object key.
- TAO_ObjectKey_var key = this->create_object_key (id.in ());
-
- // Ask the ORB to create you a reference
- return this->orb_core_.orb ()->key_to_object (key.in (),
- servant->_interface_repository_id (),
- ACE_TRY_ENV);
-}
-
-PortableServer::Servant
-TAO_POA::reference_to_servant (CORBA::Object_ptr reference,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the RETAIN policy or the
- // USE_DEFAULT_SERVANT policy. If neither policy is present, the
- // WrongPolicy exception is raised.
- if (!(this->policies ().servant_retention () == PortableServer::RETAIN
- || this->policies ().request_processing () == PortableServer::USE_DEFAULT_SERVANT))
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongPolicy (),
- 0);
- }
-
- // If the POA has the RETAIN policy and the specified object is
- // present in the Active Object Map, this operation returns the
- // servant associated with that object in the Active Object Map.
- if (this->policies ().servant_retention () == PortableServer::RETAIN)
- {
- TAO_ObjectKey_var key = reference->_key (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- // If the object reference was not created by this POA, the
- // WrongAdapter exception is raised.
- PortableServer::ObjectId system_id;
- TAO_Object_Adapter::poa_name poa_system_name;
- CORBA::Boolean is_root = 0;
- CORBA::Boolean is_persistent = 0;
- CORBA::Boolean is_system_id = 0;
- TAO_Temporary_Creation_Time poa_creation_time;
-
- int result = this->parse_key (key.in (),
- poa_system_name,
- system_id,
- is_root,
- is_persistent,
- is_system_id,
- poa_creation_time);
- if (result != 0 ||
- !this->root () &&
- poa_system_name != this->system_name () ||
- is_root != this->root () ||
- is_persistent != this->persistent () ||
- is_system_id != this->system_id () ||
- !this->persistent () &&
- poa_creation_time != this->creation_time_)
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongAdapter (),
- 0);
- }
-
- // Lock access for the duration of this transaction.
- TAO_POA_GUARD_RETURN (ACE_Lock, monitor, this->lock (), 0);
-
- // Find user id from system id.
- PortableServer::ObjectId user_id;
- if (this->active_object_map ().find_user_id_using_system_id (system_id,
- user_id) != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
-
- // This operation returns the active servant associated with the
- // specified system Object Id value. If the Object Id value is
- // not active in the POA, an ObjectNotActive exception is
- // raised.
- PortableServer::Servant servant = 0;
- TAO_Active_Object_Map::Map_Entry *entry = 0;
-
- if (this->active_object_map ().find_servant_using_system_id_and_user_id (system_id,
- user_id,
- servant,
- entry) != -1)
- {
- // The POA invokes _add_ref once on the Servant before
- // returning it. If the application uses reference counting,
- // the caller of reference_to_servant is responsible for
- // invoking _remove_ref once on the returned Servant when it
- // is finished with it. A conforming caller need not invoke
- // _remove_ref on the returned Servant if the type of the
- // Servant uses the default reference counting inherited
- // from ServantBase.
- servant->_add_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- return servant;
- }
- else
- // Otherwise, the ObjectNotActive exception is raised.
- {
- ACE_THROW_RETURN (PortableServer::POA::ObjectNotActive (),
- 0);
- }
- }
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
- // Otherwise, if the POA has the USE_DEFAULT_SERVANT policy and a
- // default servant has been registered with the POA, this operation
- // returns the default servant.
- if (this->policies ().request_processing () == PortableServer::USE_DEFAULT_SERVANT)
- {
- // Lock access for the duration of this transaction.
- TAO_POA_GUARD_RETURN (ACE_Lock, monitor, this->lock (), 0);
-
- PortableServer::Servant result = this->default_servant_.in ();
- if (result != 0)
- {
- // The POA invokes _add_ref once on the Servant before
- // returning it. If the application uses reference counting,
- // the caller of reference_to_servant is responsible for
- // invoking _remove_ref once on the returned Servant when it
- // is finished with it. A conforming caller need not invoke
- // _remove_ref on the returned Servant if the type of the
- // Servant uses the default reference counting inherited
- // from ServantBase.
- result->_add_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- return result;
- }
- else
- // Otherwise, the ObjectNotActive exception is raised.
- {
- ACE_THROW_RETURN (PortableServer::POA::ObjectNotActive (),
- 0);
- }
- }
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
- // Not reached
- return 0;
-}
-
-PortableServer::ObjectId *
-TAO_POA::reference_to_id (CORBA::Object_ptr reference,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // The WrongPolicy exception is declared to allow future extensions.
-
- // This operation returns the Object Id value encapsulated by the
- // specified reference.
-
- // This operation is valid only if the reference was created by the
- // POA on which the operation is being performed. If the object
- // reference was not created by this POA, the WrongAdapter exception
- // is raised.
- TAO_ObjectKey_var key = reference->_key (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- PortableServer::ObjectId system_id;
- TAO_Object_Adapter::poa_name poa_system_name;
- CORBA::Boolean is_root = 0;
- CORBA::Boolean is_persistent = 0;
- CORBA::Boolean is_system_id = 0;
- TAO_Temporary_Creation_Time poa_creation_time;
-
- int result = this->parse_key (key.in (),
- poa_system_name,
- system_id,
- is_root,
- is_persistent,
- is_system_id,
- poa_creation_time);
- if (result != 0 ||
- !this->root () &&
- poa_system_name != this->system_name () ||
- is_root != this->root () ||
- is_persistent != this->persistent () ||
- is_system_id != this->system_id () ||
- !this->persistent () &&
- poa_creation_time != this->creation_time_)
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongAdapter (),
- 0);
- }
-
- // Lock access for the duration of this transaction.
- TAO_POA_GUARD_RETURN (ACE_Lock, monitor, this->lock (), 0);
-
- // The object denoted by the reference does not have to be active
- // for this operation to succeed.
- PortableServer::ObjectId_var user_id;
- if (this->active_object_map ().find_user_id_using_system_id (system_id,
- user_id.out ()) != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
-
- return user_id._retn ();
-}
-
-PortableServer::Servant
-TAO_POA::id_to_servant_i (const PortableServer::ObjectId &id,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the RETAIN policy; if not present, the
- // WrongPolicy exception is raised.
- if (this->policies ().servant_retention () != PortableServer::RETAIN)
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongPolicy (),
- 0);
- }
-
- // This operation returns the active servant associated with the
- // specified Object Id value. If the Object Id value is not active
- // in the POA, an ObjectNotActive exception is raised.
- PortableServer::Servant servant = 0;
- if (this->active_object_map ().find_servant_using_user_id (id,
- servant) != -1)
- {
- // The POA invokes _add_ref once on the Servant before returning
- // it. If the application uses reference counting, the caller of
- // id_to_servant is responsible for invoking _remove_ref once on
- // the returned Servant when it is finished with it. A
- // conforming caller need not invoke _remove_ref on the returned
- // Servant if the type of the Servant uses the default reference
- // counting inherited from ServantBase.
- servant->_add_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- return servant;
- }
- else
- // Otherwise, the ObjectNotActive exception is raised.
- {
- ACE_THROW_RETURN (PortableServer::POA::ObjectNotActive (),
- 0);
- }
-}
-
-CORBA::Object_ptr
-TAO_POA::id_to_reference_i (const PortableServer::ObjectId &id,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // This operation requires the RETAIN policy; if not present, the
- // WrongPolicy exception is raised.
- if (this->policies ().servant_retention () != PortableServer::RETAIN)
- {
- ACE_THROW_RETURN (PortableServer::POA::WrongPolicy (),
- CORBA::Object::_nil ());
- }
-
- // If an object with the specified Object Id value is currently
- // active, a reference encapsulating the information used to
- // activate the object is returned.
- PortableServer::ObjectId_var system_id;
- PortableServer::Servant servant;
- if (this->active_object_map ().find_servant_and_system_id_using_user_id (id,
- servant,
- system_id.out ()) == 0)
- {
- // Create object key.
- TAO_ObjectKey_var key = this->create_object_key (system_id.in ());
-
- // Ask the ORB to create you a reference
- return this->orb_core_.orb ()->key_to_object (key.in (),
- servant->_interface_repository_id (),
- ACE_TRY_ENV);
- }
- else
- // If the Object Id value is not active in the POA, an
- // ObjectNotActive exception is raised.
- {
- ACE_THROW_RETURN (PortableServer::POA::ObjectNotActive (),
- CORBA::Object::_nil ());
- }
-}
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-void
-TAO_POA::forward_object_i (const PortableServer::ObjectId &oid,
- CORBA::Object_ptr forward_to,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // First, deactivate the object
- this->deactivate_object_i (oid,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- // Create a forwarding servant
- TAO_Forwarding_Servant *forwarding_servant = 0;
- ACE_NEW_THROW_EX (forwarding_servant,
- TAO_Forwarding_Servant (forward_to,
- forward_to->_interface_repository_id ()),
- CORBA::NO_MEMORY ());
- ACE_CHECK;
-
- // Give ownership to the auto pointer.
- auto_ptr<TAO_Forwarding_Servant> new_forwarding_servant (forwarding_servant);
-
- // Register the forwarding servant with the same object Id.
- this->activate_object_with_id_i (oid,
- forwarding_servant,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- // Finally everything is fine. Make sure to take ownership away
- // from the auto pointer.
- new_forwarding_servant.release ();
-}
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-TAO_SERVANT_LOCATION
-TAO_POA::locate_servant_i (const PortableServer::ObjectId &system_id,
- PortableServer::Servant &servant,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // If the POA has the RETAIN policy, the POA looks in the Active
- // Object Map to find if there is a servant associated with the
- // Object Id value from the request. If such a servant exists,
- // return TAO_SERVANT_FOUND.
- if (this->policies ().servant_retention () == PortableServer::RETAIN)
- {
- // Find user id from system id.
- PortableServer::ObjectId user_id;
- if (this->active_object_map ().find_user_id_using_system_id (system_id,
- user_id) != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- TAO_SERVANT_NOT_FOUND);
- }
-
- TAO_Active_Object_Map::Map_Entry *entry = 0;
- int result = this->active_object_map ().find_servant_using_system_id_and_user_id (system_id,
- user_id,
- servant,
- entry);
- if (result == 0)
- {
- // Success
- return TAO_SERVANT_FOUND;
- }
- }
-
- // If the POA has the NON_RETAIN policy or has the RETAIN policy but
- // didn't find a servant in the Active Object Map, the POA takes the
- // following actions:
-
- // If the USE_ACTIVE_OBJECT_MAP_ONLY policy is in effect, the POA raises
- // the OBJECT_NOT_EXIST system exception.
- if (this->policies ().request_processing () == PortableServer::USE_ACTIVE_OBJECT_MAP_ONLY)
- {
- return TAO_SERVANT_NOT_FOUND;
- }
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
- // If the POA has the USE_DEFAULT_SERVANT policy, a default servant
- // has been associated with the POA, return TAO_DEFAULT_SERVANT. If
- // no servant has been associated with the POA, return
- // TAO_SERVANT_NOT_FOUND.
- if (this->policies ().request_processing () == PortableServer::USE_DEFAULT_SERVANT)
- {
- if (this->default_servant_.in () == 0)
- {
- return TAO_SERVANT_NOT_FOUND;
- }
- else
- {
- // Success
- return TAO_DEFAULT_SERVANT;
- }
- }
-
- // If the POA has the USE_SERVANT_MANAGER policy, a servant manager
- // has been associated with the POA, return
- // TAO_SERVANT_MANAGER. If no servant manager has been
- // associated with the POA, return TAO_SERVANT_NOT_FOUND.
- if (this->policies ().request_processing () == PortableServer::USE_SERVANT_MANAGER)
- {
- if (CORBA::is_nil (this->servant_activator_.in ()) &&
- CORBA::is_nil (this->servant_locator_.in ()))
- {
- return TAO_SERVANT_NOT_FOUND;
- }
- else
- {
- // Success
- return TAO_SERVANT_MANAGER;
- }
- }
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
- // Failure
- return TAO_SERVANT_NOT_FOUND;
-}
-
-PortableServer::Servant
-TAO_POA::locate_servant_i (const char *operation,
- const PortableServer::ObjectId &system_id,
- TAO_Object_Adapter::Servant_Upcall &servant_upcall,
- TAO_POA_Current_Impl &poa_current_impl,
- CORBA::Environment &ACE_TRY_ENV)
-{
- if (this->active_object_map ().find_user_id_using_system_id (system_id,
- poa_current_impl.object_id_) != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
-
- // If the POA has the RETAIN policy, the POA looks in the Active
- // Object Map to find if there is a servant associated with the
- // Object Id value from the request. If such a servant exists, the
- // POA invokes the appropriate method on the servant.
- if (this->policies ().servant_retention () == PortableServer::RETAIN)
- {
- PortableServer::Servant servant = 0;
- int result = this->active_object_map ().find_servant_using_system_id_and_user_id (system_id,
- poa_current_impl.object_id (),
- servant,
- servant_upcall.active_object_map_entry_);
-
- if (result == 0)
- {
- // Increment the reference count.
- ++servant_upcall.active_object_map_entry ()->reference_count_;
-
- // Success
- return servant;
- }
- }
-
- // If the POA has the NON_RETAIN policy or has the RETAIN policy but
- // didn't find a servant in the Active Object Map, the POA takes the
- // following actions:
-
- // If the USE_ACTIVE_OBJECT_MAP_ONLY policy is in effect, the POA raises
- // the OBJECT_NOT_EXIST system exception.
- if (this->policies ().request_processing () == PortableServer::USE_ACTIVE_OBJECT_MAP_ONLY)
- {
- ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
- 0);
- }
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
- // If the POA has the USE_DEFAULT_SERVANT policy, a default servant
- // has been associated with the POA so the POA will invoke the
- // appropriate method on that servant. If no servant has been
- // associated with the POA, the POA raises the OBJ_ADAPTER system
- // exception.
- if (this->policies ().request_processing () == PortableServer::USE_DEFAULT_SERVANT)
- {
- PortableServer::Servant result = this->default_servant_.in ();
- if (result == 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
- else
- {
- // Success
- return result;
- }
- }
-
- // If the POA has the USE_SERVANT_MANAGER policy, a servant manager
- // has been associated with the POA so the POA will invoke incarnate
- // or preinvoke on it to find a servant that may handle the
- // request. (The choice of method depends on the NON_RETAIN or
- // RETAIN policy of the POA.) If no servant manager has been
- // associated with the POA, the POA raises the OBJ_ADAPTER system
- // exception.
- //
- // If a servant manager is located and invoked, but the servant
- // manager is not directly capable of incarnating the object, it
- // (the servant manager) may deal with the circumstance in a variety
- // of ways, all of which are the application's responsibility. Any
- // system exception raised by the servant manager will be returned
- // to the client in the reply. In addition to standard CORBA
- // exceptions, a servant manager is capable of raising a
- // ForwardRequest exception. This exception includes an object
- // reference.
- //
- if (this->policies ().request_processing () == PortableServer::USE_SERVANT_MANAGER)
- {
- if (CORBA::is_nil (this->servant_activator_.in ()) &&
- CORBA::is_nil (this->servant_locator_.in ()))
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
-
- PortableServer::POA_var poa = this->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- PortableServer::Servant servant = 0;
- if (this->policies ().servant_retention () == PortableServer::RETAIN)
- {
- {
- // A recursive thread lock without using a recursive
- // thread lock. Non_Servant_Upcall has a magic
- // constructor and destructor. We unlock the
- // Object_Adapter lock for the duration of the servant
- // activator upcalls; reacquiring once the upcalls
- // complete. Even though we are releasing the lock, other
- // threads will not be able to make progress since
- // <Object_Adapter::non_servant_upcall_in_progress_> has
- // been set.
- TAO_Object_Adapter::Non_Servant_Upcall non_servant_upcall (*this->orb_core_.object_adapter ());
- ACE_UNUSED_ARG (non_servant_upcall);
-
- // @@
- // Invocations of incarnate on the servant manager are serialized.
- // Invocations of etherealize on the servant manager are serialized.
- // Invocations of incarnate and etherealize on the servant manager are mutually exclusive.
- servant = this->servant_activator_->incarnate (poa_current_impl.object_id (),
- poa.in (),
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- if (servant == 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
- }
-
- // If the incarnate operation returns a servant that is
- // already active for a different Object Id and if the POA
- // also has the UNIQUE_ID policy, the incarnate has violated
- // the POA policy and is considered to be in error. The POA
- // will raise an OBJ_ADAPTER system exception for the
- // request.
- if (this->policies ().id_uniqueness () == PortableServer::UNIQUE_ID &&
- this->is_servant_in_map (servant))
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
-
- // The POA enters the returned Servant value into the Active
- // Object Map so that subsequent requests with the same
- // ObjectId value will be delivered directly to that servant
- // without invoking the servant manager.
- int result = this->active_object_map ().rebind_using_user_id_and_system_id (servant,
- poa_current_impl.object_id (),
- system_id,
- servant_upcall.active_object_map_entry_);
- if (result != 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
- else
- {
- // Increment the reference count.
- ++servant_upcall.active_object_map_entry ()->reference_count_;
-
- // If this operation causes the object to be activated,
- // _add_ref is invoked at least once on the Servant
- // argument before returning. Otherwise, the POA does
- // not increment or decrement the reference count of the
- // Servant passed to this function.
- servant->_add_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- // If we are a single threaded POA, set up the
- // appropriate locking in the servant.
- this->establish_servant_lock (servant);
-
- // Success
- return servant;
- }
- }
- else
- //
- // Don't retain servant
- //
- {
- // A recursive thread lock without using a recursive thread
- // lock. Non_Servant_Upcall has a magic constructor and
- // destructor. We unlock the Object_Adapter lock for the
- // duration of the servant activator upcalls; reacquiring
- // once the upcalls complete. Even though we are releasing
- // the lock, other threads will not be able to make progress
- // since <Object_Adapter::non_servant_upcall_in_progress_>
- // has been set.
- TAO_Object_Adapter::Non_Servant_Upcall non_servant_upcall (*this->orb_core_.object_adapter ());
- ACE_UNUSED_ARG (non_servant_upcall);
-
- // No serialization of invocations of preinvoke or
- // postinvoke may be assumed; there may be multiple
- // concurrent invocations of preinvoke for the same
- // ObjectId.
- //
- // The same thread will be used to preinvoke the object,
- // process the request, and postinvoke the object.
- //
- PortableServer::ServantLocator::Cookie cookie;
- PortableServer::Servant servant = this->servant_locator_->preinvoke (poa_current_impl.object_id (),
- poa.in (),
- operation,
- cookie,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- if (servant == 0)
- {
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
- }
-
- // If we are a single threaded POA, set up the
- // appropriate locking in the servant.
- this->establish_servant_lock (servant);
-
- // Remember to invoke <postinvoke>
- servant_upcall.using_servant_locator ();
-
- // Remember the cookie
- servant_upcall.locator_cookie (cookie);
-
- // Remember operation name.
- servant_upcall.operation (operation);
-
- // Success
- return servant;
- }
- }
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
- // Failure
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- 0);
-}
-
-/* static */
-int
-TAO_POA::parse_key (const TAO_ObjectKey &key,
- TAO_Object_Adapter::poa_name &poa_system_name,
- PortableServer::ObjectId &system_id,
- CORBA::Boolean &is_root,
- CORBA::Boolean &is_persistent,
- CORBA::Boolean &is_system_id,
- TAO_Temporary_Creation_Time &poa_creation_time)
-{
- // Start at zero.
- CORBA::ULong starting_at = 0;
-
- // Get the object key octets.
- const CORBA::Octet *key_data = key.get_buffer ();
-
-#if !defined (TAO_NO_IOR_TABLE)
- // Skip the object key prefix since we have already checked for
- // this.
- starting_at += TAO_OBJECTKEY_PREFIX_SIZE;
-#endif /* TAO_NO_IOR_TABLE */
-
- // Check the root indicator.
- char root_key_type = key_data[starting_at];
- if (root_key_type == TAO_POA::root_key_char ())
- {
- is_root = 1;
- }
- else if (root_key_type == TAO_POA::non_root_key_char ())
- {
- is_root = 0;
- }
- else
- {
- // Incorrect key
- return -1;
- }
-
- // Skip past the system id indicator
- starting_at += TAO_POA::root_key_type_length ();
-
- // Check the system id indicator.
- char system_id_key_type = key_data[starting_at];
- if (system_id_key_type == TAO_POA::system_id_key_char ())
- {
- is_system_id = 1;
- }
- else if (system_id_key_type == TAO_POA::user_id_key_char ())
- {
- is_system_id = 0;
- }
- else
- {
- // Incorrect key
- return -1;
- }
-
- // Skip past the system id indicator
- starting_at += TAO_POA::system_id_key_type_length ();
-
- // Check the persistence indicator
- char persistent_key_type = key_data[starting_at];
- if (persistent_key_type == TAO_POA::persistent_key_char ())
- {
- is_persistent = 1;
- }
- else if (persistent_key_type == TAO_POA::transient_key_char ())
- {
- is_persistent = 0;
- }
- else
- {
- // Incorrect key
- return -1;
- }
-
- // Skip past the persistent indicator
- starting_at += TAO_POA::persistent_key_type_length ();
-
-#if !defined (POA_NO_TIMESTAMP)
- // Grab the timestamp for transient POAs.
- if (!is_persistent)
- {
- // Take the creation time for the timestamp
- poa_creation_time.creation_time (key_data + starting_at);
-
- // Skip past the timestamp
- starting_at += TAO_Creation_Time::creation_time_length ();
- }
-#else
- ACE_UNUSED_ARG (poa_creation_time);
-#endif /* POA_NO_TIMESTAMP */
-
- // Calculate the size of the POA name.
- CORBA::ULong poa_name_size = 0;
- if (!is_persistent)
- {
- // Transient POAs have fixed size.
- poa_name_size = TAO_Object_Adapter::transient_poa_name_size ();
- }
- else if (is_system_id)
- {
- // System ids have fixed size.
- poa_name_size = key.length () - starting_at - TAO_Active_Object_Map::system_id_size ();
- }
- else
- {
- // Get the size from the object key.
- ACE_OS::memcpy (&poa_name_size,
- key_data + starting_at,
- sizeof (poa_name_size));
- poa_name_size = ACE_NTOHL (poa_name_size);
-
- starting_at += sizeof (poa_name_size);
- }
-
- // For non-root POAs, grab their name.
- if (!is_root)
- {
- poa_system_name.replace (poa_name_size,
- poa_name_size,
- (CORBA::Octet *) key_data + starting_at,
- 0);
-
- starting_at += poa_name_size;
- }
-
- // The rest is the system id.
- CORBA::ULong system_id_size = key.length () - starting_at;
-
- // Reset <system_id>.
- system_id.replace (system_id_size,
- system_id_size,
- (CORBA::Octet *) key_data + starting_at,
- 0);
-
- // Success
- return 0;
-}
-
-TAO_ObjectKey *
-TAO_POA::create_object_key (const PortableServer::ObjectId &id)
-{
- // Calculate the prefix size.
- CORBA::ULong prefix_size = 0;
-#if !defined (TAO_NO_IOR_TABLE)
- prefix_size += TAO_OBJECTKEY_PREFIX_SIZE;
-#endif /* TAO_NO_IOR_TABLE */
-
- // If we are dealing with a persistent POA and user ids are being
- // used, then we need to add the POA name length field to the object
- // key. Otherwise, the POA name length can be calculated by looking
- // at the remainder after extracting other parts of the key.
- int add_poa_name_length =
- this->persistent_ &&
- !this->system_id_;
-
- // Size required by the POA name.
- CORBA::ULong poa_name = 0;
-
- // Calculate the space required for the POA name.
- CORBA::ULong poa_name_length = this->system_name_->length ();
- if (!this->root ())
- {
- poa_name += poa_name_length;
- }
-
- // Check if we need to added the length of the POA name.
- if (add_poa_name_length)
- {
- poa_name += sizeof (poa_name_length);
- }
-
- // Calculate the space required for the timestamp and the persistent
- // byte.
- CORBA::ULong creation_time = this->persistent_key_type_length ();
-#if !defined (POA_NO_TIMESTAMP)
- // Calculate the space required for the timestamp.
- CORBA::ULong creation_time_length = TAO_Creation_Time::creation_time_length ();
- if (!this->persistent_)
- {
- creation_time += creation_time_length;
- }
-#endif /* POA_NO_TIMESTAMP */
-
- // Calculate the space required for the key.
- CORBA::ULong buffer_size =
- prefix_size +
- this->root_key_type_length () +
- this->system_id_key_type_length () +
- creation_time +
- poa_name +
- id.length ();
-
- // Create the buffer for the key.
- CORBA::Octet *buffer = TAO_ObjectKey::allocbuf (buffer_size);
-
- // Keeps track of where the next infomation goes; start at 0 byte.
- CORBA::ULong starting_at = 0;
-
-#if !defined (TAO_NO_IOR_TABLE)
- // Add the object key prefix.
- ACE_OS::memcpy (&buffer[starting_at],
- &objectkey_prefix[0],
- TAO_OBJECTKEY_PREFIX_SIZE);
-
- starting_at += TAO_OBJECTKEY_PREFIX_SIZE;
-#endif /* TAO_NO_IOR_TABLE */
-
- // Copy the root byte.
- buffer[starting_at] = (CORBA::Octet) this->root_key_type ();
- starting_at += this->root_key_type_length ();
-
- // Copy the system id byte.
- buffer[starting_at] = (CORBA::Octet) this->system_id_key_type ();
- starting_at += this->system_id_key_type_length ();
-
- // Copy the persistence byte.
- buffer[starting_at] = (CORBA::Octet) this->persistent_key_type ();
- starting_at += this->persistent_key_type_length ();
-
-#if !defined (POA_NO_TIMESTAMP)
- // Then copy the timestamp for transient POAs.
- if (!this->persistent ())
- {
- ACE_OS::memcpy (&buffer[starting_at],
- this->creation_time_.creation_time (),
- creation_time_length);
- starting_at += creation_time_length;
- }
-#endif /* POA_NO_TIMESTAMP */
-
- // Check if we need to added the length of the POA name.
- if (add_poa_name_length)
- {
- poa_name_length = ACE_HTONL (poa_name_length);
- ACE_OS::memcpy (&buffer[starting_at],
- &poa_name_length,
- sizeof (poa_name_length));
- starting_at += sizeof (poa_name_length);
- }
-
- // Put the POA name into the key (for non-root POAs).
- if (!this->root ())
- {
- ACE_OS::memcpy (&buffer[starting_at],
- this->system_name_->get_buffer (),
- this->system_name_->length ());
- starting_at += this->system_name_->length ();
- }
-
- // Then copy the object id into the key.
- ACE_OS::memcpy (&buffer[starting_at],
- id.get_buffer (),
- id.length ());
-
- // Create the key, giving the ownership of the buffer to the
- // sequence.
- TAO_ObjectKey *key = 0;
- ACE_NEW_RETURN (key,
- TAO_ObjectKey (buffer_size,
- buffer_size,
- buffer,
- 1),
- 0);
-
- return key;
-}
-
-int
-TAO_POA::is_poa_generated_id (const PortableServer::ObjectId &id)
-{
-
-#if defined (POA_NAME_IN_POA_GENERATED_ID)
-
- // Grab the buffer
- const char *id_buffer = (const char *) id.get_buffer ();
-
- // Check to see if the POA name is the first part of the id
- return
- this->name_.length () < id.length () &&
- ACE_OS::strncmp (id_buffer,
- this->name_.c_str (),
- this->name_.length ()) == 0;
-
-#else /* POA_NAME_IN_POA_GENERATED_ID */
-
- ACE_UNUSED_ARG (id);
- return 1;
-
-#endif /* POA_NAME_IN_POA_GENERATED_ID */
-}
-
-void
-TAO_POA::set_folded_name (void)
-{
- CORBA::ULong length = 0;
- CORBA::ULong parent_length = 0;
-
- if (this->parent_ != 0)
- {
- parent_length = this->parent_->folded_name ().length ();
- length += parent_length;
- }
-
- length += this->name_.length ();
- length += TAO_POA::name_separator_length ();
-
- this->folded_name_.length (length);
- CORBA::Octet *folded_name_buffer = this->folded_name_.get_buffer ();
-
- if (this->parent_ != 0)
- {
- ACE_OS::memcpy (folded_name_buffer,
- this->parent_->folded_name ().get_buffer (),
- parent_length);
- }
-
- ACE_OS::memcpy (&folded_name_buffer[parent_length],
- this->name_.c_str (),
- this->name_.length ());
-
- folded_name_buffer[length - TAO_POA::name_separator_length ()] = TAO_POA::name_separator ();
-}
-
-PortableServer::ObjectId *
-TAO_POA::string_to_ObjectId (const char *string)
-{
- // Size of string
- //
- // We DO NOT include the zero terminator, as this is simply an
- // artifact of the way strings are stored in C.
- //
- CORBA::ULong buffer_size = ACE_OS::strlen (string);
-
- // Create the buffer for the Id
- CORBA::Octet *buffer = PortableServer::ObjectId::allocbuf (buffer_size);
-
- // Copy the contents
- ACE_OS::memcpy (buffer, string, buffer_size);
-
- // Create and return a new ID
- PortableServer::ObjectId *id = 0;
- ACE_NEW_RETURN (id,
- PortableServer::ObjectId (buffer_size,
- buffer_size,
- buffer,
- 1),
- 0);
-
- return id;
-}
-
-PortableServer::ObjectId *
-TAO_POA::string_to_ObjectId (const char *string,
- int size)
-{
- // Create the buffer for the Id
- CORBA::Octet *buffer = PortableServer::ObjectId::allocbuf (size);
-
- // Copy the contents
- ACE_OS::memcpy (buffer, string, size);
-
- // Create and return a new ID
- PortableServer::ObjectId *id = 0;
- ACE_NEW_RETURN (id,
- PortableServer::ObjectId (size,
- size,
- buffer,
- 1),
- 0);
-
- return id;
-}
-
-PortableServer::ObjectId *
-TAO_POA::wstring_to_ObjectId (const CORBA::WChar *string)
-{
- // Size of Id
- //
- // We DO NOT include the zero terminator, as this is simply an
- // artifact of the way strings are stored in C.
- //
- CORBA::ULong string_length = ACE_OS::wslen (string);
-
- size_t buffer_size = string_length * sizeof (CORBA::WChar);
-
- // Create the buffer for the Id
- CORBA::Octet *buffer = PortableServer::ObjectId::allocbuf (buffer_size);
-
- // Copy contents
- ACE_OS::memcpy (buffer, string, buffer_size);
-
- // Create a new ID
- PortableServer::ObjectId *id = 0;
- ACE_NEW_RETURN (id,
- PortableServer::ObjectId (buffer_size,
- buffer_size,
- buffer,
- 1),
- 0);
-
- return id;
-}
-
-CORBA::String
-TAO_POA::ObjectId_to_string (const PortableServer::ObjectId &id)
-{
- // Create space
- CORBA::String string = CORBA::string_alloc (id.length ());
-
- // Copy the data
- ACE_OS::memcpy (string, id.get_buffer (), id.length ());
-
- // Null terminate the string
- string[id.length ()] = '\0';
-
- // Return string
- return string;
-}
-
-CORBA::WChar *
-TAO_POA::ObjectId_to_wstring (const PortableServer::ObjectId &id)
-{
- // Create space
- CORBA::WChar* string = CORBA::wstring_alloc (id.length ());
-
- // Copy the data
- ACE_OS::memcpy (string, id.get_buffer (), id.length () * sizeof (CORBA::WChar));
-
- // Null terminate the string
- string[id.length ()] = '\0';
-
- // Return string
- return string;
-}
-
-void
-TAO_POA::encode_sequence_to_string (CORBA::String &str,
- const TAO_Unbounded_Sequence<CORBA::Octet> &seq)
-{
- // We must allocate a buffer which is (gag) 3 times the length
- // of the sequence, which is the length required in the worst-case
- // scenario of all non-printable characters.
- //
- // There are two strategies here...we could allocate all that space here,
- // fill it up, then copy-allocate new space of just the right length.
- // OR, we could just return this space. The classic time-space tradeoff,
- // and for now we'll let time win out, which means that we only do the
- // allocation once.
- u_int len = 3 * seq.length() + 1 /* for zero termination */;
- str = CORBA::string_alloc (len);
-
- char *cp = str;
-
- for (u_int i = 0;
- cp < (cp+len) && i < seq.length();
- i++)
- {
- u_char byte = seq[i];
- if (isprint (byte) && byte != '\\')
- {
- *cp++ = (char) byte;
- continue;
- }
-
- *cp++ = '\\';
- *cp++ = ACE::nibble2hex ((byte >> 4) & 0x0f);
- *cp++ = ACE::nibble2hex (byte & 0x0f);
- }
- // Zero terminate
- *cp = '\0';
-}
-
-void
-TAO_POA::decode_string_to_sequence (TAO_Unbounded_Sequence<CORBA::Octet> &seq,
- const char *str)
-{
- if (str == 0)
- {
- seq.length (0);
- return;
- }
-
- u_int length = ACE_OS::strlen (str);
- const char *eos = str + length;
- const char *cp = str;
-
- // Set the length of the sequence to be as long as
- // we'll possibly need...we'll reset it to the actual
- // length later.
- seq.length (length);
-
- u_int i = 0;
- for (;
- cp < eos && i < seq.length ();
- i++)
- {
- if (*cp == '\\')
- {
- // This is an escaped non-printable,
- // so we decode the hex values into
- // the sequence's octet
- seq[i] = (u_char) (ACE::hex2byte (cp[1]) << 4);
- seq[i] |= (u_char) ACE::hex2byte (cp[2]);
- cp += 3;
- }
- else
- // Copy it in
- seq[i] = *cp++;
- }
-
- // Set the length appropriately
- seq.length (i);
-}
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-PortableServer::ThreadPolicy_ptr
-TAO_POA::create_thread_policy (PortableServer::ThreadPolicyValue value,
- CORBA::Environment &ACE_TRY_ENV)
-{
- PortableServer::POA_var rootPOA = this->orb_core_.root_poa_reference (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::ThreadPolicy::_nil ());
-
- TAO_Thread_Policy *thread_policy = 0;
- ACE_NEW_THROW_EX (thread_policy,
- TAO_Thread_Policy (value,
- rootPOA.in ()),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (PortableServer::ThreadPolicy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Thread_Policy> new_thread_policy (thread_policy);
-
- PortableServer::ThreadPolicy_var result = new_thread_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::ThreadPolicy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_thread_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::ThreadPolicy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_thread_policy.release ();
- return result._retn ();
-}
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-PortableServer::LifespanPolicy_ptr
-TAO_POA::create_lifespan_policy (PortableServer::LifespanPolicyValue value,
- CORBA::Environment &ACE_TRY_ENV)
-{
- PortableServer::POA_var rootPOA = this->orb_core_.root_poa_reference (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::LifespanPolicy::_nil ());
-
- TAO_Lifespan_Policy *lifespan_policy = 0;
- ACE_NEW_THROW_EX (lifespan_policy,
- TAO_Lifespan_Policy (value,
- rootPOA.in ()),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (PortableServer::LifespanPolicy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Lifespan_Policy> new_lifespan_policy (lifespan_policy);
-
- PortableServer::LifespanPolicy_var result = new_lifespan_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::LifespanPolicy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_lifespan_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::LifespanPolicy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_lifespan_policy.release ();
- return result._retn ();
-}
-
-PortableServer::IdUniquenessPolicy_ptr
-TAO_POA::create_id_uniqueness_policy (PortableServer::IdUniquenessPolicyValue value,
- CORBA::Environment &ACE_TRY_ENV)
-{
- PortableServer::POA_var rootPOA = this->orb_core_.root_poa_reference (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::IdUniquenessPolicy::_nil ());
-
- TAO_Id_Uniqueness_Policy *id_uniqueness_policy = 0;
- ACE_NEW_THROW_EX (id_uniqueness_policy,
- TAO_Id_Uniqueness_Policy (value,
- rootPOA.in ()),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (PortableServer::IdUniquenessPolicy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Id_Uniqueness_Policy> new_id_uniqueness_policy (id_uniqueness_policy);
-
- PortableServer::IdUniquenessPolicy_var result = new_id_uniqueness_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::IdUniquenessPolicy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_id_uniqueness_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::IdUniquenessPolicy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_id_uniqueness_policy.release ();
- return result._retn ();
-}
-
-PortableServer::IdAssignmentPolicy_ptr
-TAO_POA::create_id_assignment_policy (PortableServer::IdAssignmentPolicyValue value,
- CORBA::Environment &ACE_TRY_ENV)
-{
- PortableServer::POA_var rootPOA = this->orb_core_.root_poa_reference (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::IdAssignmentPolicy::_nil ());
-
- TAO_Id_Assignment_Policy *id_assignment_policy = 0;
- ACE_NEW_THROW_EX (id_assignment_policy,
- TAO_Id_Assignment_Policy (value,
- rootPOA.in ()),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (PortableServer::IdAssignmentPolicy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Id_Assignment_Policy> new_id_assignment_policy (id_assignment_policy);
-
- PortableServer::IdAssignmentPolicy_var result = new_id_assignment_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::IdAssignmentPolicy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_id_assignment_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::IdAssignmentPolicy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_id_assignment_policy.release ();
- return result._retn ();
-}
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-PortableServer::ImplicitActivationPolicy_ptr
-TAO_POA::create_implicit_activation_policy (PortableServer::ImplicitActivationPolicyValue value,
- CORBA::Environment &ACE_TRY_ENV)
-{
- PortableServer::POA_var rootPOA = this->orb_core_.root_poa_reference (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::ImplicitActivationPolicy::_nil ());
-
- TAO_Implicit_Activation_Policy *implicit_activation_policy = 0;
- ACE_NEW_THROW_EX (implicit_activation_policy,
- TAO_Implicit_Activation_Policy (value,
- rootPOA.in ()),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (PortableServer::ImplicitActivationPolicy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Implicit_Activation_Policy> new_implicit_activation_policy (implicit_activation_policy);
-
- PortableServer::ImplicitActivationPolicy_var result = new_implicit_activation_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::ImplicitActivationPolicy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_implicit_activation_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::ImplicitActivationPolicy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_implicit_activation_policy.release ();
- return result._retn ();
-}
-
-PortableServer::ServantRetentionPolicy_ptr
-TAO_POA::create_servant_retention_policy (PortableServer::ServantRetentionPolicyValue value,
- CORBA::Environment &ACE_TRY_ENV)
-{
- PortableServer::POA_var rootPOA = this->orb_core_.root_poa_reference (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::ServantRetentionPolicy::_nil ());
-
- TAO_Servant_Retention_Policy *servant_retention_policy = 0;
- ACE_NEW_THROW_EX (servant_retention_policy,
- TAO_Servant_Retention_Policy (value,
- rootPOA.in ()),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (PortableServer::ServantRetentionPolicy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Servant_Retention_Policy> new_servant_retention_policy (servant_retention_policy);
-
- PortableServer::ServantRetentionPolicy_var result = new_servant_retention_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::ServantRetentionPolicy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_servant_retention_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::ServantRetentionPolicy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_servant_retention_policy.release ();
- return result._retn ();
-}
-
-PortableServer::RequestProcessingPolicy_ptr
-TAO_POA::create_request_processing_policy (PortableServer::RequestProcessingPolicyValue value,
- CORBA::Environment &ACE_TRY_ENV)
-{
- PortableServer::POA_var rootPOA = this->orb_core_.root_poa_reference (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::RequestProcessingPolicy::_nil ());
-
- TAO_Request_Processing_Policy *request_processing_policy = 0;
- ACE_NEW_THROW_EX (request_processing_policy,
- TAO_Request_Processing_Policy (value,
- rootPOA.in ()),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (PortableServer::RequestProcessingPolicy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Request_Processing_Policy> new_request_processing_policy (request_processing_policy);
-
- PortableServer::RequestProcessingPolicy_var result = new_request_processing_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::RequestProcessingPolicy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_request_processing_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::RequestProcessingPolicy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_request_processing_policy.release ();
- return result._retn ();
-}
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-TAO_Thread_Policy::TAO_Thread_Policy (PortableServer::ThreadPolicyValue value,
- PortableServer::POA_ptr poa)
- : value_ (value),
- poa_ (PortableServer::POA::_duplicate (poa))
-{
-}
-
-PortableServer::ThreadPolicyValue
-TAO_Thread_Policy::value (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return this->value_;
-}
-
-CORBA::Policy_ptr
-TAO_Thread_Policy::copy (CORBA::Environment &ACE_TRY_ENV)
-{
- TAO_Thread_Policy *thread_policy_copy = 0;
- ACE_NEW_THROW_EX (thread_policy_copy,
- TAO_Thread_Policy (*this),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Thread_Policy> new_thread_policy (thread_policy_copy);
-
- CORBA::Policy_var result = new_thread_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_thread_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_thread_policy.release ();
- return result._retn ();
-}
-
-void
-TAO_Thread_Policy::destroy (CORBA::Environment &ACE_TRY_ENV)
-{
- //
- // Remove self from POA. Because of reference counting, the POA
- // will automatically delete the servant when all pending requests
- // on this servant are complete.
- //
-
- PortableServer::POA_var poa = this->_default_POA (ACE_TRY_ENV);
- ACE_CHECK;
-
- PortableServer::ObjectId_var id = poa->servant_to_id (this,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- poa->deactivate_object (id.in (),
- ACE_TRY_ENV);
- ACE_CHECK;
-}
-
-CORBA::PolicyType
-TAO_Thread_Policy::policy_type (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return PortableServer::THREAD_POLICY_ID;
-}
-
-PortableServer::POA_ptr
-TAO_Thread_Policy::_default_POA (CORBA::Environment & /* ACE_TRY_ENV */)
-{
- return PortableServer::POA::_duplicate (this->poa_.in ());
-}
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-TAO_Lifespan_Policy::TAO_Lifespan_Policy (PortableServer::LifespanPolicyValue value,
- PortableServer::POA_ptr poa)
- : value_ (value),
- poa_ (PortableServer::POA::_duplicate (poa))
-{
-}
-
-PortableServer::LifespanPolicyValue
-TAO_Lifespan_Policy::value (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return this->value_;
-}
-
-CORBA::Policy_ptr
-TAO_Lifespan_Policy::copy (CORBA::Environment &ACE_TRY_ENV)
-{
- TAO_Lifespan_Policy *lifespan_policy_copy = 0;
- ACE_NEW_THROW_EX (lifespan_policy_copy,
- TAO_Lifespan_Policy (*this),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Lifespan_Policy> new_lifespan_policy (lifespan_policy_copy);
-
- CORBA::Policy_var result = new_lifespan_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_lifespan_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_lifespan_policy.release ();
- return result._retn ();
-}
-
-void
-TAO_Lifespan_Policy::destroy (CORBA::Environment &ACE_TRY_ENV)
-{
- //
- // Remove self from POA. Because of reference counting, the POA
- // will automatically delete the servant when all pending requests
- // on this servant are complete.
- //
-
- PortableServer::POA_var poa = this->_default_POA (ACE_TRY_ENV);
- ACE_CHECK;
-
- PortableServer::ObjectId_var id = poa->servant_to_id (this,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- poa->deactivate_object (id.in (),
- ACE_TRY_ENV);
- ACE_CHECK;
-}
-
-CORBA::PolicyType
-TAO_Lifespan_Policy::policy_type (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return PortableServer::LIFESPAN_POLICY_ID;
-}
-
-PortableServer::POA_ptr
-TAO_Lifespan_Policy::_default_POA (CORBA::Environment & /* ACE_TRY_ENV */)
-{
- return PortableServer::POA::_duplicate (this->poa_.in ());
-}
-
-TAO_Id_Uniqueness_Policy::TAO_Id_Uniqueness_Policy (PortableServer::IdUniquenessPolicyValue value,
- PortableServer::POA_ptr poa)
- : value_ (value),
- poa_ (PortableServer::POA::_duplicate (poa))
-{
-}
-
-PortableServer::IdUniquenessPolicyValue
-TAO_Id_Uniqueness_Policy::value (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return this->value_;
-}
-
-CORBA::Policy_ptr
-TAO_Id_Uniqueness_Policy::copy (CORBA::Environment &ACE_TRY_ENV)
-{
- TAO_Id_Uniqueness_Policy *id_uniqueness_policy_copy = 0;
- ACE_NEW_THROW_EX (id_uniqueness_policy_copy,
- TAO_Id_Uniqueness_Policy (*this),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Id_Uniqueness_Policy> new_id_uniqueness_policy (id_uniqueness_policy_copy);
-
- CORBA::Policy_var result = new_id_uniqueness_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_id_uniqueness_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_id_uniqueness_policy.release ();
- return result._retn ();
-}
-
-void
-TAO_Id_Uniqueness_Policy::destroy (CORBA::Environment &ACE_TRY_ENV)
-{
- //
- // Remove self from POA. Because of reference counting, the POA
- // will automatically delete the servant when all pending requests
- // on this servant are complete.
- //
-
- PortableServer::POA_var poa = this->_default_POA (ACE_TRY_ENV);
- ACE_CHECK;
-
- PortableServer::ObjectId_var id = poa->servant_to_id (this,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- poa->deactivate_object (id.in (),
- ACE_TRY_ENV);
- ACE_CHECK;
-}
-
-CORBA::PolicyType
-TAO_Id_Uniqueness_Policy::policy_type (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return PortableServer::ID_UNIQUENESS_POLICY_ID;
-}
-
-PortableServer::POA_ptr
-TAO_Id_Uniqueness_Policy::_default_POA (CORBA::Environment & /* ACE_TRY_ENV */)
-{
- return PortableServer::POA::_duplicate (this->poa_.in ());
-}
-
-TAO_Id_Assignment_Policy::TAO_Id_Assignment_Policy (PortableServer::IdAssignmentPolicyValue value,
- PortableServer::POA_ptr poa)
- : value_ (value),
- poa_ (PortableServer::POA::_duplicate (poa))
-{
-}
-
-PortableServer::IdAssignmentPolicyValue
-TAO_Id_Assignment_Policy::value (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return this->value_;
-}
-
-CORBA::Policy_ptr
-TAO_Id_Assignment_Policy::copy (CORBA::Environment &ACE_TRY_ENV)
-{
- TAO_Id_Assignment_Policy *id_assignment_policy_copy = 0;
- ACE_NEW_THROW_EX (id_assignment_policy_copy,
- TAO_Id_Assignment_Policy (*this),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Id_Assignment_Policy> new_id_assignment_policy (id_assignment_policy_copy);
-
- CORBA::Policy_var result = new_id_assignment_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_id_assignment_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_id_assignment_policy.release ();
- return result._retn ();
-}
-
-void
-TAO_Id_Assignment_Policy::destroy (CORBA::Environment &ACE_TRY_ENV)
-{
- //
- // Remove self from POA. Because of reference counting, the POA
- // will automatically delete the servant when all pending requests
- // on this servant are complete.
- //
-
- PortableServer::POA_var poa = this->_default_POA (ACE_TRY_ENV);
- ACE_CHECK;
-
- PortableServer::ObjectId_var id = poa->servant_to_id (this,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- poa->deactivate_object (id.in (),
- ACE_TRY_ENV);
- ACE_CHECK;
-}
-
-CORBA::PolicyType
-TAO_Id_Assignment_Policy::policy_type (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return PortableServer::ID_ASSIGNMENT_POLICY_ID;
-}
-
-PortableServer::POA_ptr
-TAO_Id_Assignment_Policy::_default_POA (CORBA::Environment & /* ACE_TRY_ENV */)
-{
- return PortableServer::POA::_duplicate (this->poa_.in ());
-}
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-TAO_Implicit_Activation_Policy::TAO_Implicit_Activation_Policy (PortableServer::ImplicitActivationPolicyValue value,
- PortableServer::POA_ptr poa)
- : value_ (value),
- poa_ (PortableServer::POA::_duplicate (poa))
-{
-}
-
-PortableServer::ImplicitActivationPolicyValue
-TAO_Implicit_Activation_Policy::value (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return this->value_;
-}
-
-CORBA::Policy_ptr
-TAO_Implicit_Activation_Policy::copy (CORBA::Environment &ACE_TRY_ENV)
-{
- TAO_Implicit_Activation_Policy *implicit_activation_policy_copy = 0;
- ACE_NEW_THROW_EX (implicit_activation_policy_copy,
- TAO_Implicit_Activation_Policy (*this),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Implicit_Activation_Policy> new_implicit_activation_policy (implicit_activation_policy_copy);
-
- CORBA::Policy_var result = new_implicit_activation_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_implicit_activation_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_implicit_activation_policy.release ();
- return result._retn ();
-}
-
-void
-TAO_Implicit_Activation_Policy::destroy (CORBA::Environment &ACE_TRY_ENV)
-{
- //
- // Remove self from POA. Because of reference counting, the POA
- // will automatically delete the servant when all pending requests
- // on this servant are complete.
- //
-
- PortableServer::POA_var poa = this->_default_POA (ACE_TRY_ENV);
- ACE_CHECK;
-
- PortableServer::ObjectId_var id = poa->servant_to_id (this,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- poa->deactivate_object (id.in (),
- ACE_TRY_ENV);
- ACE_CHECK;
-}
-
-CORBA::PolicyType
-TAO_Implicit_Activation_Policy::policy_type (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return PortableServer::IMPLICIT_ACTIVATION_POLICY_ID;
-}
-
-PortableServer::POA_ptr
-TAO_Implicit_Activation_Policy::_default_POA (CORBA::Environment & /* ACE_TRY_ENV */)
-{
- return PortableServer::POA::_duplicate (this->poa_.in ());
-}
-
-TAO_Servant_Retention_Policy::TAO_Servant_Retention_Policy (PortableServer::ServantRetentionPolicyValue value,
- PortableServer::POA_ptr poa)
- : value_ (value),
- poa_ (PortableServer::POA::_duplicate (poa))
-{
-}
-
-PortableServer::ServantRetentionPolicyValue
-TAO_Servant_Retention_Policy::value (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return this->value_;
-}
-
-CORBA::Policy_ptr
-TAO_Servant_Retention_Policy::copy (CORBA::Environment &ACE_TRY_ENV)
-{
- TAO_Servant_Retention_Policy *servant_retention_policy_copy = 0;
- ACE_NEW_THROW_EX (servant_retention_policy_copy,
- TAO_Servant_Retention_Policy (*this),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Servant_Retention_Policy> new_servant_retention_policy (servant_retention_policy_copy);
-
- CORBA::Policy_var result = new_servant_retention_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_servant_retention_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_servant_retention_policy.release ();
- return result._retn ();
-}
-
-void
-TAO_Servant_Retention_Policy::destroy (CORBA::Environment &ACE_TRY_ENV)
-{
- //
- // Remove self from POA. Because of reference counting, the POA
- // will automatically delete the servant when all pending requests
- // on this servant are complete.
- //
-
- PortableServer::POA_var poa = this->_default_POA (ACE_TRY_ENV);
- ACE_CHECK;
-
- PortableServer::ObjectId_var id = poa->servant_to_id (this,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- poa->deactivate_object (id.in (),
- ACE_TRY_ENV);
- ACE_CHECK;
-}
-
-CORBA::PolicyType
-TAO_Servant_Retention_Policy::policy_type (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return PortableServer::SERVANT_RETENTION_POLICY_ID;
-}
-
-PortableServer::POA_ptr
-TAO_Servant_Retention_Policy::_default_POA (CORBA::Environment & /* ACE_TRY_ENV */)
-{
- return PortableServer::POA::_duplicate (this->poa_.in ());
-}
-
-TAO_Request_Processing_Policy::TAO_Request_Processing_Policy (PortableServer::RequestProcessingPolicyValue value,
- PortableServer::POA_ptr poa)
- : value_ (value),
- poa_ (PortableServer::POA::_duplicate (poa))
-{
-}
-
-PortableServer::RequestProcessingPolicyValue
-TAO_Request_Processing_Policy::value (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return this->value_;
-}
-
-CORBA::Policy_ptr
-TAO_Request_Processing_Policy::copy (CORBA::Environment &ACE_TRY_ENV)
-{
- TAO_Request_Processing_Policy *request_processing_policy_copy = 0;
- ACE_NEW_THROW_EX (request_processing_policy_copy,
- TAO_Request_Processing_Policy (*this),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of the copy to the auto pointer.
- auto_ptr<TAO_Request_Processing_Policy> new_request_processing_policy (request_processing_policy_copy);
-
- CORBA::Policy_var result = new_request_processing_policy->_this (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Give ownership of this servant to the POA.
- new_request_processing_policy->_remove_ref (ACE_TRY_ENV);
- ACE_CHECK_RETURN (CORBA::Policy::_nil ());
-
- // Make sure that the auto_ptr does not delete the implementation
- // object.
- new_request_processing_policy.release ();
- return result._retn ();
-}
-
-void
-TAO_Request_Processing_Policy::destroy (CORBA::Environment &ACE_TRY_ENV)
-{
- //
- // Remove self from POA. Because of reference counting, the POA
- // will automatically delete the servant when all pending requests
- // on this servant are complete.
- //
-
- PortableServer::POA_var poa = this->_default_POA (ACE_TRY_ENV);
- ACE_CHECK;
-
- PortableServer::ObjectId_var id = poa->servant_to_id (this,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- poa->deactivate_object (id.in (),
- ACE_TRY_ENV);
- ACE_CHECK;
-}
-
-CORBA::PolicyType
-TAO_Request_Processing_Policy::policy_type (CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_UNUSED_ARG (ACE_TRY_ENV);
- return PortableServer::REQUEST_PROCESSING_POLICY_ID;
-}
-
-PortableServer::POA_ptr
-TAO_Request_Processing_Policy::_default_POA (CORBA::Environment & /* ACE_TRY_ENV */)
-{
- return PortableServer::POA::_duplicate (this->poa_.in ());
-}
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-TAO_POA_Policies::TAO_POA_Policies (void)
- : thread_ (PortableServer::ORB_CTRL_MODEL),
- lifespan_ (PortableServer::TRANSIENT),
- id_uniqueness_ (PortableServer::UNIQUE_ID),
- id_assignment_ (PortableServer::SYSTEM_ID),
- implicit_activation_ (PortableServer::NO_IMPLICIT_ACTIVATION),
- servant_retention_ (PortableServer::RETAIN),
- request_processing_ (PortableServer::USE_ACTIVE_OBJECT_MAP_ONLY)
-{
-}
-
-void
-TAO_POA_Policies::parse_policies (const CORBA::PolicyList &policies,
- CORBA::Environment &ACE_TRY_ENV)
-{
- for (CORBA::ULong i = 0;
- i < policies.length ();
- i++)
- {
- this->parse_policy (policies[i],
- ACE_TRY_ENV);
- ACE_CHECK;
- }
-
- if (this->validity_check () == -1)
- {
- ACE_THROW (PortableServer::POA::InvalidPolicy ());
- }
-}
-
-int
-TAO_POA_Policies::validity_check (void)
-{
- // The NON_RETAIN policy requires either the USE_DEFAULT_SERVANT or
- // USE_SERVANT_MANAGER policies.
- if (this->servant_retention_ == PortableServer::NON_RETAIN)
- if (this->request_processing_ != PortableServer::USE_SERVANT_MANAGER &&
- this->request_processing_ != PortableServer::USE_DEFAULT_SERVANT)
- return -1;
-
- // USE_ACTIVE_OBJECT_MAP_ONLY requires the RETAIN policy.
- if (this->request_processing_ == PortableServer::USE_ACTIVE_OBJECT_MAP_ONLY)
- if (this->servant_retention_ != PortableServer::RETAIN)
- return -1;
-
- // USE_DEFAULT_SERVANT requires the MULTIPLE_ID policy.
- if (this->request_processing_ == PortableServer::USE_DEFAULT_SERVANT)
- if (this->id_uniqueness_ != PortableServer::MULTIPLE_ID)
- return -1;
-
- // IMPLICIT_ACTIVATION requires the SYSTEM_ID and RETAIN policies.
- if (this->implicit_activation_ == PortableServer::IMPLICIT_ACTIVATION)
- if (this->servant_retention_ != PortableServer::RETAIN ||
- this->id_assignment_ != PortableServer::SYSTEM_ID)
- return -1;
-
- return 0;
-}
-
-void
-TAO_POA_Policies::parse_policy (const CORBA::Policy_ptr policy,
- CORBA::Environment &ACE_TRY_ENV)
-{
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
- PortableServer::ThreadPolicy_var thread
- = PortableServer::ThreadPolicy::_narrow (policy,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- if (!CORBA::is_nil (thread.in ()))
- {
- this->thread_ = thread->value (ACE_TRY_ENV);
- ACE_CHECK;
-
- return;
- }
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
- PortableServer::LifespanPolicy_var lifespan
- = PortableServer::LifespanPolicy::_narrow (policy,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- if (!CORBA::is_nil (lifespan.in ()))
- {
- this->lifespan_ = lifespan->value (ACE_TRY_ENV);
- ACE_CHECK;
-
- return;
- }
-
- PortableServer::IdUniquenessPolicy_var id_uniqueness
- = PortableServer::IdUniquenessPolicy::_narrow (policy,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- if (!CORBA::is_nil (id_uniqueness.in ()))
- {
- this->id_uniqueness_ = id_uniqueness->value (ACE_TRY_ENV);
- ACE_CHECK;
-
- return;
- }
-
- PortableServer::IdAssignmentPolicy_var id_assignment
- = PortableServer::IdAssignmentPolicy::_narrow (policy,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- if (!CORBA::is_nil (id_assignment.in ()))
- {
- this->id_assignment_ = id_assignment->value (ACE_TRY_ENV);
- ACE_CHECK;
-
- return;
- }
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
- PortableServer::ImplicitActivationPolicy_var implicit_activation
- = PortableServer::ImplicitActivationPolicy::_narrow (policy,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- if (!CORBA::is_nil (implicit_activation.in ()))
- {
- this->implicit_activation_ = implicit_activation->value (ACE_TRY_ENV);
- ACE_CHECK;
-
- return;
- }
-
- PortableServer::ServantRetentionPolicy_var servant_retention
- = PortableServer::ServantRetentionPolicy::_narrow (policy,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- if (!CORBA::is_nil (servant_retention.in ()))
- {
- this->servant_retention_ = servant_retention->value (ACE_TRY_ENV);
- ACE_CHECK;
-
- return;
- }
-
- PortableServer::RequestProcessingPolicy_var request_processing
- = PortableServer::RequestProcessingPolicy::_narrow (policy,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- if (!CORBA::is_nil (request_processing.in ()))
- {
- this->request_processing_ = request_processing->value (ACE_TRY_ENV);
- ACE_CHECK;
-
- return;
- }
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
- ACE_THROW (PortableServer::POA::InvalidPolicy ());
-}
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-TAO_Adapter_Activator::TAO_Adapter_Activator (PortableServer::POAManager_ptr poa_manager)
- : poa_manager_ (PortableServer::POAManager::_duplicate (poa_manager))
-{
-}
-
-CORBA::Boolean
-TAO_Adapter_Activator::unknown_adapter (PortableServer::POA_ptr parent,
- const char *name,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // Default policies
- CORBA::PolicyList default_policies;
-
- // This assumes that the lock on the parent is recursive
- PortableServer::POA_var child = parent->create_POA (name,
- this->poa_manager_.in (),
- default_policies,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- ACE_TRY
- {
- PortableServer::AdapterActivator_var activator = this->_this (ACE_TRY_ENV);
- ACE_TRY_CHECK;
-
- child->the_activator (activator.in (), ACE_TRY_ENV);
- ACE_TRY_CHECK;
- }
- ACE_CATCHANY
- {
- child->destroy (1,
- 1,
- ACE_TRY_ENV);
-
- return 0;
- }
- ACE_ENDTRY;
- ACE_CHECK_RETURN (0);
-
- // Finally everything is fine
- return 1;
-}
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
-template class ACE_Array<PortableServer::ObjectId>;
-template class ACE_Array_Base<PortableServer::ObjectId>;
-
-template class ACE_Auto_Basic_Ptr<TAO_Id_Assignment_Policy>;
-template class ACE_Auto_Basic_Ptr<TAO_Id_Uniqueness_Policy>;
-template class ACE_Auto_Basic_Ptr<TAO_Lifespan_Policy>;
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-template class ACE_Auto_Basic_Ptr<TAO_Thread_Policy>;
-template class ACE_Auto_Basic_Ptr<TAO_Implicit_Activation_Policy>;
-template class ACE_Auto_Basic_Ptr<TAO_Servant_Retention_Policy>;
-template class ACE_Auto_Basic_Ptr<TAO_Request_Processing_Policy>;
-
-template class ACE_Auto_Basic_Ptr<TAO_Forwarding_Servant>;
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-//template class ACE_Auto_Basic_Ptr<TAO_Active_Object_Map_Iterator_Impl>;
-template class ACE_Auto_Basic_Ptr<TAO_POA>;
-template class ACE_Auto_Basic_Ptr<TAO_Active_Object_Map>;
-template class ACE_Auto_Basic_Ptr<TAO_POA_Manager>;
-template class ACE_Lock_Adapter<ACE_Null_Mutex>;
-#if defined (ACE_HAS_THREADS)
-template class ACE_Lock_Adapter<ACE_Recursive_Thread_Mutex>;
-template class ACE_Lock_Adapter<ACE_Thread_Mutex>;
-#endif /* ACE_HAS_THREADS */
-template class ACE_Map_Entry<TAO_Unbounded_Sequence<unsigned char>, TAO_ServantBase *>;
-template class ACE_Hash_Map_Entry<ACE_CString, TAO_POA *>;
-template class ACE_Hash<ACE_CString>;
-template class ACE_Equal_To<ACE_CString>;
-template class ACE_Hash_Map_Manager<ACE_CString, TAO_POA *, ACE_Null_Mutex>;
-template class ACE_Hash_Map_Manager_Ex<ACE_CString, TAO_POA *, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
-template class ACE_Hash_Map_Iterator<ACE_CString, TAO_POA *, ACE_Null_Mutex>;
-template class ACE_Hash_Map_Iterator_Ex<ACE_CString, TAO_POA *, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
-template class ACE_Hash_Map_Reverse_Iterator<ACE_CString, TAO_POA *, ACE_Null_Mutex>;
-template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, TAO_POA *, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
-template class ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, TAO_POA *, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
-template class ACE_Write_Guard<ACE_Lock>;
-template class ACE_Read_Guard<ACE_Lock>;
-template class auto_ptr<TAO_Id_Assignment_Policy>;
-template class auto_ptr<TAO_Id_Uniqueness_Policy>;
-template class auto_ptr<TAO_Lifespan_Policy>;
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-template class auto_ptr<TAO_Thread_Policy>;
-template class auto_ptr<TAO_Implicit_Activation_Policy>;
-template class auto_ptr<TAO_Servant_Retention_Policy>;
-template class auto_ptr<TAO_Request_Processing_Policy>;
-
-template class auto_ptr<TAO_Forwarding_Servant>;
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-//template class auto_ptr<TAO_Active_Object_Map_Iterator_Impl>;
-template class auto_ptr<TAO_POA>;
-template class auto_ptr<TAO_Active_Object_Map>;
-template class auto_ptr<TAO_POA_Manager>;
-template class ACE_Node<TAO_POA *>;
-
-#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
-
-#pragma instantiate ACE_Array<PortableServer::ObjectId>
-#pragma instantiate ACE_Array_Base<PortableServer::ObjectId>
-
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Id_Assignment_Policy>
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Id_Uniqueness_Policy>
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Lifespan_Policy>
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Thread_Policy>
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Implicit_Activation_Policy>
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Servant_Retention_Policy>
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Request_Processing_Policy>
-
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Forwarding_Servant>
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-//#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Active_Object_Map_Iterator_Impl>
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_POA>
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Active_Object_Map>
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_POA_Manager>
-#pragma instantiate ACE_Lock_Adapter<ACE_Null_Mutex>
-#if defined (ACE_HAS_THREADS)
-#pragma instantiate ACE_Lock_Adapter<ACE_Recursive_Thread_Mutex>
-#pragma instantiate ACE_Lock_Adapter<ACE_Thread_Mutex>
-#endif /* ACE_HAS_THREADS */
-#pragma instantiate ACE_Map_Entry<TAO_Unbounded_Sequence<unsigned char>, TAO_ServantBase *>
-#pragma instantiate ACE_Hash_Map_Entry<ACE_CString, TAO_POA *>
-#pragma instantiate ACE_Hash<ACE_CString>
-#pragma instantiate ACE_Equal_To<ACE_CString>
-#pragma instantiate ACE_Hash_Map_Manager<ACE_CString, TAO_POA *, ACE_Null_Mutex>
-#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_CString, TAO_POA *, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
-#pragma instantiate ACE_Hash_Map_Iterator<ACE_CString, TAO_POA *, ACE_Null_Mutex>
-#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_CString, TAO_POA *, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
-#pragma instantiate ACE_Hash_Map_Reverse_Iterator<ACE_CString, TAO_POA *, ACE_Null_Mutex>
-#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, TAO_POA *, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
-#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, TAO_POA *, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
-#pragma instantiate ACE_Write_Guard<ACE_Lock>
-#pragma instantiate ACE_Read_Guard<ACE_Lock>
-#pragma instantiate auto_ptr<TAO_Id_Assignment_Policy>
-#pragma instantiate auto_ptr<TAO_Id_Uniqueness_Policy>
-#pragma instantiate auto_ptr<TAO_Lifespan_Policy>
-
-#if !defined (TAO_HAS_MINIMUM_CORBA)
-
-#pragma instantiate auto_ptr<TAO_Thread_Policy>
-#pragma instantiate auto_ptr<TAO_Implicit_Activation_Policy>
-#pragma instantiate auto_ptr<TAO_Servant_Retention_Policy>
-#pragma instantiate auto_ptr<TAO_Request_Processing_Policy>
-
-#pragma instantiate auto_ptr<TAO_Forwarding_Servant>
-
-#endif /* TAO_HAS_MINIMUM_CORBA */
-
-//#pragma instantiate auto_ptr<TAO_Active_Object_Map_Iterator_Impl>
-#pragma instantiate auto_ptr<TAO_POA>
-#pragma instantiate auto_ptr<TAO_Active_Object_Map>
-#pragma instantiate auto_ptr<TAO_POA_Manager>
-#pragma instantiate ACE_Node<TAO_POA *>
-#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */