📄 persistent_naming_context.cpp
字号:
#include "Persistent_Naming_Context.h"
#include "Persistent_Context_Index.h"
#include "Bindings_Iterator_T.h"
#include "ace/OS_NS_stdio.h"
// The following #pragma is needed to disable a warning that occurs
// in MSVC 6 due to the overly long debugging symbols generated for
// the ACE_Auto_Basic_Ptr<ACE_Hash_Map_Iterator_Ex<TAO_...> > template
// instance used by some of the methods in this file.
#ifdef _MSC_VER
# pragma warning(disable: 4786) /* identifier was truncated to '255'
characters in the browser
information */
#endif /* _MSC_VER */
#include "ace/Auto_Ptr.h"
ACE_RCSID (Naming,
Persistent_Naming_Context,
"Persistent_Naming_Context.cpp,v 1.40 2003/11/01 11:15:09 dhinton Exp")
int
TAO_Persistent_Bindings_Map::unbind (const char *id,
const char *kind)
{
TAO_Persistent_ExtId name (id, kind);
TAO_Persistent_IntId entry;
if (this->map_->unbind (name, entry, this->allocator_) != 0)
return -1;
else
{
// Free up the memory we allocated in shared_bind(). Note that
// this assumes that the "ref" pointer comes first and that
// the ref, id and kind are contiguously allocated (see
// shared_bind() for details).
this->allocator_->free ((void *) (entry.ref_));
return 0;
}
}
int
TAO_Persistent_Bindings_Map::bind (const char *id,
const char *kind,
CORBA::Object_ptr obj,
CosNaming::BindingType type)
{
return this->shared_bind (id, kind, obj, type, 0);
}
int
TAO_Persistent_Bindings_Map::rebind (const char *id,
const char *kind,
CORBA::Object_ptr obj,
CosNaming::BindingType type)
{
return this->shared_bind (id, kind, obj, type, 1);
}
int
TAO_Persistent_Bindings_Map::find (const char *id,
const char *kind,
CORBA::Object_ptr & obj,
CosNaming::BindingType &type)
{
TAO_Persistent_ExtId name (id, kind);
TAO_Persistent_IntId entry;
if (this->map_->find (name,
entry,
this->allocator_) != 0)
return -1;
else
{
ACE_DECLARE_NEW_CORBA_ENV;
obj = orb_->string_to_object (entry.ref_ ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
type = entry.type_;
return 0;
}
}
TAO_Persistent_Bindings_Map::TAO_Persistent_Bindings_Map (CORBA::ORB_ptr orb)
: allocator_ (0),
map_ (0),
orb_ (CORBA::ORB::_duplicate (orb))
{
}
TAO_Persistent_Bindings_Map::~TAO_Persistent_Bindings_Map (void)
{
}
void
TAO_Persistent_Bindings_Map::destroy (void)
{
this->map_->ACE_Hash_Map_With_Allocator<TAO_Persistent_ExtId, TAO_Persistent_IntId>::~ACE_Hash_Map_With_Allocator ();
this->allocator_->free (map_);
}
TAO_Persistent_Bindings_Map::HASH_MAP *
TAO_Persistent_Bindings_Map::map (void)
{
return this->map_;
}
size_t
TAO_Persistent_Bindings_Map::total_size (void)
{
return this->map_->total_size ();
}
size_t
TAO_Persistent_Bindings_Map::current_size (void)
{
return map_->current_size ();
}
int
TAO_Persistent_Bindings_Map::open (size_t hash_table_size,
ACE_Allocator *alloc)
{
allocator_ = alloc;
// Use allocator to allocate space for the hash map.
void *hash_map = 0;
size_t map_size = sizeof (HASH_MAP);
hash_map = this->allocator_->malloc (map_size);
// If allocation failed ...
if (hash_map == 0)
return -1;
// Initialize allocated hash map through placement new.
if (open_helper (hash_table_size, hash_map) == -1)
this->allocator_->free (hash_map);
return 0;
}
int
TAO_Persistent_Bindings_Map::open_helper (size_t hash_table_size,
void *buffer)
{
this->map_ = new (buffer) HASH_MAP (hash_table_size, this->allocator_);
return 0;
}
void
TAO_Persistent_Bindings_Map::set (HASH_MAP *map,
ACE_Allocator *alloc)
{
allocator_ = alloc;
map_ = map;
}
int
TAO_Persistent_Bindings_Map::shared_bind (const char * id,
const char * kind,
CORBA::Object_ptr obj,
CosNaming::BindingType type,
int rebind)
{
// Obtain a stringified ior of <obj> (i.e., the representation we can store).
ACE_DECLARE_NEW_CORBA_ENV;
CORBA::String_var ref = orb_->object_to_string (obj ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
// Calculate and allocate the memory we need to store this name to
// object binding.
size_t id_len = ACE_OS::strlen (id) + 1;
size_t kind_len = ACE_OS::strlen (kind) + 1;
size_t ref_len = ACE_OS::strlen (ref.in ()) + 1;
size_t total_len = id_len + kind_len + ref_len;
char *ptr = (char *) this->allocator_->malloc (total_len);
// Allocation failed - bail out.
if (ptr == 0)
return -1;
// Allocation succeded - place the data into the allocated memory
// and procceed.
else
{
// Note that the <ref> *must* come first to make sure we can
// retrieve this pointer later on in unbind().
char * ref_ptr = ptr;
char * id_ptr = ptr + ref_len;
char * kind_ptr = ptr + ref_len + id_len;
ACE_OS::strcpy (ref_ptr, ref.in ());
ACE_OS::strcpy (id_ptr, id);
ACE_OS::strcpy (kind_ptr, kind);
TAO_Persistent_ExtId new_name (id_ptr, kind_ptr);
TAO_Persistent_IntId new_entry (ref_ptr, type);
int result = -1;
if (rebind == 0)
{
// Do a normal bind. This will fail if there's already an
// <new_internal> with the same name.
result = this->map_->bind (new_name, new_entry, this->allocator_);
if (result == 1)
{
// Entry already existed so bind failed. Free our
// dynamically allocated memory.
this->allocator_->free ((void *) ptr);
return result;
}
}
else
// Rebind.
{
TAO_Persistent_ExtId old_name;
TAO_Persistent_IntId old_entry;
// Check that the types of old and new entries match.
if (this->map_->find (new_name,
old_entry,
this->allocator_) == 0
&& type != old_entry.type_)
result = -2;
// If types match, perform rebind.
else
result = this->map_->rebind (new_name, new_entry,
old_name, old_entry,
this->allocator_);
if (result == 1)
{
// Free up the old binding's memory, if it was replaced.
// Note, this assumes that the "ref" pointer comes
// first, and that the id, kind, and ref are contiguously
// allocated (see beginning of this method for details).
this->allocator_->free ((void *) old_entry.ref_);
}
}
// Check for failures, and clean up dynamically allocated memory
// if necessary.
if (result < 0)
this->allocator_->free ((void *) ptr);
else
// If bind() or rebind() succeeded, they will automatically sync
// up the map manager entry. However, we must sync up our
// name/value memory.
this->allocator_->sync (ptr, total_len);
return result;
}
}
TAO_Persistent_Naming_Context::TAO_Persistent_Naming_Context (PortableServer::POA_ptr poa,
const char *poa_id,
TAO_Persistent_Context_Index *context_index)
: TAO_Hash_Naming_Context (poa,
poa_id),
counter_ (0),
persistent_context_ (0),
index_ (context_index)
{
ACE_NEW (this->persistent_context_,
TAO_Persistent_Bindings_Map (context_index->orb ()));
// Set the superclass pointer.
context_ = persistent_context_;
}
TAO_Persistent_Naming_Context::TAO_Persistent_Naming_Context (PortableServer::POA_ptr poa,
const char *poa_id,
TAO_Persistent_Context_Index *context_index,
HASH_MAP *map,
ACE_UINT32 *counter)
: TAO_Hash_Naming_Context (poa,
poa_id),
counter_ (counter),
persistent_context_ (0),
index_ (context_index)
{
ACE_NEW (this->persistent_context_,
TAO_Persistent_Bindings_Map (context_index->orb ()));
// Set the superclass pointer.
context_ = persistent_context_;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -