📄 imr_activator_i.cpp
字号:
// "ImR_Activator_i.cpp,v 1.16 2003/11/12 16:31:27 dhinton Exp"
#include "ImR_Activator_i.h"
#include "INS_Locator.h"
#include "Iterator.h"
#include "Activator_Options.h"
#include "tao/PortableServer/Default_Acceptor_Filter.h"
#include "tao/PortableServer/ImR_LocatorC.h"
#include "tao/Acceptor_Registry.h"
#include "tao/Thread_Lane_Resources.h"
#include "tao/ORB_Core.h"
#include "tao/MProfile.h"
#include "tao/Profile.h"
#include "tao/default_ports.h"
#include "ace/Auto_Ptr.h"
#include "ace/OS_NS_netdb.h"
#include "ace/OS_NS_sys_time.h"
ACE_RCSID (ImplRepo_Service,
ImR_Activator_i,
"ImR_Activator_i.cpp,v 1.16 2003/11/12 16:31:27 dhinton Exp")
ImR_Activator_i::ImR_Activator_i (void)
: registration_token_(0)
{
char host_name[MAXHOSTNAMELEN + 1];
ACE_OS::hostname (host_name, MAXHOSTNAMELEN);
name_ = host_name;
}
char *
ImR_Activator_i::find_ior (const char* oname ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
{
// We assume that the first part of the object name is the poa name.
// So we would think that a name of foo/bar means that the POA name
// is foo.
ACE_CString object_name(oname);
ssize_t pos = object_name.find ('/');
if (pos == ACE_CString::npos)
pos = ACE_static_cast (ssize_t, object_name.length ());
ACE_CString poa_name;
poa_name.set (object_name.fast_rep (), pos, 1);
ACE_CString endpoint;
ACE_TRY
{
// Activate the server and return the object reference.
endpoint = this->activate_server_with_startup (poa_name.c_str (), 1
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_THROW_RETURN (ImplementationRepository::NotFound (), 0);
}
ACE_ENDTRY;
ACE_CHECK_RETURN (0);
// Have to do this so it is null terminated
ACE_CString object_name2 (object_name.fast_rep (),
object_name.length ());
ACE_CString ior = endpoint;
ior += object_name2;
if (OPTIONS::instance()->debug () >= 1)
ACE_DEBUG ((LM_DEBUG, "ImR Activator: Found IOR"
" for %s is %s\n", oname, endpoint.c_str()));
return CORBA::string_dup (ior.c_str ());
}
// Starts the server defined by the POA name <server> if it is
// not already started and if it can be started.
void
ImR_Activator_i::activate_server (const char *server ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::NotFound,
ImplementationRepository::CannotActivate))
{
// Since this is called through the Admin interface, we should ignore some
// of the activation modes. Also ignore the return value.
this->activate_server_i (server, 0 ACE_ENV_ARG_PARAMETER);
if (OPTIONS::instance()->debug () >= 1)
ACE_DEBUG ((LM_DEBUG, "ImR Activator: Activate server %s.\n", server));
}
char *
ImR_Activator_i::activate_server_with_startup (const char *server,
int check_startup
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::NotFound,
ImplementationRepository::CannotActivate))
{
if (OPTIONS::instance()->debug () >= 1)
{
ACE_DEBUG ((LM_DEBUG, "ImR Activator: Activate server"
" %s. Check startup=%d.\n", server, check_startup));
}
return this->activate_server_i (server, check_startup ACE_ENV_ARG_PARAMETER);
}
// Activates the server and returns the IOR of the object that is
// activated.
char *
ImR_Activator_i::activate_server_i(const char *server,
int check_startup
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::NotFound,
ImplementationRepository::CannotActivate))
{
CORBA::ORB_var orb = OPTIONS::instance ()->orb ();
int start = 0;
ACE_CString server_object_ior, partial_ior;
ACE_CString logical, startup, working;
ImplementationRepository::EnvironmentList environment;
ImplementationRepository::ActivationMode activation;
// Get the startup information for the server in question.
if (this->repository_.get_startup_info (server,
logical,
startup,
environment,
working,
activation) != 0)
{
ACE_ERROR ((LM_ERROR,
"ImR Activator: Cannot find startup info for server <%s>\n",
server));
ACE_THROW_RETURN(ImplementationRepository::NotFound (), 0);
}
// Find out if it is already running
if (this->repository_.get_running_info (server,
partial_ior,
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_RETURN (ImplementationRepository::NotFound (), 0);
}
// Check to see if there is one running (if there is a server_object_ior)
if (server_object_ior.length () != 0)
{
// It is running
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_RETURN (ImplementationRepository::NotFound (), 0);
}
// Check to see if we can ping it
server_object->ping (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
// If we got an exception, then we have to restart it.
start = 1;
}
ACE_ENDTRY;
}
else
{
start = 1;
}
if (start == 1)
{
// Make sure the activation allows us to start it up.
if (activation == ImplementationRepository::MANUAL && check_startup)
ACE_THROW_RETURN (CORBA::TRANSIENT (
CORBA::SystemException::_tao_minor_code (TAO_IMPLREPO_MINOR_CODE,
0),
CORBA::COMPLETED_NO),
0);
this->start_server_i (server);
ACE_CHECK_RETURN (0);
}
// Get the latest information about where the server is running and
// it's IOR
if (this->repository_.get_running_info (server,
partial_ior,
server_object_ior) != 0)
{
ACE_ERROR ((LM_ERROR,
"ImR Activator: Can not resolve server <%s>\n",
server));
}
if (activation == ImplementationRepository::PER_CLIENT && check_startup)
{
if (this->repository_.update (server, "", "") != 0)
{
ACE_ERROR ((LM_ERROR,
"ImR Activator: Could not update information for server <%s>\n",
server));
ACE_THROW_RETURN (ImplementationRepository::NotFound (), 0);
}
}
return CORBA::string_dup (partial_ior.c_str ());
}
// Starts the server process
void
ImR_Activator_i::start_server_i (const char *server ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
ImplementationRepository::NotFound,
ImplementationRepository::CannotActivate))
{
CORBA::ORB_var orb = OPTIONS::instance ()->orb ();
int spawned_pid = 0;
ACE_CString logical, startup, working;
ImplementationRepository::EnvironmentList environment;
ImplementationRepository::ActivationMode activation;
// Get the server startup information.
if (this->repository_.get_startup_info (server,
logical,
startup,
environment,
working,
activation) != 0)
{
// In case of failure, print it out.
ACE_ERROR ((LM_ERROR,
"ImR Activator: Cannot find startup info for server <%s>\n",
server));
// And, throw the exception.
ACE_THROW (ImplementationRepository::NotFound ());
ACE_CHECK;
}
// Check to see if it is already starting up
int startup_val = this->repository_.starting_up (server, 1);
if (startup_val == -1)
{
ACE_ERROR ((LM_ERROR,
"ImR Activator: Cannot find startup info for server <%s>\n",
server));
ACE_THROW (ImplementationRepository::NotFound ());
ACE_CHECK;
}
// startup_val will be zero only if the server is running.
if (startup_val == 0)
{
if (startup.length () == 0)
{
// If there is no startup information, throw an exception
ACE_ERROR ((LM_ERROR,
"ImR Activator: No startup information for server <%s>\n",
server));
ACE_THROW (ImplementationRepository::CannotActivate
(CORBA::string_dup ("No startup information")));
ACE_CHECK;
}
if (OPTIONS::instance()->debug () >= 1)
ACE_DEBUG ((LM_DEBUG, "ImR Activator: Starting server %s\n", server));
// Set the Process parameters.
ACE_Process_Options proc_opts;
proc_opts.command_line (startup.c_str ());
proc_opts.working_directory (working.c_str ());
proc_opts.handle_inheritence (0);
// Win32 does not support the CLOSE_ON_EXEC semantics for sockets
// the way unix does, so in order to avoid having the child process
// hold the listen socket open, we force the child to inherit no
// handles. This includes stdin, stdout, logs, etc.
for (CORBA::ULong i = 0; i < environment.length(); ++i)
proc_opts.setenv (environment[i].name.in (), environment[i].value.in ());
// Spawn the proces.
spawned_pid = this->process_mgr_.spawn (proc_opts);
if (spawned_pid == ACE_INVALID_PID)
{
// If invalid PID..
ACE_ERROR ((LM_ERROR,
"ImR Activator: Cannot activate server <%s> using <%s>\n",
server,
startup.c_str ()));
// and throw the exception
ACE_THROW (ImplementationRepository::CannotActivate
(CORBA::string_dup ("Process Creation Failed")));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -