summaryrefslogtreecommitdiff
path: root/TAO/tao/PortableServer/Object_Adapter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/PortableServer/Object_Adapter.cpp')
-rw-r--r--TAO/tao/PortableServer/Object_Adapter.cpp1704
1 files changed, 0 insertions, 1704 deletions
diff --git a/TAO/tao/PortableServer/Object_Adapter.cpp b/TAO/tao/PortableServer/Object_Adapter.cpp
deleted file mode 100644
index 91dfaa708d5..00000000000
--- a/TAO/tao/PortableServer/Object_Adapter.cpp
+++ /dev/null
@@ -1,1704 +0,0 @@
-// $Id$
-
-#include "Object_Adapter.h"
-#include "POA.h"
-#include "Collocated_Object.h"
-#include "tao/ORB.h"
-#include "tao/ORB_Core.h"
-#include "tao/Server_Request.h"
-#include "tao/Stub.h"
-#include "tao/Profile.h"
-#include "tao/MProfile.h"
-#include "ace/Auto_Ptr.h"
-
-#if !defined (__ACE_INLINE__)
-# include "Object_Adapter.i"
-#endif /* __ACE_INLINE__ */
-
-ACE_RCSID(tao, Object_Adapter, "$Id$")
-
-// Timeprobes class
-#include "tao/Timeprobe.h"
-
-#if defined (ACE_ENABLE_TIMEPROBES)
-
-static const char *TAO_Object_Adapter_Timeprobe_Description[] =
-{
- "Object_Adapter::dispatch_servant - start",
- "Object_Adapter::dispatch_servant - end",
-
- "POA::parse_key - start",
- "POA::parse_key - end",
-
- "Object_Adapter::find_poa - start",
- "Object_Adapter::find_poa - end",
-
- "POA::locate_servant - start",
- "POA::locate_servant - end",
-
- "Servant::_dispatch - start",
- "Servant::_dispatch - end",
-};
-
-enum
-{
- // Timeprobe description table start key
- TAO_OBJECT_ADAPTER_DISPATCH_SERVANT_START = 200,
- TAO_OBJECT_ADAPTER_DISPATCH_SERVANT_END,
-
- TAO_POA_PARSE_KEY_START,
- TAO_POA_PARSE_KEY_END,
-
- TAO_OBJECT_ADAPTER_FIND_POA_START,
- TAO_OBJECT_ADAPTER_FIND_POA_END,
-
- TAO_POA_LOCATE_SERVANT_START,
- TAO_POA_LOCATE_SERVANT_END,
-
- TAO_SERVANT_DISPATCH_START,
- TAO_SERVANT_DISPATCH_END
-};
-
-// Setup Timeprobes
-ACE_TIMEPROBE_EVENT_DESCRIPTIONS (TAO_Object_Adapter_Timeprobe_Description,
- TAO_OBJECT_ADAPTER_DISPATCH_SERVANT_START);
-
-#endif /* ACE_ENABLE_TIMEPROBES */
-
-/* static */
-size_t TAO_Object_Adapter::transient_poa_name_size_ = 0;
-
-void
-TAO_Object_Adapter::set_transient_poa_name_size (const TAO_Server_Strategy_Factory::Active_Object_Map_Creation_Parameters &creation_parameters)
-{
- if (TAO_Object_Adapter::transient_poa_name_size_ == 0)
- {
- switch (creation_parameters.poa_lookup_strategy_for_transient_id_policy_)
- {
-#if (TAO_HAS_MINIMUM_POA_MAPS == 0)
- case TAO_LINEAR:
- TAO_Object_Adapter::transient_poa_name_size_ =
- sizeof (CORBA::ULong);
- break;
- case TAO_DYNAMIC_HASH:
- TAO_Object_Adapter::transient_poa_name_size_ =
- sizeof (CORBA::ULong);
- break;
-#endif /* TAO_HAS_MINIMUM_POA_MAPS == 0 */
- case TAO_ACTIVE_DEMUX:
- default:
- TAO_Object_Adapter::transient_poa_name_size_ =
- ACE_Active_Map_Manager_Key::size ();
- break;
- }
- }
-}
-
-TAO_Object_Adapter::TAO_Object_Adapter (const TAO_Server_Strategy_Factory::Active_Object_Map_Creation_Parameters &creation_parameters,
- TAO_ORB_Core &orb_core)
- : hint_strategy_ (0),
- persistent_poa_name_map_ (0),
- transient_poa_map_ (0),
- orb_core_ (orb_core),
- enable_locking_ (orb_core_.server_factory ()->enable_poa_locking ()),
- thread_lock_ (),
- lock_ (TAO_Object_Adapter::create_lock (enable_locking_,
- thread_lock_)),
- reverse_lock_ (*lock_),
- non_servant_upcall_condition_ (thread_lock_),
- non_servant_upcall_in_progress_ (0),
- non_servant_upcall_thread_ (ACE_OS::NULL_thread)
- , root_ (0)
-{
- TAO_Object_Adapter::set_transient_poa_name_size (creation_parameters);
-
- Hint_Strategy *hint_strategy = 0;
- if (creation_parameters.use_active_hint_in_poa_names_)
- ACE_NEW (hint_strategy,
- Active_Hint_Strategy (creation_parameters.poa_map_size_));
- else
- ACE_NEW (hint_strategy,
- No_Hint_Strategy);
-
- // Give ownership to the auto pointer.
- auto_ptr<Hint_Strategy> new_hint_strategy (hint_strategy);
-
- new_hint_strategy->object_adapter (this);
-
- persistent_poa_name_map *ppnm;
- switch (creation_parameters.poa_lookup_strategy_for_persistent_id_policy_)
- {
- case TAO_LINEAR:
-#if (TAO_HAS_MINIMUM_POA_MAPS == 0)
- ACE_NEW (ppnm,
- persistent_poa_name_linear_map (creation_parameters.poa_map_size_));
-
- break;
-#else
- ACE_ERROR ((LM_ERROR,
- "linear option for -ORBPersistentidPolicyDemuxStrategy "
- "not supported with minimum POA maps. "
- "Ingoring option to use default... \n"));
- /* FALL THROUGH */
-#endif /* TAO_HAS_MINIMUM_POA_MAPS == 0 */
- case TAO_DYNAMIC_HASH:
- default:
- ACE_NEW (ppnm,
- persistent_poa_name_hash_map (creation_parameters.poa_map_size_));
- break;
- }
- // Give ownership to the auto pointer.
- auto_ptr<persistent_poa_name_map> new_persistent_poa_name_map (ppnm);
-
- transient_poa_map *tpm = 0;
- switch (creation_parameters.poa_lookup_strategy_for_transient_id_policy_)
- {
-#if (TAO_HAS_MINIMUM_POA_MAPS == 0)
- case TAO_LINEAR:
- ACE_NEW (tpm,
- transient_poa_linear_map (creation_parameters.poa_map_size_));
- break;
- case TAO_DYNAMIC_HASH:
- ACE_NEW (tpm,
- transient_poa_hash_map (creation_parameters.poa_map_size_));
- break;
-#else
- case TAO_LINEAR:
- case TAO_DYNAMIC_HASH:
- ACE_ERROR ((LM_ERROR,
- "linear and dynamic options for -ORBTransientidPolicyDemuxStrategy "
- "are not supported with minimum POA maps. "
- "Ingoring option to use default... \n"));
- /* FALL THROUGH */
-#endif /* TAO_HAS_MINIMUM_POA_MAPS == 0 */
- case TAO_ACTIVE_DEMUX:
- default:
- ACE_NEW (tpm,
- transient_poa_active_map (creation_parameters.poa_map_size_));
- break;
- }
- // Give ownership to the auto pointer.
- auto_ptr<transient_poa_map> new_transient_poa_map (tpm);
-
- this->hint_strategy_ =
- new_hint_strategy.release ();
- this->persistent_poa_name_map_ =
- new_persistent_poa_name_map.release ();
- this->transient_poa_map_ =
- new_transient_poa_map.release ();
-}
-
-TAO_Object_Adapter::~TAO_Object_Adapter (void)
-{
- delete this->hint_strategy_;
- delete this->persistent_poa_name_map_;
- delete this->transient_poa_map_;
- delete this->lock_;
-}
-
-/* static */
-ACE_Lock *
-TAO_Object_Adapter::create_lock (int enable_locking,
- ACE_SYNCH_MUTEX &thread_lock)
-{
-#if defined (ACE_HAS_THREADS)
- if (enable_locking)
- {
- ACE_Lock *the_lock;
- ACE_NEW_RETURN (the_lock,
- ACE_Lock_Adapter<ACE_SYNCH_MUTEX> (thread_lock),
- 0);
- return the_lock;
- }
-#else
- ACE_UNUSED_ARG (enable_locking);
- ACE_UNUSED_ARG (thread_lock);
-#endif /* ACE_HAS_THREADS */
-
- ACE_Lock *the_lock;
- ACE_NEW_RETURN (the_lock,
- ACE_Lock_Adapter<ACE_SYNCH_NULL_MUTEX> (),
- 0);
- return the_lock;
-}
-
-void
-TAO_Object_Adapter::dispatch_servant (const TAO_ObjectKey &key,
- CORBA::ServerRequest &req,
- void *context,
- CORBA::Environment &ACE_TRY_ENV)
-{
- ACE_FUNCTION_TIMEPROBE (TAO_OBJECT_ADAPTER_DISPATCH_SERVANT_START);
-
- // This object is magical, i.e., it has a non-trivial constructor
- // and destructor.
- Servant_Upcall servant_upcall (&this->orb_core_);
-
- // Set up state in the POA et al (including the POA Current), so
- // that we know that this servant is currently in an upcall.
- const char *operation = req.operation ();
- servant_upcall.prepare_for_upcall (key,
- operation,
- ACE_TRY_ENV);
- ACE_CHECK;
-
-#if (TAO_HAS_RT_CORBA == 1)
-
- // RTCORBA PriorityModelPolicy processing (may need to be
- // moved/adjusted when POA threadpools are added).
- // This is the earliest place we can do the processing, since only
- // at this point we know the target POA.
-
- Priority_Model_Processing priority_processing (servant_upcall.poa ());
-
- // Set thread's priority.
- priority_processing.pre_invoke (req.service_info (), ACE_TRY_ENV);
- ACE_CHECK;
-
-#endif /* TAO_HAS_RT_CORBA == 1 */
-
- // Servant dispatch.
- {
- ACE_FUNCTION_TIMEPROBE (TAO_SERVANT_DISPATCH_START);
-
- servant_upcall.servant ()->_dispatch (req,
- context,
- ACE_TRY_ENV);
- ACE_CHECK;
- }
-
-#if (TAO_HAS_RT_CORBA == 1)
-
- // Reset thread's priority to its original value. If this method
- // isn't reached, i.e., because of an exception, the reset takes
- // place in Priority_Model_Processing destructor.
- priority_processing.post_invoke (ACE_TRY_ENV);
- ACE_CHECK;
-
-#endif /* TAO_HAS_RT_CORBA == 1 */
-}
-
-void
-TAO_Object_Adapter::locate_poa (const TAO_ObjectKey &key,
- PortableServer::ObjectId &system_id,
- TAO_POA *&poa,
- CORBA_Environment &ACE_TRY_ENV)
-{
- 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 = 0;
-
- {
- ACE_FUNCTION_TIMEPROBE (TAO_POA_PARSE_KEY_START);
-
- result = TAO_POA::parse_key (key,
- poa_system_name,
- system_id,
- is_root,
- is_persistent,
- is_system_id,
- poa_creation_time);
- }
-
- if (result != 0)
- ACE_THROW (CORBA::OBJ_ADAPTER ());
-
- {
- ACE_FUNCTION_TIMEPROBE (TAO_OBJECT_ADAPTER_FIND_POA_START);
-
- result = this->find_poa (poa_system_name,
- is_persistent,
- is_root,
- poa_creation_time,
- poa,
- ACE_TRY_ENV);
- ACE_CHECK;
- }
-
- if (result != 0)
- ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
-}
-
-int
-TAO_Object_Adapter::activate_poa (const poa_name &folded_name,
- TAO_POA *&poa,
- CORBA_Environment &ACE_TRY_ENV)
-{
- int result = -1;
-
-#if (TAO_HAS_MINIMUM_POA == 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 adapter
- // activator(s) 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.
- Non_Servant_Upcall non_servant_upcall (*this);
- ACE_UNUSED_ARG (non_servant_upcall);
-
- iteratable_poa_name ipn (folded_name);
- iteratable_poa_name::iterator iterator = ipn.begin ();
- iteratable_poa_name::iterator end = ipn.end ();
-
- TAO_POA *parent = this->root_;
- // @@ PPOA: this->orb_core_.root_poa (ACE_TRY_ENV);
- // @@ PPOA: ACE_CHECK_RETURN (-1);
-
- if (parent->name () != *iterator)
- ACE_THROW_RETURN (CORBA::OBJ_ADAPTER (),
- -1);
- else
- ++iterator;
-
- for (;
- iterator != end;
- ++iterator)
- {
- TAO_POA *current = 0;
-
- ACE_TRY
- {
- current = parent->find_POA_i (*iterator,
- 1,
- ACE_TRY_ENV);
- ACE_TRY_CHECK;
- }
- ACE_CATCH (PortableServer::POA::AdapterNonExistent, ex)
- {
- return -1;
- }
- ACE_ENDTRY;
- ACE_CHECK_RETURN (-1);
-
- parent = current;
- }
-
- poa = parent;
- result = 0;
-#else
- ACE_UNUSED_ARG (folded_name);
- ACE_UNUSED_ARG (poa);
- ACE_UNUSED_ARG (ACE_TRY_ENV);
-#endif /* TAO_HAS_MINIMUM_POA == 0 */
-
- return result;
-}
-
-int
-TAO_Object_Adapter::find_transient_poa (const poa_name &system_name,
- CORBA::Boolean root,
- const TAO_Temporary_Creation_Time &poa_creation_time,
- TAO_POA *&poa,
- CORBA::Environment &)
-{
- int result = 0;
-
- if (root)
- {
- poa = this->root_;
- // @@ PPOA: this->orb_core_.root_poa (ACE_TRY_ENV);
- // @@ PPOA: ACE_CHECK_RETURN (-1);
- }
- else
- {
- result = this->transient_poa_map_->find (system_name,
- poa);
- }
-
- if (result == 0 && poa->creation_time () != poa_creation_time)
- result = -1;
-
- return result;
-}
-
-int
-TAO_Object_Adapter::bind_poa (const poa_name &folded_name,
- TAO_POA *poa,
- poa_name_out system_name)
-{
- if (poa->persistent ())
- return this->bind_persistent_poa (folded_name,
- poa,
- system_name);
- else
- return this->bind_transient_poa (poa,
- system_name);
-}
-
-int
-TAO_Object_Adapter::unbind_poa (TAO_POA *poa,
- const poa_name &folded_name,
- const poa_name &system_name)
-{
- if (poa->persistent ())
- return this->unbind_persistent_poa (folded_name,
- system_name);
- else
- return this->unbind_transient_poa (system_name);
-}
-
-int
-TAO_Object_Adapter::locate_servant_i (const TAO_ObjectKey &key,
- CORBA::Environment &ACE_TRY_ENV)
-{
- PortableServer::ObjectId id;
- TAO_POA *poa = 0;
-
- this->locate_poa (key,
- id,
- poa,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (-1);
-
- PortableServer::Servant servant = 0;
- TAO_SERVANT_LOCATION servant_location =
- poa->locate_servant_i (id,
- servant,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (-1);
-
- switch (servant_location)
- {
- case TAO_SERVANT_FOUND:
- // Optimistic attitude
- case TAO_DEFAULT_SERVANT:
- case TAO_SERVANT_MANAGER:
- return 0;
-
- case TAO_SERVANT_NOT_FOUND:
- return -1;
- }
-
- return -1;
-}
-
-TAO_SERVANT_LOCATION
-TAO_Object_Adapter::find_servant_i (const TAO_ObjectKey &key,
- PortableServer::Servant &servant,
- CORBA::Environment &ACE_TRY_ENV)
-{
- PortableServer::ObjectId id;
- TAO_POA *poa = 0;
-
- this->locate_poa (key,
- id,
- poa,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (TAO_SERVANT_NOT_FOUND);
-
- TAO_SERVANT_LOCATION servant_location = poa->locate_servant_i (id,
- servant,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (TAO_SERVANT_NOT_FOUND);
-
- return servant_location;
-}
-
-void
-TAO_Object_Adapter::open (CORBA::Environment &ACE_TRY_ENV)
-{
- // Only set the auto_ptr if poa_manager is allocated here.
- auto_ptr<TAO_POA_Manager> safe_poa_manager;
-
- TAO_POA_Manager *poa_manager;
- ACE_NEW_THROW_EX (poa_manager,
- TAO_POA_Manager (*this),
- CORBA::NO_MEMORY ());
- ACE_CHECK;
-
- ACE_AUTO_PTR_RESET (safe_poa_manager,
- poa_manager,
- TAO_POA_Manager);
-
-#if 0
- TAO_POA_Policies root_poa_policies (this->orb_core_,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- if (policies == 0)
- {
- // RootPOA policies defined in spec
- root_poa_policies.implicit_activation (
- PortableServer::IMPLICIT_ACTIVATION);
-
- policies = &root_poa_policies;
- }
-#else
- TAO_POA_Policies policies (this->orb_core_,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- policies.implicit_activation (PortableServer::IMPLICIT_ACTIVATION);
-#endif /* 0 */
-
- // Construct a new POA
- ACE_NEW_THROW_EX (this->root_,
- TAO_POA (TAO_DEFAULT_ROOTPOA_NAME,
- *poa_manager,
- policies,
- 0,
- this->lock (),
- this->thread_lock (),
- this->orb_core_,
- this,
- ACE_TRY_ENV),
- CORBA::NO_MEMORY ());
- ACE_CHECK;
-
- // The Object_Adapter will keep a reference to the Root POA so that
- // on its destruction, it can check whether the Root POA has
- // been destroyed yet or not.
- this->root_->_add_ref ();
-
- // Release the auto_ptr since we got here without error, the TAO_POA
- // object takes ownership of the POA_Manager object (actually it
- // shares the ownership with its peers).
-
- (void) safe_poa_manager.release ();
-}
-
-void
-TAO_Object_Adapter::close (int wait_for_completion,
- CORBA::Environment &ACE_TRY_ENV)
-{
- this->check_close (wait_for_completion, ACE_TRY_ENV);
- ACE_CHECK;
-
- // Shutting down the ORB causes all object adapters to be destroyed,
- // since they cannot exist in the absence of an ORB. Shut down is
- // complete when all ORB processing (including request processing
- // and object deactivation or other operations associated with
- // object adapters) has completed and the object adapters have been
- // destroyed. In the case of the POA, this means that all object
- // etherealizations have finished and root POA has been destroyed
- // (implying that all descendent POAs have also been destroyed).
- if (this->root_ != 0)
- {
- CORBA::Boolean etherealize_objects = 1;
- this->root_->destroy (etherealize_objects,
- wait_for_completion,
- ACE_TRY_ENV);
- ACE_CHECK;
- CORBA::release (this->root_);
- this->root_ = 0;
- }
-}
-
-void
-TAO_Object_Adapter::check_close (int wait_for_completion,
- CORBA::Environment &ACE_TRY_ENV)
-{
- TAO_POA::check_for_valid_wait_for_completions (this->orb_core (),
- wait_for_completion,
- ACE_TRY_ENV);
- ACE_CHECK;
-}
-
-int
-TAO_Object_Adapter::priority (void) const
-{
- return 0;
-}
-
-int
-TAO_Object_Adapter::dispatch (TAO_ObjectKey &key,
- CORBA::ServerRequest &request,
- void *context,
- CORBA::Object_out forward_to,
- CORBA::Environment &ACE_TRY_ENV)
- ACE_THROW_SPEC ((CORBA::SystemException))
-{
- if (ACE_OS::memcmp (key.get_buffer (),
- &TAO_POA::objectkey_prefix[0],
- TAO_POA::TAO_OBJECTKEY_PREFIX_SIZE) != 0)
- {
- return TAO_Adapter::DS_MISMATCHED_KEY;
- }
-
- ACE_TRY
- {
- this->dispatch_servant (key,
- request,
- context,
- ACE_TRY_ENV);
- ACE_TRY_CHECK;
- }
-#if (TAO_HAS_MINIMUM_CORBA == 0)
- ACE_CATCH (PortableServer::ForwardRequest, forward_request)
- {
- forward_to =
- CORBA::Object::_duplicate (forward_request.forward_reference.in ());
- return TAO_Adapter::DS_FORWARD;
- }
-#else
- ACE_CATCHANY
- {
- ACE_UNUSED_ARG (forward_to);
- ACE_RE_THROW;
- }
-#endif /* TAO_HAS_MINIMUM_CORBA */
- ACE_ENDTRY;
-
- return TAO_Adapter::DS_OK;
-}
-
-const char *
-TAO_Object_Adapter::name (void) const
-{
- return TAO_OBJID_ROOTPOA;
-}
-
-CORBA::Object_ptr
-TAO_Object_Adapter::root (void)
-{
- return CORBA::Object::_duplicate (this->root_);
-}
-
-CORBA::Object_ptr
-TAO_Object_Adapter::create_collocated_object (TAO_Stub *stub,
- const TAO_MProfile &mp)
-{
- for (TAO_PHandle j = 0;
- j != mp.profile_count ();
- ++j)
- {
- const TAO_Profile *profile = mp.get_profile (j);
- TAO_ObjectKey_var objkey = profile->_key ();
-
- if (ACE_OS::memcmp (objkey->get_buffer (),
- &TAO_POA::objectkey_prefix[0],
- TAO_POA::TAO_OBJECTKEY_PREFIX_SIZE) != 0)
- continue;
-
- ACE_DECLARE_NEW_CORBA_ENV;
- ACE_TRY
- {
- TAO_ServantBase *servant = 0;
-
- TAO_SERVANT_LOCATION servant_location =
- this->find_servant (objkey.in (),
- servant,
- ACE_TRY_ENV);
- ACE_TRY_CHECK;
-
- if (servant_location != TAO_SERVANT_NOT_FOUND)
- {
- // Found collocated object. Perhaps we can get around
- // by simply setting the servant_orb, but let get this
- // to work first.
-
- // There could only be one ORB which is us.
-
- // @@ Do not duplicate the ORB here!
- // TAO_Stub::servant_orb() duplicates it.
- // -Ossama
- stub->servant_orb (this->orb_core_.orb ());
-
- CORBA::Object_ptr x;
- ACE_NEW_RETURN (x,
- TAO_Collocated_Object (stub, 1,
- servant),
- 0);
- return x;
- }
- }
- ACE_CATCHANY
- {
- // Ignore the exception and continue with the next one.
- }
- ACE_ENDTRY;
- }
-
- return 0;
-}
-
-// ****************************************************************
-
-TAO_Object_Adapter_Factory::TAO_Object_Adapter_Factory (void)
-{
-}
-
-TAO_Adapter*
-TAO_Object_Adapter_Factory::create (TAO_ORB_Core *orb_core)
-{
- // Setup the POA_Current object in the ORB
- CORBA::Object_var current = new TAO_POA_Current;
- orb_core->poa_current (current.in ());
-
- return new TAO_Object_Adapter (orb_core->server_factory ()->
- active_object_map_creation_parameters (),
- *orb_core);
-}
-
-ACE_FACTORY_DEFINE (TAO_PortableServer, TAO_Object_Adapter_Factory)
-ACE_STATIC_SVC_DEFINE (TAO_Object_Adapter_Factory,
- ACE_TEXT ("TAO_POA"),
- ACE_SVC_OBJ_T,
- &ACE_SVC_NAME (TAO_Object_Adapter_Factory),
- ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
- 0)
-
-// ****************************************************************
-
-TAO_Object_Adapter::Hint_Strategy::~Hint_Strategy (void)
-{
-}
-
-void
-TAO_Object_Adapter::Hint_Strategy::object_adapter (TAO_Object_Adapter *oa)
-{
- this->object_adapter_ = oa;
-}
-
-TAO_Object_Adapter::Active_Hint_Strategy::Active_Hint_Strategy (CORBA::ULong map_size)
- : persistent_poa_system_map_ (map_size)
-{
-}
-
-TAO_Object_Adapter::Active_Hint_Strategy::~Active_Hint_Strategy (void)
-{
-}
-
-int
-TAO_Object_Adapter::Active_Hint_Strategy::find_persistent_poa (const poa_name &system_name,
- TAO_POA *&poa,
- CORBA_Environment &ACE_TRY_ENV)
-{
- poa_name folded_name;
- int result = this->persistent_poa_system_map_.recover_key (system_name,
- folded_name);
-
- if (result == 0)
- {
- result = this->persistent_poa_system_map_.find (system_name,
- poa);
- if (result != 0
- || folded_name != poa->folded_name ())
- {
- result = this->object_adapter_->persistent_poa_name_map_->find (folded_name,
- poa);
- if (result != 0)
- {
- result = this->object_adapter_->activate_poa (folded_name,
- poa,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (-1);
- }
- }
- }
-
- return result;
-}
-
-int
-TAO_Object_Adapter::Active_Hint_Strategy::bind_persistent_poa (const poa_name &folded_name,
- TAO_POA *poa,
- poa_name_out system_name)
-{
- poa_name name = folded_name;
- int result = this->persistent_poa_system_map_.bind_modify_key (poa,
- name);
-
- if (result == 0)
- {
- result =
- this->object_adapter_->persistent_poa_name_map_->bind (folded_name,
- poa);
-
- if (result != 0)
- this->persistent_poa_system_map_.unbind (name);
- else
- ACE_NEW_RETURN (system_name,
- poa_name (name),
- -1);
- }
-
- return result;
-}
-
-int
-TAO_Object_Adapter::Active_Hint_Strategy::unbind_persistent_poa (const poa_name &folded_name,
- const poa_name &system_name)
-{
- int result = this->persistent_poa_system_map_.unbind (system_name);
-
- if (result == 0)
- result =
- this->object_adapter_->persistent_poa_name_map_->unbind (folded_name);
-
- return result;
-}
-
-TAO_Object_Adapter::No_Hint_Strategy::~No_Hint_Strategy (void)
-{
-}
-
-int
-TAO_Object_Adapter::No_Hint_Strategy::find_persistent_poa (const poa_name &system_name,
- TAO_POA *&poa,
- CORBA_Environment &ACE_TRY_ENV)
-{
- int result = this->object_adapter_->persistent_poa_name_map_->find (system_name,
- poa);
- if (result != 0)
- {
- result =
- this->object_adapter_->activate_poa (system_name,
- poa,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (-1);
- }
-
- return result;
-}
-
-int
-TAO_Object_Adapter::No_Hint_Strategy::bind_persistent_poa (const poa_name &folded_name,
- TAO_POA *poa,
- poa_name_out system_name)
-{
- int result =
- this->object_adapter_->persistent_poa_name_map_->bind (folded_name,
- poa);
- if (result == 0)
- ACE_NEW_RETURN (system_name,
- poa_name (folded_name),
- -1);
- return result;
-}
-
-int
-TAO_Object_Adapter::No_Hint_Strategy::unbind_persistent_poa (const poa_name &folded_name,
- const poa_name &system_name)
-{
- ACE_UNUSED_ARG (system_name);
-
- return this->object_adapter_->persistent_poa_name_map_->unbind (folded_name);
-}
-
-TAO_Object_Adapter::poa_name_iterator::poa_name_iterator (int begin,
- CORBA::ULong size,
- const CORBA::Octet *folded_buffer)
- : size_ (size),
- folded_buffer_ (folded_buffer),
- last_separator_ ((CORBA::ULong) ~0)
-{
- if (begin)
- {
- this->position_ = (CORBA::ULong) ~0;
- this->operator++ ();
- }
- else
- this->position_ = this->size_;
-}
-
-int
-TAO_Object_Adapter::poa_name_iterator::operator== (const poa_name_iterator &rhs) const
-{
- return this->position_ == rhs.position_;
-}
-
-int
-TAO_Object_Adapter::poa_name_iterator::operator!= (const poa_name_iterator &rhs) const
-{
- return !this->operator== (rhs);
-}
-
-ACE_CString
-TAO_Object_Adapter::poa_name_iterator::operator* () const
-{
- CORBA::ULong start_at =
- this->last_separator_ +
- TAO_POA::name_separator_length ();
-
- CORBA::ULong how_many =
- this->position_
- - this->last_separator_
- - TAO_POA::name_separator_length ();
-
- return ACE_CString (ACE_reinterpret_cast (const char *,
- &this->folded_buffer_[start_at]),
- how_many);
-}
-
-TAO_Object_Adapter::poa_name_iterator &
-TAO_Object_Adapter::poa_name_iterator::operator++ (void)
-{
- for (this->last_separator_ = this->position_;
- ;
- )
- {
- ++this->position_;
- if (this->position_ < this->size_)
- {
- if (this->folded_buffer_[this->position_] == TAO_POA::name_separator ())
- break;
- }
- else
- break;
- }
-
- return *this;
-}
-
-TAO_Object_Adapter::iteratable_poa_name::iteratable_poa_name (const poa_name &folded_name)
- : folded_name_ (folded_name)
-{
-}
-
-TAO_Object_Adapter::iteratable_poa_name::iterator
-TAO_Object_Adapter::iteratable_poa_name::begin (void) const
-{
- return iterator (1,
- this->folded_name_.length (),
- this->folded_name_.get_buffer ());
-}
-
-TAO_Object_Adapter::iteratable_poa_name::iterator
-TAO_Object_Adapter::iteratable_poa_name::end (void) const
-{
- return iterator (0,
- this->folded_name_.length (),
- this->folded_name_.get_buffer ());
-}
-
-TAO_Object_Adapter::Non_Servant_Upcall::Non_Servant_Upcall (TAO_Object_Adapter &object_adapter)
- : object_adapter_ (object_adapter)
-{
- // Mark the fact that a non-servant upcall is in progress.
- this->object_adapter_.non_servant_upcall_in_progress_ = 1;
-
- // Remember which thread is calling the adapter activators.
- this->object_adapter_.non_servant_upcall_thread_ = ACE_OS::thr_self ();
-
- // Release the Object Adapter lock.
- this->object_adapter_.lock ().release ();
-}
-
-TAO_Object_Adapter::Non_Servant_Upcall::~Non_Servant_Upcall (void)
-{
- // Reacquire the Object Adapter lock.
- this->object_adapter_.lock ().acquire ();
-
- // We are no longer in a non-servant upcall.
- this->object_adapter_.non_servant_upcall_in_progress_ = 0;
-
- // Reset thread id.
- this->object_adapter_.non_servant_upcall_thread_ =
- ACE_OS::NULL_thread;
-
- // If locking is enabled.
- if (this->object_adapter_.enable_locking_)
- // Wakeup all waiting threads.
- this->object_adapter_.non_servant_upcall_condition_.broadcast ();
-}
-
-// @@ PPOA TAO_Object_Adapter::Servant_Upcall::Servant_Upcall (TAO_Object_Adapter &object_adapter)
-TAO_Object_Adapter::Servant_Upcall::Servant_Upcall (TAO_ORB_Core *oc)
- : object_adapter_ (0),
- poa_ (0),
- servant_ (0),
- state_ (INITIAL_STAGE),
- id_ (),
- current_context_ (),
-#if (TAO_HAS_MINIMUM_POA == 0)
- cookie_ (0),
- operation_ (0),
-#endif /* TAO_HAS_MINIMUM_POA == 0 */
- active_object_map_entry_ (0),
- using_servant_locator_ (0)
-{
- TAO_Adapter *adapter = oc->poa_adapter ();
- TAO_Object_Adapter *object_adapter =
- ACE_dynamic_cast(TAO_Object_Adapter *, adapter);
- this->object_adapter_ = object_adapter;
-}
-
-void
-TAO_Object_Adapter::Servant_Upcall::prepare_for_upcall (const TAO_ObjectKey &key,
- const char *operation,
- CORBA::Environment &ACE_TRY_ENV)
-{
- // Acquire the object adapter lock first.
- int result = this->object_adapter_->lock ().acquire ();
- if (result == -1)
- // Locking error.
- ACE_THROW (CORBA::OBJ_ADAPTER ());
-
- // We have acquired the object adapater lock. Record this for later
- // use.
- this->state_ = OBJECT_ADAPTER_LOCK_ACQUIRED;
-
- // Check if a non-servant upcall is in progress. If a non-servant
- // upcall is in progress, wait for it to complete. Unless of
- // course, the thread making the non-servant upcall is this thread.
- this->object_adapter_->wait_for_non_servant_upcalls_to_complete (ACE_TRY_ENV);
- ACE_CHECK;
-
- // Locate the POA.
- this->object_adapter_->locate_poa (key,
- this->id_,
- this->poa_,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- // Check the state of the POA Manager.
- this->poa_->check_poa_manager_state (ACE_TRY_ENV);
- ACE_CHECK;
-
- // Setup current for this request.
- this->current_context_.setup (this->poa_,
- key);
-
- // We have setup the POA Current. Record this for later use.
- this->state_ = POA_CURRENT_SETUP;
-
- {
- ACE_FUNCTION_TIMEPROBE (TAO_POA_LOCATE_SERVANT_START);
-
- // Lookup the servant.
- this->servant_ = this->poa_->locate_servant_i (operation,
- this->id_,
- *this,
- this->current_context_,
- ACE_TRY_ENV);
- ACE_CHECK;
- }
-
- // Now that we know the servant.
- this->current_context_.servant (this->servant_);
-
- if (this->active_object_map_entry ())
- this->current_context_.priority (this->active_object_map_entry ()->priority_);
-
- // Increase <poa->outstanding_requests_> for the duration of the
- // upcall.
- //
- // Note that the object adapter lock is released after
- // <POA::outstanding_requests_> is increased.
- this->poa_->increment_outstanding_requests ();
-
- // Release the object adapter lock.
- this->object_adapter_->lock ().release ();
-
- // We have release the object adapater lock. Record this for later
- // use.
- this->state_ = OBJECT_ADAPTER_LOCK_RELEASED;
-
- // Lock servant (if appropriate).
- this->single_threaded_poa_setup (ACE_TRY_ENV);
- ACE_CHECK;
-
- // We have acquired the servant lock. Record this for later use.
- this->state_ = SERVANT_LOCK_ACQUIRED;
-
- // After this point, <this->servant_> is ready for dispatching.
-}
-
-TAO_Object_Adapter::Servant_Upcall::~Servant_Upcall ()
-{
- switch (this->state_)
- {
- case SERVANT_LOCK_ACQUIRED:
- // Unlock servant (if appropriate).
- this->single_threaded_poa_cleanup ();
- /* FALLTHRU */
-
- case OBJECT_ADAPTER_LOCK_RELEASED:
- // Cleanup servant locator related state. Note that because
- // this operation does not change any Object Adapter related
- // state, it is ok to call it outside the lock.
- this->servant_locator_cleanup ();
-
- // Since the object adapter lock was released, we must acquire
- // it.
- //
- // Note that errors are ignored here since we cannot do much
- // with it.
- this->object_adapter_->lock ().acquire ();
-
- // Cleanup servant related state.
- this->servant_cleanup ();
-
- // Cleanup POA related state.
- this->poa_cleanup ();
- /* FALLTHRU */
-
- case POA_CURRENT_SETUP:
- // Teardown current for this request.
- this->current_context_.teardown ();
- /* FALLTHRU */
-
- case OBJECT_ADAPTER_LOCK_ACQUIRED:
- // Finally, since the object adapter lock was acquired, we must
- // release it.
- this->object_adapter_->lock ().release ();
-
- /* FALLTHRU */
- case INITIAL_STAGE:
- default:
- // @@ Keep compiler happy, the states above are the only
- // possible ones.
- break;
- }
-}
-
-void
-TAO_Object_Adapter::wait_for_non_servant_upcalls_to_complete (CORBA::Environment &ACE_TRY_ENV)
-{
- // Check if a non-servant upcall is in progress. If a non-servant
- // upcall is in progress, wait for it to complete. Unless of
- // course, the thread making the non-servant upcall is this thread.
- while (this->enable_locking_ &&
- this->non_servant_upcall_in_progress_ &&
- ! ACE_OS::thr_equal (this->non_servant_upcall_thread_,
- ACE_OS::thr_self ()))
- {
- // If so wait...
- int result =
- this->non_servant_upcall_condition_.wait ();
- if (result == -1)
- ACE_THROW (CORBA::OBJ_ADAPTER ());
- }
-}
-
-void
-TAO_Object_Adapter::Servant_Upcall::servant_locator_cleanup (void)
-{
-#if (TAO_HAS_MINIMUM_POA == 0)
-
- if (this->using_servant_locator_)
- {
- // 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
- // post_invoke() call since that might end up deleting the
- // servant.
- //
- this->poa_->teardown_servant_lock (this->servant_);
-
- ACE_DECLARE_NEW_CORBA_ENV;
- ACE_TRY
- {
- this->poa_->servant_locator_->postinvoke (this->current_context_.object_id (),
- this->poa_,
- this->operation_,
- this->cookie_,
- this->servant_
- TAO_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
- }
- ACE_CATCHANY
- {
- // Ignore errors from servant locator ....
- }
- ACE_ENDTRY;
- }
-
-#endif /* TAO_HAS_MINIMUM_POA == 0 */
-}
-
-void
-TAO_Object_Adapter::Servant_Upcall::single_threaded_poa_setup (CORBA::Environment &ACE_TRY_ENV)
-{
-#if (TAO_HAS_MINIMUM_POA == 0)
-
- // Lock servant (if necessary).
- //
- // Note that this lock must be acquired *after* the object adapter
- // lock has been released. This is necessary since we cannot block
- // waiting for the servant lock while holding the object adapter
- // lock. Otherwise, the thread that wants to release this lock will
- // not be able to do so since it can't acquire the object adapterx
- // lock.
- if (this->poa_->policies ().thread () == PortableServer::SINGLE_THREAD_MODEL)
- {
- int result = this->servant_->_single_threaded_poa_lock ().acquire ();
-
- if (result == -1)
- // Locking error.
- ACE_THROW (CORBA::OBJ_ADAPTER ());
- }
-#else
- ACE_UNUSED_ARG (ACE_TRY_ENV);
-#endif /* !TAO_HAS_MINIMUM_POA == 0 */
-}
-
-void
-TAO_Object_Adapter::Servant_Upcall::single_threaded_poa_cleanup (void)
-{
- // Since the servant lock was acquired, we must release it.
-#if (TAO_HAS_MINIMUM_POA == 0)
- if (this->poa_->policies ().thread () == PortableServer::SINGLE_THREAD_MODEL)
- this->servant_->_single_threaded_poa_lock ().release ();
-#endif /* TAO_HAS_MINIMUM_POA == 0 */
-}
-
-void
-TAO_Object_Adapter::Servant_Upcall::servant_cleanup (void)
-{
- // Cleanup servant related stuff.
- if (this->active_object_map_entry_ != 0)
- {
- // Decrement the reference count.
- CORBA::UShort new_count = --this->active_object_map_entry_->reference_count_;
-
- if (new_count == 0)
- {
- ACE_DECLARE_NEW_CORBA_ENV;
- ACE_TRY
- {
- this->poa_->cleanup_servant (this->active_object_map_entry_,
- ACE_TRY_ENV);
-
- ACE_TRY_CHECK;
- }
- ACE_CATCHANY
- {
- // Ignore errors from servant cleanup ....
- }
- ACE_ENDTRY;
-
- if (this->poa_->waiting_servant_deactivation_ > 0 &&
- this->object_adapter_->enable_locking_)
- {
- // Wakeup all waiting threads.
- this->poa_->servant_deactivation_condition_.broadcast ();
- }
- }
- }
-}
-
-void
-TAO_Object_Adapter::Servant_Upcall::poa_cleanup (void)
-{
- // Decrease <poa->outstanding_requests_> now that the upcall
- // is complete.
- //
- // Note that the object adapter lock is acquired before
- // <POA::outstanding_requests_> is increased.
- CORBA::ULong outstanding_requests =
- this->poa_->decrement_outstanding_requests ();
-
- // Check if all pending requests are over.
- if (outstanding_requests == 0)
- {
- // If locking is enabled and some thread is waiting in POA::destroy.
- if (this->object_adapter_->enable_locking_ &&
- this->poa_->wait_for_completion_pending_)
- {
- // Wakeup all waiting threads.
- this->poa_->outstanding_requests_condition_.broadcast ();
- }
- if (this->poa_->waiting_destruction_)
- {
- ACE_TRY_NEW_ENV
- {
- this->poa_->complete_destruction_i (ACE_TRY_ENV);
- ACE_TRY_CHECK;
- }
- ACE_CATCHANY
- {
- // Ignore exceptions
- ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_POA::~complete_destruction_i");
- }
- ACE_ENDTRY;
-
- this->poa_ = 0;
- }
- }
-}
-
-#if (TAO_HAS_RT_CORBA == 1)
-
-TAO_Object_Adapter::Priority_Model_Processing::~Priority_Model_Processing
-(void)
-{
- if (this->state_ == PRIORITY_RESET_REQUIRED)
- {
- this->state_ = NO_ACTION_REQUIRED;
-
- // Reset the priority of the current thread back to its original
- // value.
- if (poa_.orb_core ().set_thread_priority (this->original_priority_)
- == -1)
- // At this point we cannot throw an exception. Just log the
- // error.
- ACE_DEBUG ((LM_ERROR,
- ACE_TEXT ("TAO (%P|%t) - Priority_Model_Processing:: ")
- ACE_TEXT (" Priority_Model_Processing\n")));
- }
-}
-
-void
-TAO_Object_Adapter::Priority_Model_Processing::pre_invoke (
- IOP::ServiceContextList &service_context_list,
- CORBA::Environment &ACE_TRY_ENV)
-{
- TAO_POA_Policies &poa_policies = this->poa_.policies ();
-
- // CLIENT_PROPAGATED PriorityModel processing.
- if (poa_policies.priority_model ()
- == TAO_POA_Policies::CLIENT_PROPAGATED
- && poa_policies.server_priority ()
- != TAO_INVALID_PRIORITY)
- {
- // Remember current thread's priority.
- if (poa_.orb_core ().get_thread_priority (this->original_priority_)
- == -1)
- ACE_THROW (CORBA::DATA_CONVERSION (1,
- CORBA::COMPLETED_NO));
-
- // Attempt to extract client-propagated priority from the
- // ServiceContextList of the request.
- RTCORBA::Priority target_priority;
- int priority_found = 0;
- for (CORBA::ULong i = 0;
- i < service_context_list.length () && !priority_found;
- ++i)
- {
- IOP::ServiceContext &context = service_context_list[i];
-
- if (context.context_id == IOP::RTCorbaPriority)
- {
- TAO_InputCDR cdr (ACE_reinterpret_cast
- (const char*,
- context.context_data.get_buffer ()),
- context.context_data.length ());
-
- CORBA::Boolean byte_order;
- if ((cdr >> ACE_InputCDR::to_boolean (byte_order)) == 0)
- ACE_THROW (CORBA::MARSHAL ());
- cdr.reset_byte_order (ACE_static_cast(int,byte_order));
-
- if ((cdr >> target_priority) == 0)
- ACE_THROW (CORBA::MARSHAL ());
-
- priority_found = 1;
- break;
- }
- }
-
- // Use default priority if none came in the request. (Request
- // must have come from a non-RT ORB.)
- if (!priority_found)
- target_priority = poa_policies.server_priority ();
-
- // Change the priority of the current thread to the
- // client-propagated value for the duration of
- // request.
- if (original_priority_ != target_priority)
- {
- if (poa_.orb_core ().set_thread_priority (target_priority) == -1)
- ACE_THROW (CORBA::DATA_CONVERSION (1, CORBA::COMPLETED_NO));
-
- this->state_ = PRIORITY_RESET_REQUIRED;
- }
- }
-}
-
-void
-TAO_Object_Adapter::Priority_Model_Processing::post_invoke (
- CORBA::Environment &ACE_TRY_ENV)
-{
- if (this->state_ == PRIORITY_RESET_REQUIRED)
- {
- this->state_ = NO_ACTION_REQUIRED;
-
- // Reset the priority of the current thread back to its original
- // value.
- if (poa_.orb_core ().set_thread_priority (this->original_priority_)
- == -1)
- ACE_THROW (CORBA::DATA_CONVERSION (1, CORBA::COMPLETED_NO));
- }
-}
-
-#endif /* TAO_HAS_RT_CORBA == 1 */
-
-TAO_POA_Current_Impl::TAO_POA_Current_Impl (void)
- : poa_ (0),
- object_id_ (),
- object_key_ (0),
- servant_ (0),
- priority_ (TAO_INVALID_PRIORITY),
- previous_current_impl_ (0),
- setup_done_ (0)
-{
-}
-
-void
-TAO_POA_Current_Impl::setup (TAO_POA *p,
- const TAO_ObjectKey &key)
-{
- // Remember information about this upcall.
- this->poa_ = p;
- this->object_key_ = &key;
-
- // Set the current context and remember the old one.
- this->tss_resources_ = TAO_TSS_RESOURCES::instance ();
-
- this->previous_current_impl_ =
- ACE_static_cast (TAO_POA_Current_Impl *,
- this->tss_resources_->poa_current_impl_);
- this->tss_resources_->poa_current_impl_ = this;
-
- // Setup is complete.
- this->setup_done_ = 1;
-}
-
-void
-TAO_POA_Current_Impl::teardown (void)
-{
- if (this->setup_done_)
- {
- // Reset the old context.
- this->tss_resources_->poa_current_impl_ = this->previous_current_impl_;
- }
-}
-
-PortableServer::POA_ptr
-TAO_POA_Current_Impl::get_POA (CORBA::Environment &)
- ACE_THROW_SPEC ((CORBA::SystemException,
- PortableServer::Current::NoContext))
-{
- return PortableServer::POA::_duplicate (this->poa_);
-}
-
-PortableServer::ObjectId *
-TAO_POA_Current_Impl::get_object_id (CORBA::Environment &)
- ACE_THROW_SPEC ((CORBA::SystemException,
- PortableServer::Current::NoContext))
-{
- PortableServer::ObjectId *objid = 0;
-
- // Create a new one and pass it back
- ACE_NEW_RETURN (objid,
- PortableServer::ObjectId (this->object_id_),
- 0);
- return objid;
-}
-
-TAO_ORB_Core &
-TAO_POA_Current_Impl::orb_core (void) const
-{
- return this->poa_->orb_core_;
-}
-
-PortableServer::POA_ptr
-TAO_POA_Current::get_POA (CORBA::Environment &ACE_TRY_ENV)
- ACE_THROW_SPEC ((CORBA::SystemException,
- PortableServer::Current::NoContext))
-{
- TAO_POA_Current_Impl *impl = this->implementation ();
-
- if (impl == 0)
- ACE_THROW_RETURN (PortableServer::Current::NoContext (),
- 0);
- return impl->get_POA (ACE_TRY_ENV);
-}
-
-PortableServer::ObjectId *
-TAO_POA_Current::get_object_id (CORBA::Environment &ACE_TRY_ENV)
- ACE_THROW_SPEC ((CORBA::SystemException,
- PortableServer::Current::NoContext))
-{
- TAO_POA_Current_Impl *impl = this->implementation ();
-
- if (impl == 0)
- ACE_THROW_RETURN (PortableServer::Current::NoContext (),
- 0);
- return impl->get_object_id (ACE_TRY_ENV);
-}
-
-TAO_POA_Current_Impl *
-TAO_POA_Current::implementation (void)
-{
- return ACE_static_cast (TAO_POA_Current_Impl *,
- TAO_TSS_RESOURCES::instance ()->poa_current_impl_);
-}
-
-TAO_POA_Current_Impl *
-TAO_POA_Current::implementation (TAO_POA_Current_Impl *new_current)
-{
- TAO_TSS_Resources *tss =
- TAO_TSS_RESOURCES::instance ();
-
- TAO_POA_Current_Impl *old =
- ACE_static_cast (TAO_POA_Current_Impl *,
- tss->poa_current_impl_);
- tss->poa_current_impl_ = new_current;
- return old;
-}
-
-#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
-
-// Common typedefs.
-typedef TAO_Object_Adapter::poa_name key;
-typedef TAO_POA *value;
-typedef ACE_Reverse_Lock<ACE_Lock> REVERSE_LOCK;
-
-typedef ACE_Pair<key, value> expanded_value;
-typedef ACE_Reference_Pair<const key, value> tao_value_type;
-typedef ACE_Equal_To<key> compare_keys;
-typedef TAO_ObjectId_Hash hash_key;
-typedef ACE_Noop_Key_Generator<key> noop_key_generator;
-
-template class ACE_Reverse_Lock<ACE_Lock>;
-template class ACE_Guard<REVERSE_LOCK>;
-
-template class auto_ptr<TAO_Object_Adapter::Hint_Strategy>;
-template class auto_ptr<TAO_Object_Adapter::transient_poa_map>;
-
-template class ACE_Auto_Basic_Ptr<TAO_Object_Adapter::Hint_Strategy>;
-template class ACE_Auto_Basic_Ptr<TAO_Object_Adapter::transient_poa_map>;
-
-template class ACE_Noop_Key_Generator<key>;
-
-// Common
-template class ACE_Reference_Pair<const key, value>;
-
-// Map and iterator classes.
-template class ACE_Map<key, value>;
-template class ACE_Iterator<tao_value_type>;
-template class ACE_Reverse_Iterator<tao_value_type>;
-
-// Iterator base classes.
-template class ACE_Iterator_Impl<tao_value_type>;
-template class ACE_Reverse_Iterator_Impl<tao_value_type>;
-
-// Active Map Manager related.
-template class ACE_Pair<key, value>;
-template class ACE_Active_Map_Manager_Adapter<key, value, TAO_Ignore_Original_Key_Adapter>;
-template class ACE_Active_Map_Manager_Adapter<key, value, TAO_Preserve_Original_Key_Adapter>;
-template class ACE_Active_Map_Manager_Iterator_Adapter<tao_value_type, expanded_value>;
-template class ACE_Active_Map_Manager_Reverse_Iterator_Adapter<tao_value_type, expanded_value>;
-template class ACE_Active_Map_Manager<expanded_value>;
-template class ACE_Map_Manager<ACE_Active_Map_Manager_Key, expanded_value, ACE_Null_Mutex>;
-template class ACE_Map_Iterator_Base<ACE_Active_Map_Manager_Key, expanded_value, ACE_Null_Mutex>;
-template class ACE_Map_Iterator<ACE_Active_Map_Manager_Key, expanded_value, ACE_Null_Mutex>;
-template class ACE_Map_Reverse_Iterator<ACE_Active_Map_Manager_Key, expanded_value, ACE_Null_Mutex>;
-template class ACE_Map_Entry<ACE_Active_Map_Manager_Key, expanded_value>;
-
-// Hash Map Manager related.
-#if (TAO_HAS_MINIMUM_POA_MAPS == 0)
-template class ACE_Hash_Map_Manager_Ex_Adapter<key, value, hash_key, compare_keys, TAO_Incremental_Key_Generator>;
-#endif /* TAO_HAS_MINIMUM_POA_MAPS == 0 */
-template class ACE_Hash_Map_Manager_Ex_Adapter<key, value, hash_key, compare_keys, noop_key_generator>;
-template class ACE_Hash_Map_Manager_Ex_Iterator_Adapter<tao_value_type, key, value, hash_key, compare_keys>;
-template class ACE_Hash_Map_Manager_Ex_Reverse_Iterator_Adapter<tao_value_type, key, value, hash_key, compare_keys>;
-template class ACE_Hash_Map_Manager_Ex<key, value, hash_key, compare_keys, ACE_Null_Mutex>;
-template class ACE_Hash_Map_Iterator_Base_Ex<key, value, hash_key, compare_keys, ACE_Null_Mutex>;
-template class ACE_Hash_Map_Iterator_Ex<key, value, hash_key, compare_keys, ACE_Null_Mutex>;
-template class ACE_Hash_Map_Reverse_Iterator_Ex<key, value, hash_key, compare_keys, ACE_Null_Mutex>;
-template class ACE_Hash_Map_Entry<key, value>;
-
-// Already in Active_Object_Map.cpp
-// template class ACE_Equal_To<key>;
-
-#if (TAO_HAS_MINIMUM_POA_MAPS == 0)
-// Map Manager related.
-template class ACE_Map_Manager_Iterator_Adapter<tao_value_type, key, value>;
-template class ACE_Map_Manager_Reverse_Iterator_Adapter<tao_value_type, key, value>;
-template class ACE_Map_Manager_Adapter<key, value, TAO_Incremental_Key_Generator>;
-template class ACE_Map_Manager_Adapter<key, value, noop_key_generator>;
-template class ACE_Map_Manager<key, value, ACE_Null_Mutex>;
-template class ACE_Map_Iterator_Base<key, value, ACE_Null_Mutex>;
-template class ACE_Map_Iterator<key, value, ACE_Null_Mutex>;
-template class ACE_Map_Reverse_Iterator<key, value, ACE_Null_Mutex>;
-template class ACE_Map_Entry<key, value>;
-#endif /* TAO_HAS_MINIMUM_POA_MAPS == 0 */
-
-template class ACE_Unbounded_Set<TAO_POA_Manager *>;
-template class ACE_Node<TAO_POA_Manager *>;
-template class ACE_Unbounded_Set_Iterator<TAO_POA_Manager *>;
-
-#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
-
-// Common typedefs.
-typedef TAO_Object_Adapter::poa_name key;
-typedef TAO_POA *value;
-typedef ACE_Reverse_Lock<ACE_Lock> REVERSE_LOCK;
-
-typedef ACE_Pair<key, value> expanded_value;
-typedef ACE_Reference_Pair<const key, value> tao_value_type;
-typedef ACE_Equal_To<key> compare_keys;
-typedef TAO_ObjectId_Hash hash_key;
-typedef ACE_Noop_Key_Generator<key> noop_key_generator;
-
-#pragma instantiate ACE_Reverse_Lock<ACE_Lock>
-#pragma instantiate ACE_Guard<REVERSE_LOCK>
-
-#pragma instantiate auto_ptr<TAO_Object_Adapter::Hint_Strategy>
-#pragma instantiate auto_ptr<TAO_Object_Adapter::transient_poa_map>
-
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Object_Adapter::Hint_Strategy>
-#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Object_Adapter::transient_poa_map>
-
-#pragma instantiate ACE_Noop_Key_Generator<key>
-
-// Common
-#pragma instantiate ACE_Reference_Pair<const key, value>
-
-// Map and iterator classes.
-#pragma instantiate ACE_Map<key, value>
-#pragma instantiate ACE_Iterator<tao_value_type>
-#pragma instantiate ACE_Reverse_Iterator<tao_value_type>
-
-// Iterator base classes.
-#pragma instantiate ACE_Iterator_Impl<tao_value_type>
-#pragma instantiate ACE_Reverse_Iterator_Impl<tao_value_type>
-
-// Active Map Manager related.
-#pragma instantiate ACE_Pair<key, value>
-#pragma instantiate ACE_Active_Map_Manager_Adapter<key, value, TAO_Ignore_Original_Key_Adapter>
-#pragma instantiate ACE_Active_Map_Manager_Adapter<key, value, TAO_Preserve_Original_Key_Adapter>
-#pragma instantiate ACE_Active_Map_Manager_Iterator_Adapter<tao_value_type, expanded_value>
-#pragma instantiate ACE_Active_Map_Manager_Reverse_Iterator_Adapter<tao_value_type, expanded_value>
-#pragma instantiate ACE_Active_Map_Manager<expanded_value>
-#pragma instantiate ACE_Map_Manager<ACE_Active_Map_Manager_Key, expanded_value, ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Iterator_Base<ACE_Active_Map_Manager_Key, expanded_value, ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Iterator<ACE_Active_Map_Manager_Key, expanded_value, ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Reverse_Iterator<ACE_Active_Map_Manager_Key, expanded_value, ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Entry<ACE_Active_Map_Manager_Key, expanded_value>
-
-// Hash Map Manager related.
-#if (TAO_HAS_MINIMUM_POA_MAPS == 0)
-#pragma instantiate ACE_Hash_Map_Manager_Ex_Adapter<key, value, hash_key, compare_keys, TAO_Incremental_Key_Generator>
-#endif /* TAO_HAS_MINIMUM_POA_MAPS == 0 */
-#pragma instantiate ACE_Hash_Map_Manager_Ex_Adapter<key, value, hash_key, compare_keys, noop_key_generator>
-#pragma instantiate ACE_Hash_Map_Manager_Ex_Iterator_Adapter<tao_value_type, key, value, hash_key, compare_keys>
-#pragma instantiate ACE_Hash_Map_Manager_Ex_Reverse_Iterator_Adapter<tao_value_type, key, value, hash_key, compare_keys>
-#pragma instantiate ACE_Hash_Map_Manager_Ex<key, value, hash_key, compare_keys, ACE_Null_Mutex>
-#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<key, value, hash_key, compare_keys, ACE_Null_Mutex>
-#pragma instantiate ACE_Hash_Map_Iterator_Ex<key, value, hash_key, compare_keys, ACE_Null_Mutex>
-#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<key, value, hash_key, compare_keys, ACE_Null_Mutex>
-#pragma instantiate ACE_Hash_Map_Entry<key, value>
-
-// Already in Active_Object_Map.cpp
-// #pragma instantiate ACE_Equal_To<key>
-
-#if (TAO_HAS_MINIMUM_POA_MAPS == 0)
-// Map Manager related.
-#pragma instantiate ACE_Map_Manager_Iterator_Adapter<tao_value_type, key, value>
-#pragma instantiate ACE_Map_Manager_Reverse_Iterator_Adapter<tao_value_type, key, value>
-#pragma instantiate ACE_Map_Manager_Adapter<key, value, TAO_Incremental_Key_Generator>
-#pragma instantiate ACE_Map_Manager_Adapter<key, value, noop_key_generator>
-#pragma instantiate ACE_Map_Manager<key, value, ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Iterator_Base<key, value, ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Iterator<key, value, ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Reverse_Iterator<key, value, ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Entry<key, value>
-#endif /* TAO_HAS_MINIMUM_POA_MAPS == 0 */
-
-#pragma instantiate ACE_Unbounded_Set<TAO_POA_Manager *>
-#pragma instantiate ACE_Node<TAO_POA_Manager *>
-#pragma instantiate ACE_Unbounded_Set_Iterator<TAO_POA_Manager *>
-
-#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */