📄 imr_activator_i.cpp
字号:
this->root_poa_->destroy (1, 1 ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Server_i::init");
ACE_RE_THROW;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (-1);
return 0;
}
int
ImR_Activator_i::run (ACE_ENV_SINGLE_ARG_DECL)
{
CORBA::ORB_var orb = OPTIONS::instance ()->orb ();
PortableServer::POAManager_var poa_manager =
this->imr_poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
auto_ptr<Server_Repository::HASH_IMR_MAP::ITERATOR>
server_iter (this->repository_.new_iterator ());
if (server_iter.get () == 0)
ACE_THROW_RETURN (CORBA::NO_MEMORY (), -1);
Server_Repository::HASH_IMR_MAP::ENTRY *server_entry;
if (OPTIONS::instance()->debug () >= 2)
ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::run: Activating AUTO_START servers\n"));
// For each of the entries in the Server_Repository, get the startup
// information and activate the servers, if they are not already
// running.
while (!server_iter->done ())
{
server_iter->next (server_entry);
server_iter->advance ();
ACE_CString logical, server, command_line, working_directory, location;
ImplementationRepository::ActivationMode activation
= ImplementationRepository::NORMAL;
ImplementationRepository::EnvironmentList environment_vars ;
server_entry->int_id_->get_startup_info (logical,
command_line,
environment_vars,
working_directory,
activation);
ACE_TRY
{
if (activation == ImplementationRepository::AUTO_START)
this->activate_server (server_entry->ext_id_.c_str ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
if (OPTIONS::instance()->debug () >= 2)
{
ACE_DEBUG ((LM_DEBUG,
"ImR_Activator_i::run: AUTO_START Could not activate <%s>\n",
server_entry->ext_id_.c_str ()));
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "AUTO_START");
}
// Ignore exceptions
}
ACE_ENDTRY;
}
orb->run (0 ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
return 0;
}
ImR_Activator_i::~ImR_Activator_i (void)
{
}
// Returns the startup information for a server
void
ImR_Activator_i::find (const char *server,
ImplementationRepository::ServerInformation_out info
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::NotFound))
{
ACE_CString logical, command_line, working_directory;
ACE_CString location, server_object_ior;
ImplementationRepository::EnvironmentList environment_vars;
ImplementationRepository::ActivationMode activation;
ACE_NEW_THROW_EX (info,
ImplementationRepository::ServerInformation,
CORBA::NO_MEMORY ());
ACE_CHECK;
// Get the information from the server repository.
if (this->repository_.get_startup_info (server,
logical,
command_line,
environment_vars,
working_directory,
activation) != 0)
ACE_THROW (ImplementationRepository::NotFound ());
// Get the running information which would include the location
// where the server is running and its IOR.
if (this->repository_.get_running_info (server,
location,
server_object_ior) != 0)
{
ACE_THROW (ImplementationRepository::NotFound ());
}
// Fill in <info>.
info->logical_server = CORBA::string_dup (logical.c_str ());
info->server = CORBA::string_dup (server);
info->startup.command_line = CORBA::string_dup (command_line.c_str ());
info->startup.environment = environment_vars;
info->startup.working_directory = CORBA::string_dup (working_directory.c_str ());
info->startup.activation = activation;
info->startup.activator = this->name_.c_str();
info->location = CORBA::string_dup (location.c_str ());
if (OPTIONS::instance()->debug () >= 1)
ACE_DEBUG ((LM_DEBUG, "ImR Activator: Found server %s.\n", server));
}
// Used to access the list of servers registered. May also return an
// iterator which can be used to access more than <how_many> of them.
void
ImR_Activator_i::list (CORBA::ULong how_many,
ImplementationRepository::ServerInformationList_out server_list,
ImplementationRepository::ServerInformationIterator_out server_iterator
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
if (OPTIONS::instance()->debug () >= 1)
ACE_DEBUG ((LM_DEBUG, "ImR Activator: List servers.\n"));
// Initialize the out variables, so if we return early, they will
// not be dangling.
server_iterator =
ImplementationRepository::ServerInformationIterator::_nil ();
ACE_NEW_THROW_EX (server_list,
ImplementationRepository::ServerInformationList (0),
CORBA::NO_MEMORY ());
// Get a new iterator
auto_ptr<Server_Repository::HASH_IMR_MAP::ITERATOR> server_iter (this->repository_.new_iterator ());
// Check for a memory error.
if (server_iter.get () == 0)
ACE_THROW (CORBA::NO_MEMORY ());
// Number of servers that will go into the server_list.
CORBA::ULong n;
if (this->repository_.get_repository_size () > how_many)
n = how_many;
else
n = ACE_static_cast (CORBA::ULong,
this->repository_.get_repository_size ());
// Now copy over to the server list.
server_list->length (n);
Server_Repository::HASH_IMR_MAP::ENTRY *server_entry;
if (OPTIONS::instance()->debug () >= 2)
ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::list: Filling ServerList with %d servers\n", n));
for (CORBA::ULong i = 0; i < n; i++)
{
server_iter->next (server_entry);
server_iter->advance ();
ACE_CString logical, server, command_line, working_directory;
ACE_CString location, server_ior;
ImplementationRepository::EnvironmentList environment_vars;
ImplementationRepository::ActivationMode activation =
ImplementationRepository::NORMAL;
server_entry->int_id_->get_running_info (location, server_ior);
server_entry->int_id_->get_startup_info (logical,
command_line,
environment_vars,
working_directory,
activation);
server_list[i].logical_server = CORBA::string_dup (logical.c_str ());
server_list[i].server = CORBA::string_dup (server_entry->ext_id_.c_str ());
server_list[i].startup.command_line = CORBA::string_dup (command_line.c_str ());
server_list[i].startup.environment = environment_vars;
server_list[i].startup.working_directory = CORBA::string_dup (working_directory.c_str ());
server_list[i].startup.activation = activation;
server_list[i].startup.activator = CORBA::string_dup(this->name_.c_str());
server_list[i].location = CORBA::string_dup (location.c_str ());
}
// Now work on the iterator
// Only set up an iterator if we need to
if (this->repository_.get_repository_size () > how_many)
{
if (OPTIONS::instance()->debug () >= 2)
ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::list: Creating ServerInformationIterator\n"));
// Create an imr_iter and give it the server_iter pointer
ImR_Iterator *imr_iter;
ACE_NEW_THROW_EX (imr_iter,
ImR_Iterator (server_iter.release (), this->root_poa_.in ()),
CORBA::NO_MEMORY ());
ACE_TRY
{
PortableServer::ObjectId_var id =
this->root_poa_->activate_object (imr_iter ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
server_iterator = imr_iter->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_RE_THROW;
}
ACE_ENDTRY;
ACE_CHECK;
}
}
/**
* Attempt to gracefully shut down the server, if that fails, will try
* to do it ungracefully.
*/
void
ImR_Activator_i::shutdown_server (const char *server ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::NotFound))
{
if (OPTIONS::instance()->debug () >= 1)
ACE_DEBUG ((LM_DEBUG, "ImR Activator: Shutting down server.\n"));
CORBA::ORB_var orb = OPTIONS::instance ()->orb ();
ACE_CString server_object_ior, location;
// Find out if it is already running
if (this->repository_.get_running_info (server, location, server_object_ior) != 0)
{
// If we had problems getting the server_object_ior, probably meant that
// there is no <server> registered
ACE_ERROR ((LM_ERROR,
"ImR Activator: Cannot find ServerObject IOR for server <%s>\n",
server));
ACE_THROW (ImplementationRepository::NotFound ());
}
// Check to see if there is one running (if there is a server_object_ior)
if (server_object_ior.length () != 0)
{
// It is running, so shut it down
ACE_TRY
{
CORBA::Object_var object =
orb->string_to_object (server_object_ior.c_str () ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
ImplementationRepository::ServerObject_var server_object =
ImplementationRepository::ServerObject::_narrow (object.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (CORBA::is_nil (server_object.in ()))
{
ACE_ERROR ((LM_ERROR,
"ImR Activator: Invalid ServerObject IOR: <%s>\n",
server_object_ior.c_str ()));
ACE_THROW (ImplementationRepository::NotFound ());
}
server_object->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
// This removes running info from repository
if (this->repository_.update (server, "", "") != 0)
{
ACE_ERROR ((LM_ERROR,
"ImR Activator: Could not update information for unknown server <%s>\n",
server));
ACE_THROW (ImplementationRepository::NotFound ());
}
}
ACE_CATCHANY
{
ACE_RE_THROW;
}
ACE_ENDTRY;
}
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class auto_ptr<ACE_Hash_Map_Iterator_Ex<ACE_CString, Server_Info *,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> >;
template class ACE_Auto_Basic_Ptr<ACE_Hash_Map_Iterator_Ex<ACE_CString, Server_Info *,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> >;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate auto_ptr<ACE_Hash_Map_Iterator_Ex<ACE_CString, Server_Info *,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> >
#pragma instantiate ACE_Auto_Basic_Ptr<ACE_Hash_Map_Iterator_Ex<ACE_CString, Server_Info *,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> >
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -