📄 ft_replicafactory_i.cpp
字号:
ACE_CATCHANY
{
if (this->test_output_file_ == 0) // ignore if this is a test run
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
"ReplicaFactory: Exception resolving ReplicationManager. Factory will not be registered.\n" );
}
}
ACE_ENDTRY;
}
if ( ! CORBA::is_nil (this->factory_registry_.in ()))
{
size_t roleCount = roles_.size();
for (size_t nRole = 0; nRole < roleCount; ++nRole)
{
const char * roleName = this->roles_[nRole].c_str();
PortableGroup::FactoryInfo info;
info.the_factory = ::PortableGroup::GenericFactory::_narrow(this_obj.in ());
info.the_location.length(1);
info.the_location[0].id = CORBA::string_dup(this->location_);
info.the_criteria.length(1);
info.the_criteria[0].nam.length(1);
info.the_criteria[0].nam[0].id = CORBA::string_dup(PortableGroup::role_criterion);
info.the_criteria[0].val <<= CORBA::string_dup(roleName);
ACE_ERROR (( LM_INFO,
"Factory: %s@%s registering with factory registry\n",
roleName,
location_
));
this->factory_registry_->register_factory(
roleName,
FT_TEST::_tc_TestReplica->id(),
info
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
}
this->registered_ = 1;
}
int identified = 0; // bool
if (this->roles_.size() > 0)
{
this->identity_ = "Factory";
if (this->location_ != 0)
{
this->identity_ += "@";
this->identity_ += this->location_;
}
identified = 1;
}
if (this->ior_output_file_ != 0)
{
if (!identified)
{
this->identity_ = "file:";
this->identity_ += this->ior_output_file_;
// note: don't set identified--ns identity overrides file identitiy
}
result = write_ior (this->ior_output_file_, this->ior_);
}
else
{
if (this->registered_)
{
// if we didn't register with a FactoryRegistry
// and no IOR file specified,
// then always try to register with name service
this->ns_name_ = "FT_ReplicaFactory";
}
}
if (this->ns_name_ != 0)
{
if (!identified)
{
this->identity_ = "name:";
this->identity_ += this->ns_name_;
}
CORBA::Object_var naming_obj =
this->orb_->resolve_initial_references ("NameService" ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
if (CORBA::is_nil(naming_obj.in ())){
ACE_ERROR_RETURN ((LM_ERROR,
"%T %n (%P|%t) Unable to find the Naming Service\n"),
1);
}
this->naming_context_ =
CosNaming::NamingContext::_narrow (naming_obj.in () ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
this->this_name_.length (1);
this->this_name_[0].id = CORBA::string_dup (this->ns_name_);
this->naming_context_->rebind (this->this_name_, this_obj.in() // CORBA::Object::_duplicate(this_obj)
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
}
// if we're testing. Create a replica at startup time
if (this->test_output_file_ != 0)
{
// shouldn't be necessary, but create_replica assumes this
InternalGuard guard (this->internals_);
FT_TestReplica_i * replica = create_replica ("test");
PortableServer::POA_var poa = replica->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
::CORBA::Object_var replica_obj = poa->servant_to_reference(replica ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
::CORBA::String_var replicaIOR = this->orb_->object_to_string(replica_obj.in () ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
write_ior (this->test_output_file_, replicaIOR);
}
return result;
}
int FT_ReplicaFactory_i::fini (ACE_ENV_SINGLE_ARG_DECL)
{
if (this->ior_output_file_ != 0)
{
ACE_OS::unlink (this->ior_output_file_);
this->ior_output_file_ = 0;
}
if (this->ns_name_ != 0)
{
this->naming_context_->unbind (this_name_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
this->ns_name_ = 0;
}
if (registered_)
{
registered_ = 0;
if (this->unregister_by_location_)
{
ACE_ERROR (( LM_INFO,
"%s: unregistering all factories at %s\n",
identity(),
location_
));
PortableGroup::Location location(1);
location.length(1);
location[0].id = CORBA::string_dup(location_);
this->factory_registry_->unregister_factory_by_location (
location
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
}
else
{
size_t roleCount = roles_.size();
for (size_t nRole = 0; nRole < roleCount; ++nRole)
{
const char * roleName = this->roles_[nRole].c_str();
ACE_ERROR (( LM_INFO,
"Factory for: %s@%s unregistering from factory registry\n",
roleName,
location_
));
PortableGroup::Location location(1);
location.length(1);
location[0].id = CORBA::string_dup(location_);
this->factory_registry_->unregister_factory (
roleName,
location
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
}
}
}
return 0;
}
void FT_ReplicaFactory_i::remove_replica(CORBA::ULong id, FT_TestReplica_i * replica)
{
InternalGuard guard (this->internals_);
if (id < this->replicas_.size())
{
if(this->replicas_[id] == replica)
{
replica->fini();
delete replica;
this->replicas_[id] = 0;
this->empty_slots_ += 1;
}
else
{
ACE_ERROR (( LM_ERROR,
"Remove replica %d mismatch.\n",
ACE_static_cast(int, id)
));
}
}
else
{
ACE_ERROR (( LM_ERROR,
"Attempt to remove invalid replica %d. Limit %d.\n",
ACE_static_cast(int, id),
ACE_static_cast(int, this->replicas_.size())
));
}
}
//////////////////////////////////////////
// FT_ReplicaFactory_i CORBA methods
CORBA::Object_ptr FT_ReplicaFactory_i::create_object (
const char * type_id,
const PortableGroup::Criteria & the_criteria,
PortableGroup::GenericFactory::FactoryCreationId_out factory_creation_id
ACE_ENV_ARG_DECL
)
ACE_THROW_SPEC ((
CORBA::SystemException
, PortableGroup::NoFactory
, PortableGroup::ObjectNotCreated
, PortableGroup::InvalidCriteria
, PortableGroup::InvalidProperty
, PortableGroup::CannotMeetCriteria
))
{
METHOD_ENTRY(FT_ReplicaFactory_i::create_object);
ACE_UNUSED_ARG (type_id);
InternalGuard guard (this->internals_);
::TAO::PG_Property_Set decoder (the_criteria);
// boolean, becomes true if a required parameter is missing
int missingParameter = 0;
const char * missingParameterName = 0;
CORBA::Long initialValue = 0;
if (! ::TAO::find (decoder, criterion_initial_value, initialValue) )
{
// not required. Otherwise:
// missingParameter = 1;
// missingParameterName = criterion_initial_value;
}
const char * role = "replica";
if (! ::TAO::find (decoder, PortableGroup::role_criterion, role) )
{
ACE_ERROR((LM_INFO,
"Property \"%s\" not found?\n", PortableGroup::role_criterion
));
// not required. Otherwise:
// missingParameter = 1;
// missingParameterName = PortableGroup::role_criterion;
}
if (missingParameter)
{
ACE_ERROR ((LM_ERROR,
"Throwing 'InvalidCriteria' due to missing %s\n",
missingParameterName
));
ACE_THROW ( PortableGroup::InvalidCriteria() );
}
FT_TestReplica_i * replica = create_replica(role);
if (replica == 0)
{
ACE_ERROR ((LM_ERROR,
"New Replica_i returned NULL. Throwing ObjectNotCreated.\n"
));
ACE_THROW ( PortableGroup::ObjectNotCreated() );
}
ACE_NEW_THROW_EX ( factory_creation_id,
PortableGroup::GenericFactory::FactoryCreationId,
PortableGroup::ObjectNotCreated());
CORBA::ULong factory_id = replica->factory_id();
(*factory_creation_id) <<= factory_id;
ACE_ERROR ((LM_INFO,
"Created %s@%s#%d.\n", role, this->location_, ACE_static_cast(int, factory_id)
));
::CORBA::Object_ptr replica_obj = replica->_default_POA()->servant_to_reference(replica);
METHOD_RETURN(FT_ReplicaFactory_i::create_object) replica_obj->_duplicate(replica_obj ACE_ENV_ARG_PARAMETER);
}
FT_TestReplica_i * FT_ReplicaFactory_i::create_replica(const char * name)
{
// assume mutex is locked
CORBA::ULong factoryId = allocate_id();
FT_TestReplica_i * pFTReplica = 0;
ACE_NEW_NORETURN(pFTReplica, FT_TestReplica_i(
this,
name,
factoryId
));
this->replicas_[factoryId] = pFTReplica;
this->empty_slots_ -= 1;
pFTReplica->init (this->orb_ ACE_ENV_ARG_PARAMETER);
return pFTReplica;
}
void FT_ReplicaFactory_i::delete_object (
const PortableGroup::GenericFactory::FactoryCreationId & factory_creation_id
ACE_ENV_ARG_DECL
)
ACE_THROW_SPEC ((
CORBA::SystemException
, PortableGroup::ObjectNotFound
))
{
METHOD_ENTRY(FT_ReplicaFactory_i::delete_object);
InternalGuard guard (this->internals_);
CORBA::ULong factoryId;
factory_creation_id >>= factoryId;
if (factoryId < this->replicas_.size())
{
if(this->replicas_[factoryId] != 0)
{
this->replicas_[factoryId]->request_quit();
}
else
{
ACE_THROW(::PortableGroup::ObjectNotFound());
}
}
else
{
ACE_THROW(::PortableGroup::ObjectNotFound());
}
METHOD_RETURN(FT_ReplicaFactory_i::delete_object);
}
CORBA::Boolean FT_ReplicaFactory_i::is_alive (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
METHOD_RETURN(FT_ReplicaFactory_i::is_alive)
1;
}
void FT_ReplicaFactory_i::shutdown (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((
CORBA::SystemException
))
{
METHOD_ENTRY(FT_FaultDetectorFactory_i::shutdown);
InternalGuard guard (this->internals_);
shutdown_i ();
this->quit_requested_ = 1;
METHOD_RETURN(FT_FaultDetectorFactory_i::shutdown);
}
///////////////////////////////////
// Template instantiation for
// competence-challenged compilers.
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Vector<FT_TestReplica_i *>;
template class ACE_Guard<ACE_Mutex>;
template class ACE_Vector<ACE_CString>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
# pragma instantiate ACE_Vector<FT_TestReplica_i *>
# pragma instantiate ACE_Guard<ACE_Mutex>
# pragma instantiate ACE_Vector<ACE_CString>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -