diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.h')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.h | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.h b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.h new file mode 100644 index 00000000000..97bd7b76018 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Naming/Persistent_Context_Index.h @@ -0,0 +1,171 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Persistent_Context_Index.h + * + * $Id$ + * + * @author Marina Spivak <marina@cs.wustl.edu> + */ +//============================================================================= + + +#ifndef TAO_PERSISTENT_CONTEXT_INDEX_H +#define TAO_PERSISTENT_CONTEXT_INDEX_H +#include /**/ "ace/pre.h" + +#include "orbsvcs/Naming/Persistent_Entries.h" +#include "orbsvcs/Naming/naming_serv_export.h" +#include "orbsvcs/Naming/nsconf.h" +#include "tao/PortableServer/PortableServer.h" + +#include "ace/Malloc_T.h" +#include "ace/MMAP_Memory_Pool.h" + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +/** + * @class TAO_Persistent_Context_Index + * + * @brief This class facilitates implementation of Persistent + * Naming Service. It keeps track, centrally, of several pieces of + * info for each Persistent Naming Context, allowing to perform the + * initialization necessary for each Naming Context to + * restore the state of the Naming Service from persistent storage + * on server start-up. + * + * This class creates a memory-mapped file, allocates a hash + * table from that file, and uses the hash table to store POA id, + * and table and counter pointers for each Persistent Naming + * Context. There are methods for adding and deleting entries + * from this hash table as new Persistent Naming Contexts are + * created and old ones are destroyed. This hash table + * facilitates Persistent Naming Context servant initialization + * upon Naming Server start-up. + */ +class TAO_Naming_Serv_Export TAO_Persistent_Context_Index +{ +public: + // = Some typedefs for convenience. + + /// Hash map in which we will store info about each Persistent Naming Context. + typedef ACE_Hash_Map_With_Allocator<TAO_Persistent_Index_ExtId, + TAO_Persistent_Index_IntId> CONTEXT_INDEX; + + /// Hash map used by Persistent Naming Context to keep its state. + typedef ACE_Hash_Map_With_Allocator<TAO_Persistent_ExtId, + TAO_Persistent_IntId> CONTEXT; + + /// Allocator we will be using to make the Naming Service persistent. + typedef ACE_Allocator_Adapter <ACE_Malloc <ACE_MMAP_MEMORY_POOL, TAO_SYNCH_MUTEX> + > ALLOCATOR; + + // = Initialization and termination methods. + + /// Constructor. + TAO_Persistent_Context_Index (CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa); + + /** + * Create ACE_Allocator, open/create memory-mapped file with the + * specified file name/base address. Find or allocate <index_>. + * Return 0 on success or -1 on failure. + */ + int open (const ACE_TCHAR *file_name, + void * base_address = TAO_NAMING_BASE_ADDR); + + /** + * If <index_> contains no entries (i.e., was just created), create + * a root Persistent Naming Context servant with table of size + * <context_size>, and make an entry for it + * in the <index_>. If <index_> contains entries, create a + * Persistent Naming Context servant for each entry. Return 0 on + * success and -1 on failure. + */ + int init (size_t context_size); + + /** + * Destructor. The memory mapped file that was opened/created is + * not deleted, since we want it to keep the state of the Naming + * Service until the next run. + */ + ~TAO_Persistent_Context_Index (void); + + // = Methods for adding/removing entries. + + /** + * Create an entry for a Persistent Naming Context in <index_>, + * i.e., a context with <poa_id>, <counter> and <hash_map> has just + * been created, and is registering with us. + */ + int bind (const char *poa_id, + ACE_UINT32 *&counter, + CONTEXT *hash_map); + + /// Remove an entry for the Persistent Naming Context with <poa_id> + /// from <index_> (i.e., this context has just been destroyed). + int unbind (const char *poa_id); + + // = Accessors. + + /// Return allocator. + ACE_Allocator *allocator (void); + + /// Return orb pointer. + CORBA::ORB_ptr orb (void); + + /// Return a pointer to the root Naming Context (returns a copy - must be + /// deallocated by the user). + CosNaming::NamingContext_ptr root_context (void); + +private: + + /// Helper for the <init> method. Iterates over <index_>, and + /// creates a servant for each entry. + int recreate_all (void); + + /// Helper for the <open> method. + int create_index (void); + + /// Helper for <create_index> method: places hash table into an + /// allocated space. + int create_index_helper (void *buffer); + + /// Lock to prevent multiple threads from modifying entries in the + /// <index_> simultanneously. + TAO_SYNCH_MUTEX lock_; + + /** + * Allocator that deals out memory from a memory-mapped file. We + * use it here, and in TAO_Persistent_Naming_Context, whenever we + * deal with data that should be kept in persistent store. + */ + ALLOCATOR *allocator_; + + /// Hash map where we keep entries for all Persistent Naming + /// Contexts. + CONTEXT_INDEX *index_; + + /// Name of the memory-mapped file used by <allocator_>. + const ACE_TCHAR *index_file_; + + /// Base address for the memory-mapped file. + void *base_address_; + + /// ORB. We use it for several object_to_string conversions, and + /// keep it around for Persistent Naming Contexts' use. + CORBA::ORB_var orb_; + + /// POA under which to register Persistent Naming Context servants + /// during start-up. + PortableServer::POA_var poa_; + + /// The reference to the root Naming Context. + CosNaming::NamingContext_var root_context_; +}; + +TAO_END_VERSIONED_NAMESPACE_DECL + +#include /**/ "ace/post.h" +#endif /* TAO_PERSISTENT_CONTEXT_INDEX_H */ |