diff options
Diffstat (limited to 'TAO/tao/Object_Adapter.h')
-rw-r--r-- | TAO/tao/Object_Adapter.h | 650 |
1 files changed, 0 insertions, 650 deletions
diff --git a/TAO/tao/Object_Adapter.h b/TAO/tao/Object_Adapter.h deleted file mode 100644 index 60e33b58535..00000000000 --- a/TAO/tao/Object_Adapter.h +++ /dev/null @@ -1,650 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// TAO -// -// = FILENAME -// Object_Adapter.h -// -// = AUTHOR -// Irfan Pyarali -// -// ============================================================================ - -#ifndef TAO_OBJECT_ADAPTER_H -#define TAO_OBJECT_ADAPTER_H - -#include "tao/Key_Adapters.h" -#include "tao/Server_Strategy_Factory.h" -#include "tao/poa_macros.h" - -// Stubs -#include "tao/POAC.h" - -// Servant -#include "tao/Servant_Base.h" - -// Skeletons -#include "tao/POAS.h" - -// Active Object Table -#include "tao/Active_Object_Map.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -//////////////////////////////////////////////////////////////////////////////// - -// Forward declaration -class TAO_POA; -class TAO_POA_Manager; -class TAO_Temporary_Creation_Time; -class TAO_POA_Current_Impl; - -class TAO_Export TAO_POA_Current : public POA_PortableServer::Current -{ -public: - TAO_POA_Current (void); - // Constructor - - PortableServer::POA_ptr get_POA (CORBA_Environment &ACE_TRY_ENV); - // Returns the POA on which the current request is being invoked. - // Can raise the <CORBA::NoContext> exception if this function is - // not invoked in the context of an upcall. - - PortableServer::ObjectId *get_object_id (CORBA_Environment &ACE_TRY_ENV); - // Returns the object id of the current request being invoked. Can - // raise the <CORBA::NoContext> exception if this function is not - // invoked in the context of an upcall. - - TAO_POA_Current_Impl *implementation (void); - // Returns the class that implements this interface. - - TAO_POA_Current_Impl *implementation (TAO_POA_Current_Impl *new_current); - // Sets the thread-specific pointer to the new POA Current state, - // returning a pointer to the existing POA Current state. -}; - -class TAO_Export TAO_POA_Current_Impl -{ - // = TITLE - // - // Implementation of the PortableServer::Current object. - // - // = DESCRIPTION - // - // Objects of this class hold state information regarding the - // current POA invocation. Savvy readers will notice that this - // contains substantially more methods than the POA spec shows; - // they exist because the ORB either (a) needs them or (b) finds - // them useful for implementing a more efficient ORB. - // - // The intent is that instances of this class are held in - // Thread-Specific Storage so that upcalls can get context - // information regarding their invocation. The POA itself must - // insure that all <set_*> operations are performed in the - // execution thread so that the proper <TAO_POA_Current> pointer - // is obtained from TSS. -public: - - friend class TAO_POA; - - PortableServer::POA_ptr get_POA (CORBA_Environment &ACE_TRY_ENV); - // Return pointer to the invoking POA. Raises the - // <CORBA::NoContext> exception. - - PortableServer::ObjectId *get_object_id (CORBA_Environment &ACE_TRY_ENV); - // Return pointer to the object id through which this was invoked. - // This may be necessary in cases where a <Servant> is serving under - // the guise of multiple object ids. This has _out semantics Raises - // the <CORBA::NoContext> exception. - - void poa (TAO_POA *); - // Set the POA implementation. - - TAO_POA *poa (void) const; - // Get the POA imeplemantation - - TAO_ORB_Core &orb_core (void) const; - // ORB Core for this current. - - void object_id (const PortableServer::ObjectId &id); - // Set the object ID. - - const PortableServer::ObjectId &object_id (void) const; - // Get the object ID. - - void object_key (const TAO_ObjectKey &key); - // Set the object key. - - const TAO_ObjectKey &object_key (void) const; - // Get the object key. - - void servant (PortableServer::Servant servant); - // Set the servant for the current upcall. - - PortableServer::Servant servant (void) const; - // Get the servant for the current upcall. - - TAO_POA_Current_Impl (void); - // Convenience constructor combining construction & initialization. - - void teardown (void); - // Teardown the current for this request. - - void setup (TAO_POA *impl, - const TAO_ObjectKey &key, - PortableServer::Servant servant); - // Setup the current. - -protected: - TAO_POA *poa_; - // The POA implementation invoking an upcall - - PortableServer::ObjectId object_id_; - // The object ID of the current context. This is the user id and - // not the id the goes into the IOR. Note also that unlike the - // <object_key>, this field is stored by value. - - const TAO_ObjectKey *object_key_; - // The object key of the current context. - - PortableServer::Servant servant_; - // The servant for the current upcall. - - TAO_POA_Current_Impl *previous_current_impl_; - // Current previous from <this>. - - int setup_done_; - // Is setup complete? - - // = Hidden because we don't allow these - TAO_POA_Current_Impl (const TAO_POA_Current_Impl &); - void operator= (const TAO_POA_Current_Impl &); -}; - -class TAO_Object_Adapter -{ - // = TITLE - // Defines the Object Adapter abstraction. - // - // = DESCRIPTION - // This class will be used as a facade for the POAs in a server -public: - - typedef PortableServer::ObjectId poa_name; - typedef PortableServer::ObjectId_var poa_name_var; - typedef PortableServer::ObjectId_out poa_name_out; - - TAO_Object_Adapter (const TAO_Server_Strategy_Factory::Active_Object_Map_Creation_Parameters &creation_parameters, - TAO_ORB_Core &orb_core); - // Constructor. - - ~TAO_Object_Adapter (void); - // Destructor. - - void dispatch_servant (const TAO_ObjectKey &key, - CORBA::ServerRequest &req, - void *context, - CORBA_Environment &ACE_TRY_ENV); - - int locate_servant (const TAO_ObjectKey &key, - CORBA_Environment &ACE_TRY_ENV); - - TAO_SERVANT_LOCATION find_servant (const TAO_ObjectKey &key, - PortableServer::Servant &servant, - CORBA_Environment &ACE_TRY_ENV); - - int find_poa (const poa_name &system_name, - CORBA::Boolean activate_it, - CORBA::Boolean root, - const TAO_Temporary_Creation_Time &poa_creation_time, - TAO_POA *&poa, - CORBA_Environment &ACE_TRY_ENV); - - int bind_poa (const poa_name &folded_name, - TAO_POA *poa, - poa_name_out system_name); - - int unbind_poa (TAO_POA *poa, - const poa_name &folded_name, - const poa_name &system_name); - - int activate_poa (const poa_name &folded_name, - TAO_POA *&poa, - CORBA_Environment &ACE_TRY_ENV); - - ACE_Lock &lock (void); - - ACE_SYNCH_MUTEX &thread_lock (void); - - ACE_Reverse_Lock<ACE_Lock> &reverse_lock (void); - - static CORBA::ULong transient_poa_name_size (void); - - void deactivate (CORBA::Boolean wait_for_completion, - CORBA::Environment &ACE_TRY_ENV); - - typedef ACE_Unbounded_Set<TAO_POA_Manager *> poa_manager_set; - - poa_manager_set poa_manager_set_; - -protected: - - void deactivate_i (CORBA::Boolean wait_for_completion, - CORBA::Environment &ACE_TRY_ENV); - - int locate_servant_i (const TAO_ObjectKey &key, - CORBA_Environment &ACE_TRY_ENV); - - TAO_SERVANT_LOCATION find_servant_i (const TAO_ObjectKey &key, - PortableServer::Servant &servant, - CORBA_Environment &ACE_TRY_ENV); - - void dispatch_servant_i (const TAO_ObjectKey &key, - CORBA::ServerRequest &req, - void *context, - CORBA_Environment &ACE_TRY_ENV); - - void locate_poa (const TAO_ObjectKey &key, - PortableServer::ObjectId &id, - TAO_POA *&poa, - CORBA_Environment &ACE_TRY_ENV); - - int find_transient_poa (const poa_name &system_name, - CORBA::Boolean root, - const TAO_Temporary_Creation_Time &poa_creation_time, - TAO_POA *&poa); - - int find_persistent_poa (const poa_name &system_name, - TAO_POA *&poa, - CORBA_Environment &ACE_TRY_ENV); - - int bind_transient_poa (TAO_POA *poa, - poa_name_out system_name); - - int bind_persistent_poa (const poa_name &folded_name, - TAO_POA *poa, - poa_name_out system_name); - - int unbind_transient_poa (const poa_name &system_name); - - int unbind_persistent_poa (const poa_name &folded_name, - const poa_name &system_name); - - static ACE_Lock *create_lock (int enable_locking, - ACE_SYNCH_MUTEX &thread_lock); - -public: - - class Hint_Strategy - { - // = TITLE - // Base class for POA active hint strategy. - // - // = DESCRIPTION - // This class also provides for common structures used by all - // the derived classes. - public: - - virtual ~Hint_Strategy (void); - - virtual int find_persistent_poa (const poa_name &system_name, - TAO_POA *&poa, - CORBA_Environment &ACE_TRY_ENV) = 0; - - virtual int bind_persistent_poa (const poa_name &folded_name, - TAO_POA *poa, - poa_name_out system_name) = 0; - - virtual int unbind_persistent_poa (const poa_name &folded_name, - const poa_name &system_name) = 0; - - void object_adapter (TAO_Object_Adapter *oa); - - protected: - - TAO_Object_Adapter *object_adapter_; - }; - - class Active_Hint_Strategy : public Hint_Strategy - { - // = TITLE - // This class uses active demux hint for POA active hint - // strategy. - // - // = DESCRIPTION - // This class will append an active hint to the POA name, - // making the POA lookups fast and predictable. - public: - - Active_Hint_Strategy (CORBA::ULong map_size); - - virtual ~Active_Hint_Strategy (void); - - virtual int find_persistent_poa (const poa_name &system_name, - TAO_POA *&poa, - CORBA_Environment &ACE_TRY_ENV); - - virtual int bind_persistent_poa (const poa_name &folded_name, - TAO_POA *poa, - poa_name_out system_name); - - virtual int unbind_persistent_poa (const poa_name &folded_name, - const poa_name &system_name); - - protected: - - typedef ACE_Active_Map_Manager_Adapter< - poa_name, - TAO_POA *, - TAO_Preserve_Original_Key_Adapter> persistent_poa_system_map; - - persistent_poa_system_map persistent_poa_system_map_; - }; - - class No_Hint_Strategy : public Hint_Strategy - { - // = TITLE - // This class doesn't use any hints for POA active hint - // strategy. - // - // = DESCRIPTION - // This class will simply use the POA names as is. And since - // no hint is added, the IORs will be smaller. - public: - - virtual ~No_Hint_Strategy (void); - - virtual int find_persistent_poa (const poa_name &system_name, - TAO_POA *&poa, - CORBA_Environment &ACE_TRY_ENV); - - virtual int bind_persistent_poa (const poa_name &folded_name, - TAO_POA *poa, - poa_name_out system_name); - - virtual int unbind_persistent_poa (const poa_name &folded_name, - const poa_name &system_name); - - }; - -protected: - - Hint_Strategy *hint_strategy_; - - typedef ACE_Map< - poa_name, - TAO_POA *> transient_poa_map; - // Base class of the id map. - - typedef ACE_Hash_Map_Manager_Ex_Adapter< - poa_name, - TAO_POA *, - TAO_ObjectId_Hash, - ACE_Equal_To<poa_name>, - TAO_Incremental_Key_Generator> transient_poa_hash_map; - // Id hash map. - - typedef ACE_Map_Manager_Adapter< - poa_name, - TAO_POA *, - TAO_Incremental_Key_Generator> transient_poa_linear_map; - // Id linear map. - - typedef ACE_Active_Map_Manager_Adapter< - poa_name, - TAO_POA *, - TAO_Ignore_Original_Key_Adapter> transient_poa_active_map; - // Id active map. - - typedef ACE_Map< - poa_name, - TAO_POA *> persistent_poa_name_map; - // Base class of the name map. - - typedef ACE_Hash_Map_Manager_Ex_Adapter< - poa_name, - TAO_POA *, - TAO_ObjectId_Hash, - ACE_Equal_To<PortableServer::ObjectId>, - ACE_Noop_Key_Generator<poa_name> > persistent_poa_name_hash_map; - // Id hash map. - - typedef ACE_Map_Manager_Adapter< - poa_name, - TAO_POA *, - ACE_Noop_Key_Generator<poa_name> > persistent_poa_name_linear_map; - // Id linear map. - -public: - - persistent_poa_name_map *persistent_poa_name_map_; - transient_poa_map *transient_poa_map_; - -protected: - - static size_t transient_poa_name_size_; - - static void set_transient_poa_name_size (const TAO_Server_Strategy_Factory::Active_Object_Map_Creation_Parameters &creation_parameters); - - TAO_ORB_Core &orb_core_; - - int enable_locking_; - - ACE_SYNCH_MUTEX thread_lock_; - - ACE_Lock *lock_; - - ACE_Reverse_Lock<ACE_Lock> reverse_lock_; - - ACE_SYNCH_CONDITION non_servant_upcall_condition_; - // Condition variable for waiting on non-servant upcalls to end. - - CORBA::Boolean non_servant_upcall_in_progress_; - // Flag for knowing when an non-servant upcall is in progress. - - ACE_thread_t non_servant_upcall_thread_; - // Id of thread making the non-servant upcall. - -public: - - class poa_name_iterator - { - // = TITLE - // Iterator for a folded poa name. - public: - - poa_name_iterator (int begin, - CORBA::ULong size, - const CORBA::Octet *folded_buffer); - // Constructor. - - int operator== (const poa_name_iterator &rhs) const; - int operator!= (const poa_name_iterator &rhs) const; - // Comparison operators. - - ACE_CString operator* () const; - // Dereference operator. - - poa_name_iterator &operator++ (void); - // Prefix advance. - - protected: - - CORBA::ULong size_; - CORBA::ULong position_; - const CORBA::Octet *folded_buffer_; - CORBA::ULong last_separator_; - }; - - class iteratable_poa_name - { - // = TITLE - // This class allows iteration over a folded poa name. - public: - - typedef poa_name_iterator iterator; - - iteratable_poa_name (const poa_name &folded_name); - - iterator begin (void) const; - iterator end (void) const; - - protected: - - const poa_name &folded_name_; - }; - - class Non_Servant_Upcall - { - // = TITLE - // This class helps us with 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 non-servant - // (i.e., adapter activator and 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. - public: - - Non_Servant_Upcall (TAO_Object_Adapter &object_adapter); - // Constructor. - - ~Non_Servant_Upcall (void); - // Destructor. - - protected: - - TAO_Object_Adapter &object_adapter_; - }; - - friend class Non_Servant_Upcall; - - class TAO_Export Servant_Upcall - { - // = TITLE - // This class finds out the POA and the servant to perform an - // upcall. It can only be instantiated without the object - // adapter's lock held. - public: - - friend class TAO_POA; - - Servant_Upcall (TAO_Object_Adapter &object_adapter); - // Constructor. - - ~Servant_Upcall (void); - // Destructor. - - void prepare_for_upcall (const TAO_ObjectKey &key, - const char *operation, - CORBA::Environment &ACE_TRY_ENV = TAO_default_environment ()); - // Locate POA and servant. - - TAO_POA &poa (void) const; - // POA accessor. - - TAO_Object_Adapter &object_adapter (void) const; - // Object Adapter accessor. - - const PortableServer::ObjectId &id (void) const; - // ID accessor. - - PortableServer::Servant servant (void) const; - // Servant accessor. - -#if !defined (TAO_HAS_MINIMUM_CORBA) - - PortableServer::ServantLocator::Cookie locator_cookie (void) const; - // Get the Servant Locator's cookie - - void locator_cookie (PortableServer::ServantLocator::Cookie cookie); - // Set the Servant Locator's cookie - - const char *operation (void) const; - // Get the operation name. - - void operation (const char *); - // Set the operation name. - -#endif /* TAO_HAS_MINIMUM_CORBA */ - - void active_object_map_entry (TAO_Active_Object_Map::Map_Entry *entry); - // Set the <active_object_map_entry>. - - TAO_Active_Object_Map::Map_Entry *active_object_map_entry (void) const; - // Get the <active_object_map_entry>. - - void using_servant_locator (void); - // We are using the servant locator for this upcall. - - protected: - - void wait_for_non_servant_upcalls_to_complete (CORBA::Environment &ACE_TRY_ENV); - void servant_locator_cleanup (void); - void single_threaded_poa_setup (CORBA::Environment &ACE_TRY_ENV); - void single_threaded_poa_cleanup (void); - void servant_cleanup (void); - void poa_cleanup (void); - - TAO_Object_Adapter &object_adapter_; - - TAO_POA *poa_; - - PortableServer::Servant servant_; - - enum State - { - INITIAL_STAGE, - OBJECT_ADAPTER_LOCK_ACQUIRED, - POA_CURRENT_SETUP, - OBJECT_ADAPTER_LOCK_RELEASED, - SERVANT_LOCK_ACQUIRED - }; - - State state_; - - PortableServer::ObjectId id_; - - TAO_POA_Current_Impl current_context_; - -#if !defined (TAO_HAS_MINIMUM_CORBA) - - PortableServer::ServantLocator::Cookie cookie_; - // Servant Locator's cookie - - const char *operation_; - // Operation name for this current. - -#endif /* TAO_HAS_MINIMUM_CORBA */ - - TAO_Active_Object_Map::Map_Entry *active_object_map_entry_; - // Pointer to the entry in the TAO_Active_Object_Map corresponding - // to the servant for this request. - - int using_servant_locator_; - // Are we using the servant locator? - - private: - Servant_Upcall (const Servant_Upcall &); - void operator= (const Servant_Upcall &); - }; - - friend class Servant_Upcall; -}; - -//////////////////////////////////////////////////////////////////////////////// - -#if defined (__ACE_INLINE__) -# include "tao/Object_Adapter.i" -#endif /* __ACE_INLINE__ */ - -#endif /* TAO_OBJECT_ADAPTER_H */ |