📄 storable_naming_context.cpp
字号:
CosNaming::NamingContext_var context =
get_context (n ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
CosNaming::Name simple_name;
simple_name.length (1);
simple_name[0] = n[name_len - 1];
context->unbind (simple_name ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
// If we received a simple name, we need to unbind it in this
// context.
else
{
if (this->context_->unbind (n[0].id,
n[0].kind) == -1)
ACE_THROW (CosNaming::NamingContext::NotFound
(CosNaming::NamingContext::missing_node, n));
this->Write(flck.peer());
}
}
CosNaming::NamingContext_ptr
TAO_Storable_Naming_Context::bind_new_context (const CosNaming::Name& n
ACE_ENV_ARG_DECL)
{
ACE_TRACE("bind_new_context");
// Get the length of the name.
CORBA::ULong name_len = n.length ();
// Check for invalid name.
if (name_len == 0)
ACE_THROW_RETURN (CosNaming::NamingContext::InvalidName(),
CosNaming::NamingContext::_nil ());
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
ace_mon,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
CosNaming::NamingContext::_nil ());
// Open the backing file
File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
CosNaming::NamingContext::_nil ());
// If we received compound name, resolve it to get the context in
// which the binding should take place, then perform the operation on
// target context.
if (name_len > 1)
{
// This had been a read on the file so now we are done with it
flck.release();
CosNaming::NamingContext_var context =
get_context (n ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
CosNaming::Name simple_name;
simple_name.length (1);
simple_name[0] = n[name_len - 1];
return context->bind_new_context (simple_name ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
}
// If we received a simple name, we need to bind it in this context.
else
{
// This had been a read on the file so now we are done with it
flck.release();
// Stores our new Naming Context.
CosNaming::NamingContext_var result =
CosNaming::NamingContext::_nil ();
// Create new context.
result = new_context (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
// Bind the new context to the name.
ACE_TRY
{
bind_context (n,
result.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
{
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY_EX(DESTROY)
{
result->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK_EX(DESTROY);
}
ACE_CATCHANY
{
// Do nothing?
}
ACE_ENDTRY;
}
// Re-raise the exception in bind_context()
ACE_RE_THROW;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
return result._retn ();
}
}
void
TAO_Storable_Naming_Context::destroy (ACE_ENV_SINGLE_ARG_DECL)
{
ACE_TRACE("destroy");
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
ace_mon,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
// Open the backing file
File_Open_Lock_and_Check flck(this, "rw"
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
if (this->context_->current_size () != 0)
ACE_THROW (CosNaming::NamingContext::NotEmpty());
// Destroy is a no-op on a root context.
if (root ())
return;
else
{
this->destroyed_ = 2;
// 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 ();
PortableServer::ObjectId_var id =
PortableServer::string_to_ObjectId (poa_id_.fast_rep ());
ACE_CHECK;
poa->deactivate_object (id.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->Write(flck.peer());
}
}
void
TAO_Storable_Naming_Context::bind (const CosNaming::Name& n,
CORBA::Object_ptr obj
ACE_ENV_ARG_DECL)
{
ACE_TRACE("TAO_Storable_Naming_Context::bind");
// Get the length of the name.
CORBA::ULong name_len = n.length ();
// Check for invalid name.
if (name_len == 0)
ACE_THROW (CosNaming::NamingContext::InvalidName());
// we didn't need a lock to check the input arg, but now we do
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
// Open the backing file
File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw"
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
// If we received compound name, resolve it to get the context in
// which the binding should take place, then perform the binding
// on target context.
if (name_len > 1)
{
// This had been a read on the file so now we are done with it
flck.release();
CosNaming::NamingContext_var context =
get_context (n ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
CosNaming::Name simple_name;
simple_name.length (1);
simple_name[0] = n[name_len - 1];
context->bind (simple_name, obj ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
// If we received a simple name, we need to bind it in this context.
else
{
// Try binding the name.
int result = this->context_->bind (n[0].id,
n[0].kind,
obj,
CosNaming::nobject);
if (result == 1)
ACE_THROW (CosNaming::NamingContext::AlreadyBound());
// Something went wrong with the internal structure
else if (result == -1)
ACE_THROW (CORBA::INTERNAL ());
this->Write(flck.peer());
}
}
void
TAO_Storable_Naming_Context::list (CORBA::ULong how_many,
CosNaming::BindingList_out &bl,
CosNaming::BindingIterator_out &bi
ACE_ENV_ARG_DECL)
{
ACE_TRACE("list");
// Allocate nil out parameters in case we won't be able to complete
// the operation.
bi = CosNaming::BindingIterator::_nil ();
ACE_NEW_THROW_EX (bl,
CosNaming::BindingList (0),
CORBA::NO_MEMORY ());
ACE_CHECK;
// Obtain a lock before we proceed with the operation.
ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
ace_mon,
this->lock_,
CORBA::INTERNAL ());
ACE_CHECK;
// Open the backing file
File_Open_Lock_and_Check flck(this, "r"
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// Check to make sure this object didn't have <destroy> method
// invoked on it.
if (this->destroyed_)
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
// We have the map in memory, let the disk go
flck.release();
// Dynamically allocate iterator for traversing the underlying hash map.
HASH_MAP::ITERATOR *hash_iter = 0;
ACE_NEW_THROW_EX (hash_iter,
HASH_MAP::ITERATOR (storable_context_->map ()),
CORBA::NO_MEMORY ());
ACE_CHECK;
// Store <hash_iter temporarily in auto pointer, in case we'll have
// some failures and throw an exception.
ACE_Auto_Basic_Ptr<HASH_MAP::ITERATOR> temp (hash_iter);
// Silliness below is required because of broken old g++!!! E.g.,
// without it, we could have just said HASH_MAP::ITERATOR everywhere we use ITER_DEF.
typedef ACE_Hash_Map_Manager<TAO_Persistent_ExtId,
TAO_Persistent_IntId,
ACE_Null_Mutex>::ITERATOR ITER_DEF;
typedef ACE_Hash_Map_Manager<TAO_Persistent_ExtId,
TAO_Persistent_IntId,
ACE_Null_Mutex>::ENTRY ENTRY_DEF;
// Typedef to the type of BindingIterator servant for ease of use.
typedef TAO_Bindings_Iterator<ITER_DEF, ENTRY_DEF> ITER_SERVANT;
// A pointer to BindingIterator servant.
ITER_SERVANT *bind_iter = 0;
// Number of bindings that will go into the BindingList <bl>.
CORBA::ULong n;
// Calculate number of bindings that will go into <bl>.
if (this->context_->current_size () > how_many)
n = how_many;
else
n = ACE_static_cast (CORBA::ULong, this->context_->current_size ());
// Use the hash map iterator to populate <bl> with bindings.
bl->length (n);
ENTRY_DEF *hash_entry;
for (CORBA::ULong i = 0; i < n; i++)
{
hash_iter->next (hash_entry);
hash_iter->advance ();
if (ITER_SERVANT::populate_binding (hash_entry, bl[i]) == 0)
ACE_THROW (CORBA::NO_MEMORY());
}
// Now we are done with the BindingsList, and we can follow up on
// the BindingIterator business.
// If we do not need to pass back BindingIterator.
if (this->context_->current_size () <= how_many)
return;
else
{
// *** This is a problem. Is there an exception we can throw? ***
ACE_THROW (CORBA::NO_IMPLEMENT());
// Create a BindingIterator for return.
ACE_NEW_THROW_EX (bind_iter,
ITER_SERVANT (this, hash_iter,
this->poa_.in (), this->lock_),
CORBA::NO_MEMORY ());
ACE_CHECK;
// Release <hash_iter> from auto pointer, and start using
// reference counting to control our servant.
temp.release ();
PortableServer::ServantBase_var iter = bind_iter;
// Increment reference count on this Naming Context, so it doesn't get
// deleted before the BindingIterator servant gets deleted.
interface_->_add_ref (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
// Register with the POA.
char poa_id[BUFSIZ];
ACE_OS::sprintf (poa_id,
"%s_%d",
this->poa_id_.c_str (),
this->counter_++);
PortableServer::ObjectId_var id =
PortableServer::string_to_ObjectId (poa_id);
this->poa_->activate_object_with_id (id.in (),
bind_iter
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
bi = bind_iter->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
}
}
#include "Naming_Service_Container.h"
CosNaming::NamingContext_ptr TAO_Storable_Naming_Context::recreate_all(
CORBA::ORB_ptr orb,
PortableServer::POA_ptr poa,
const char *poa_id,
size_t context_size,
int reentering,
TAO_Naming_Service_Persistence_Factory *factory,
const ACE_TCHAR *persistence_directory,
int use_redundancy
ACE_ENV_ARG_DECL)
{
ACE_TRACE("recreate_all");
ACE_UNUSED_ARG (reentering);
// Whether we are redundant is global
redundant_ = use_redundancy;
// Save the root name for later use
root_name_ = poa_id;
// Create a new context.
TAO_Storable_Naming_Context *new_context = 0;
CosNaming::NamingContext_var result =
make_new_context (orb,
poa,
poa_id,
context_size,
factory,
persistence_directory,
&new_context
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
// Now does this already exist on disk?
ACE_CString file_name(persistence_directory);
file_name += "/";
file_name += poa_id;
TAO_Storable_Base * fl = factory->create_stream(file_name, "r");
if (fl->exists())
{
// Load the map from disk
File_Open_Lock_and_Check flck(new_context, "r" ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
}
else
{
// Since this is a new context, make and empty map in it
ACE_NEW_THROW_EX (new_context->storable_context_,
TAO_Storable_Bindings_Map (context_size,orb),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
new_context->context_ = new_context->storable_context_;
File_Open_Lock_and_Check flck(new_context, "wc" ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CosNaming::NamingContext::_nil ());
new_context->Write(flck.peer());
}
// build the global file name
file_name += "_global";
// Create the stream for the counter used to uniquely creat context names
gfl_ = factory->create_stream(file_name, "crw");
if (gfl_->open() != 0)
{
delete gfl_;
ACE_THROW_RETURN(CORBA::PERSIST_STORE(),
CosNaming::NamingContext::_nil ());
}
// get the counter from disk
TAO_NS_Persistence_Global global;
*gfl_ >> global;
gcounter_ = global.counter();
if(redundant_) gfl_->close();
return result._retn ();
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Unbounded_List_Iterator<ACE_CString>;
template class ACE_Unbounded_List<ACE_CString>;
template class ACE_NS_Node<ACE_CString>;
template class ACE_Auto_Basic_Ptr<TAO_Storable_Naming_Context>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Unbounded_List_Iterator<ACE_CString>
#pragma instantiate ACE_Unbounded_List<ACE_CString>
#pragma instantiate ACE_NS_Node<ACE_CString>
#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Storable_Naming_Context>
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -