📄 ft_faultdetectorfactory_i.cpp
字号:
/* -*- C++ -*- */
//=============================================================================
/**
* @file FT_FaultDetectorFactory_i.cpp
*
* FT_FaultDetectorFactory_i.cpp,v 1.3 2003/12/30 23:53:58 wilson_d Exp
*
* This file is part of Fault Tolerant CORBA.
*
* @author Dale Wilson <wilson_d@ociweb.com>
*/
//=============================================================================
#include "FT_FaultDetectorFactory_i.h"
#include "Fault_Detector_i.h"
#include "ace/Get_Opt.h"
#include "orbsvcs/CosNamingC.h"
#include "orbsvcs/PortableGroup/PG_Property_Set.h"
// Use this macro at the beginning of CORBA methods
// to aid in debugging.
#define METHOD_ENTRY(name) \
ACE_DEBUG (( LM_DEBUG, \
"Enter %s\n", #name \
))
// Use this macro to return from CORBA methods
// to aid in debugging. Note that you can specify
// the return value after the macro, for example:
// METHOD_RETURN(Plugh::plover) xyzzy; is equivalent
// to return xyzzy;
// METHOD_RETURN(Plugh::troll); is equivalent to
// return;
// WARNING: THIS GENERATES TWO STATEMENTS!!! THE FOLLOWING
// will not do what you want it to:
// if (cave_is_closing) METHOD_RETURN(Plugh::pirate) aarrggh;
// Moral: Always use braces.
#define METHOD_RETURN(name) \
ACE_DEBUG (( LM_DEBUG, \
"Leave %s\n", #name \
)); \
return /* value goes here */
//////////////////////////////////////////////////////
// FT_FaultDetectorFactory_i Construction/destruction
TAO::FT_FaultDetectorFactory_i::FT_FaultDetectorFactory_i ()
: orb_ (0)
, poa_ (0)
, objectId_ (0)
, ior_output_file_ (0)
, ns_name_ (0)
, naming_context_ (0)
, this_name_ (1)
, quit_on_idle_ (0)
, domain_ (CORBA::string_dup("default_domain"))
, location_ (1)
, notifier_ (0)
, rm_register_ (1)
, replication_manager_ (0)
, registered_ (0)
, factory_registry_ (0)
, identity_ ("")
, empty_slots_ (0)
, quit_requested_ (0)
{
this->location_.length(1);
this->location_[0].id = CORBA::string_dup("default_location");
}
TAO::FT_FaultDetectorFactory_i::~FT_FaultDetectorFactory_i ()
{
//scope the guard
{
InternalGuard guard (this->internals_);
// be sure all detectors are gone
// before this object disappears
shutdown_i ();
}
ACE_DECLARE_NEW_ENV;
fini (ACE_ENV_SINGLE_ARG_PARAMETER);
this->threadManager_.close ();
}
////////////////////////////////////////////
// FT_FaultDetectorFactory_i private methods
void TAO::FT_FaultDetectorFactory_i::shutdown_i()
{
// assume mutex is locked
for (size_t nDetector = 0; nDetector < this->detectors_.size(); ++nDetector)
{
Fault_Detector_i * detector = this->detectors_[nDetector];
if (detector != 0)
{
detector->request_quit();
}
}
}
int TAO::FT_FaultDetectorFactory_i::write_ior()
{
int result = -1;
FILE* out = ACE_OS::fopen (this->ior_output_file_, "w");
if (out)
{
ACE_OS::fprintf (out, "%s", ACE_static_cast(const char *, this->ior_));
ACE_OS::fclose (out);
result = 0;
}
else
{
ACE_ERROR ((LM_ERROR,
"Open failed for %s\n", ior_output_file_
));
}
return result;
}
//////////////////////////////////////////////////////
// FT_FaultDetectorFactory_i public, non-CORBA methods
int TAO::FT_FaultDetectorFactory_i::parse_args (int argc, char * argv[])
{
ACE_Get_Opt get_opts (argc, argv, "d:l:o:qr");
int c;
while ((c = get_opts ()) != -1)
{
switch (c)
{
case 'd':
{
this->domain_ = CORBA::string_dup (get_opts.opt_arg ());
break;
}
case 'l':
{
this->location_.length(1);
this->location_[0].id = CORBA::string_dup(get_opts.opt_arg ());
break;
}
case 'o':
{
this->ior_output_file_ = get_opts.opt_arg ();
break;
}
case 'r':
{
this->rm_register_ = ! this->rm_register_;
break;
}
case 'q':
{
this->quit_on_idle_ = 1;
break;
}
case '?':
// fall thru
default:
ACE_ERROR_RETURN ((LM_ERROR,
"usage: %s"
" -d <FT Domain>"
" -l <FT Location>"
" -o <iorfile>"
" -r <disable registering with replication manager>"
" -q{uit on idle}"
"\n",
argv [0]),
-1);
break;
}
}
// Indicates sucessful parsing of the command line
return 0;
}
const char * TAO::FT_FaultDetectorFactory_i::identity () const
{
return this->identity_.c_str();
}
int TAO::FT_FaultDetectorFactory_i::idle (int & result ACE_ENV_ARG_DECL_NOT_USED)
{
ACE_UNUSED_ARG (result);
int quit = this->quit_requested_;
if (quit == 0 && this->detectors_.size() == this->empty_slots_)
{
// don't quitOnIdle until something has happened
if (this->quit_on_idle_ && this->empty_slots_ != 0)
{
ACE_ERROR (( LM_INFO,
"FaultDetectorFactory exits due to quit on idle option.\n"
));
quit = 1;
}
}
return quit;
}
int TAO::FT_FaultDetectorFactory_i::init (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL)
{
int result = 0;
this->orb_ = CORBA::ORB::_duplicate (orb);
// Use the ROOT POA for now
CORBA::Object_var poa_object =
this->orb_->resolve_initial_references (TAO_OBJID_ROOTPOA
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
if (CORBA::is_nil (poa_object.in ()))
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT (" (%P|%t) Unable to initialize the POA.\n")),
-1);
// Get the POA object.
this->poa_ =
PortableServer::POA::_narrow (poa_object.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
if (CORBA::is_nil(this->poa_.in ()))
{
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT (" (%P|%t) Unable to narrow the POA.\n")),
-1);
}
PortableServer::POAManager_var poa_manager =
this->poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
// Register with the POA.
this->objectId_ = this->poa_->activate_object (this ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
// find my IOR
CORBA::Object_var this_obj =
this->poa_->id_to_reference (objectId_.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
this->ior_ = this->orb_->object_to_string (this_obj.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
this->identity_ = "FaultDetectorFactory";
///////////////////////////////
// Register with ReplicationManager
if (this->rm_register_)
{
ACE_TRY_NEW_ENV
{
CORBA::Object_var rm_obj = orb->resolve_initial_references("ReplicationManager" ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
this->replication_manager_ = ::FT::ReplicationManager::_narrow(rm_obj.in() ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (!CORBA::is_nil (replication_manager_.in ()))
{
// capture the default notifier
this->notifier_ = this->replication_manager_->get_fault_notifier (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
// register with ReplicationManager::RegistrationFactory
PortableGroup::Criteria criteria(0);
this->factory_registry_ = this->replication_manager_->get_factory_registry (criteria ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (! CORBA::is_nil(factory_registry_.in ()))
{
PortableGroup::FactoryInfo info;
info.the_factory = ::PortableGroup::GenericFactory::_narrow(this_obj.in ());
info.the_location = 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(FT::FAULT_DETECTOR_ROLE_NAME);
ACE_DEBUG ((LM_DEBUG,
"FaultDetector registering with ReplicationManager.\n"
));
this->factory_registry_->register_factory(
FT::FAULT_DETECTOR_ROLE_NAME,
FT::FAULT_DETECTOR_ROLE_NAME,
info
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
ACE_DEBUG ((LM_DEBUG,
"FaultDetector Registration complete.\n"
));
this->registered_ = 1;
}
else
{
ACE_ERROR ((LM_ERROR,"FaultNotifier: ReplicationManager doesn't have RegistrationFactory.\n" ));
}
}
else
{
ACE_ERROR ((LM_ERROR,"FaultNotifier: Can't resolve ReplicationManager, It will not be registered.\n" ));
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
"ReplicaFactory: Exception resolving ReplicationManager. Factory will not be registered.\n" );
}
ACE_ENDTRY;
}
else
{
ACE_DEBUG ((LM_DEBUG,
"FaultNotifier: ReplicationManager registration disabled.\n"
));
}
if (this->ior_output_file_ != 0)
{
this->identity_ = "file:";
this->identity_ += this->ior_output_file_;
write_ior();
}
if (this->ns_name_ != 0)
{
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -