summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/ImplRepo_Service/ImR_Activator_i.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/ImplRepo_Service/ImR_Activator_i.cpp')
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/ImR_Activator_i.cpp1516
1 files changed, 283 insertions, 1233 deletions
diff --git a/TAO/orbsvcs/ImplRepo_Service/ImR_Activator_i.cpp b/TAO/orbsvcs/ImplRepo_Service/ImR_Activator_i.cpp
index f48de6daf17..c2f07a4fa3d 100644
--- a/TAO/orbsvcs/ImplRepo_Service/ImR_Activator_i.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/ImR_Activator_i.cpp
@@ -2,1338 +2,388 @@
#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"
+#include "ace/Reactor.h"
+#include "ace/ARGV.h"
#include "ace/OS_NS_unistd.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/os_include/os_netdb.h"
-ACE_RCSID (ImplRepo_Service,
- ImR_Activator_i,
- "$Id$")
-
-ImR_Activator_i::ImR_Activator_i (void)
- : registration_token_(0)
+static ACE_CString getActivatorName()
{
- char host_name[MAXHOSTNAMELEN + 1];
+ char host_name[MAXHOSTNAMELEN];
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));
+ return ACE_CString (host_name);
}
-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))
+ImR_Activator_i::ImR_Activator_i (void)
+: registration_token_(0)
+, debug_(0)
+, name_(getActivatorName())
{
- 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))
+int
+ImR_Activator_i::init_with_orb(CORBA::ORB_ptr orb, const Options& opts ACE_ENV_ARG_DECL)
{
- 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);
- }
+ ACE_ASSERT(! CORBA::is_nil(orb));
+ orb_ = CORBA::ORB::_duplicate(orb);
+ debug_ = opts.debug();
- // 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)
+ ACE_TRY
{
- if (this->repository_.update (server, "", "") != 0)
+ if (this->debug_ > 0)
+ ACE_DEBUG((LM_DEBUG, "ImR Activator: Contacting ImplRepoService...\n"));
+
+ // First, resolve the ImR Locator, without this we can go no further
+ CORBA::Object_var obj =
+ orb_->resolve_initial_references ("ImplRepoService" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (CORBA::is_nil(obj.in ()))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to resolve_initial_references \"ImplRepoService\"\n"), -1);
+ }
+ locator_ = ImplementationRepository::Locator::_narrow (obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ACE_ASSERT(! CORBA::is_nil(locator_.in()));
+
+ // Create a new poa and poa manager
+ obj = orb->resolve_initial_references ("RootPOA" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ACE_ASSERT(! CORBA::is_nil(obj.in()));
+ this->root_poa_ = PortableServer::POA::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ACE_ASSERT(! CORBA::is_nil(this->root_poa_.in()));
+
+ // Note : There is no point in making the activator use a persistent POA, because
+ // it will always re-register with the ImR on startup anyway.
+ CORBA::PolicyList policies;
+ this->imr_poa_ = this->root_poa_->create_POA("ImR_Activator",
+ PortableServer::POAManager::_nil(), policies ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ACE_ASSERT(! CORBA::is_nil(this->imr_poa_.in()));
+
+ // Activate ourself
+ PortableServer::ObjectId_var id =
+ this->imr_poa_->activate_object(this ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ obj = this->imr_poa_->id_to_reference (id.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ImplementationRepository::Activator_var activator =
+ ImplementationRepository::Activator::_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ ACE_ASSERT(! CORBA::is_nil(activator.in()));
+
+ CORBA::String_var ior = this->orb_->object_to_string(activator.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (this->debug_ > 0)
+ ACE_DEBUG((LM_DEBUG, "ImR Activator: Starting %s\n", name_.c_str()));
+
+ // initialize our process manager.
+ // This requires a reactor that has signal handling.
+ ACE_Reactor *reactor = ACE_Reactor::instance ();
+ if (reactor != 0)
+ {
+ if (this->process_mgr_.open (ACE_Process_Manager::DEFAULT_SIZE, reactor) == -1)
{
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Could not update information for server <%s>\n",
- server));
- ACE_THROW_RETURN (ImplementationRepository::NotFound (), 0);
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "The ACE_Process_Manager didnt get initialized\n"), -1);
}
- }
-
- 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")));
- ACE_CHECK;
- }
- else if (OPTIONS::instance ()->debug () >= 2)
- ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::start_server_i: Process ID is %d\n", spawned_pid));
- }
-
- // Now that the server has been started up, we need to go back into the event
- // loop so we can get the reponse or handle other requests
- TAO_ORB_Core *orb_core = orb->orb_core ();
-
- int starting_up;
-
- ACE_Time_Value timeout = OPTIONS::instance ()->startup_timeout ();
-
- // We will wait till the timeout period for the server to get
- // started up. The starting_up value will be made zero when the
- // server is up and running. And, thats the condition that we are
- // checking.
- while ((starting_up = this->repository_.starting_up (server)) == 1)
- {
- if (OPTIONS::instance()->debug () >= 2)
- ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::activate_server: Going into handle_events\n"));
-
- // Will wait for the specified timeout.
- int result = orb_core->reactor ()->handle_events (&timeout);
-
- if (result == 0 && timeout == ACE_Time_Value::zero)
- {
- // The timer is out and we are still in the while loop which
- // means that the server is not activated. Set the
- // starting_up_ value to '0' and
- this->repository_.starting_up (server, 0);
-
- // print the same.
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Cannot activate server <%s> using <%s>, "
- "terminating it.\n",
- server,
- startup.c_str ()));
-
- // Kill the server
- this->process_mgr_.terminate (spawned_pid);
-
- ACE_THROW(ImplementationRepository::CannotActivate
- (CORBA::string_dup ("Timeout")));
- ACE_CHECK;
- }
}
- // If the control comes here, it means that the server got activated.
- if (OPTIONS::instance()->debug () >= 2)
- ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::activate_server: Got out of handle_events loop\n"));
+ // Register with the ImR Locator
+ this->registration_token_ =
+ locator_->register_activator (name_.c_str(), activator.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
- // Check to see if it disappeared on us
- if (starting_up == -1)
- {
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Cannot find startup info for server <%s>\n",
- server));
-
- ACE_THROW (ImplementationRepository::NotFound ());
- ACE_CHECK;
- }
-
- // Now check to see if it is responding yet.
- int ready_error = this->ready_check (server);
-
- if (ready_error < 0)
- {
- // We got an error in ready_check, so shutdown the server and
- // throw an exception
-
- this->process_mgr_.terminate (spawned_pid);
-
- if (ready_error == -1)
- {
- ACE_THROW (ImplementationRepository::CannotActivate
- (CORBA::string_dup ("Timeout while pinging for readiness")));
- }
- else
- {
- ACE_THROW (ImplementationRepository::CannotActivate
- (CORBA::string_dup ("Unknown error")));
- }
- }
-}
-
-
-// ready_check will continuously ping a server and either return when it
-// responds to the ping or return -1 if it times out.
-int
-ImR_Activator_i::ready_check (const char *server)
- ACE_THROW_SPEC ((CORBA::SystemException,
- ImplementationRepository::NotFound))
-{
- CORBA::ORB_var orb = OPTIONS::instance ()->orb ();
-
- ACE_CString ping_object_ior, location;
- ImplementationRepository::ServerObject_var ping_object;
-
- ACE_DECLARE_NEW_CORBA_ENV;
-
- // <end> is the end of the window where we can get a response before
- // timing out
- ACE_Time_Value end = ACE_OS::gettimeofday ()
- + OPTIONS::instance ()->startup_timeout ();
-
- // Get the ior for the "ping" object for the server
- if (this->repository_.get_running_info (server,
- location,
- ping_object_ior) != 0)
- {
- // If get_running_info fails, something weird must have happened.
- // Maybe it was removed after we started it up, but before we got here.
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Cannot find ServerObject IOR for server <%s>\n",
- server));
-
- ACE_THROW_RETURN (
- ImplementationRepository::NotFound (),
- -2
- );
- }
-
- // Narrow the ping object
-
- ACE_TRY_EX (ping1)
- {
- // Get the Object
- CORBA::Object_var object =
- orb->string_to_object (ping_object_ior.c_str () ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK_EX (ping1);
+ // Activate the manager for the root poa
+ PortableServer::POAManager_var poaman =
+ this->root_poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ poaman->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
- // Narrow it down to the correct interface
- ping_object =
- ImplementationRepository::ServerObject::_narrow (object.in ()
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK_EX (ping1);
+ // Activate the manager for the activator poa
+ poaman = this->imr_poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ poaman->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
- if (CORBA::is_nil (ping_object.in ()))
- {
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Invalid ServerObject IOR: <%s>\n",
- ping_object_ior.c_str ()));
-
- ACE_THROW_RETURN (
- ImplementationRepository::NotFound (),
- -2
- );
- }
-
- }
- ACE_CATCHANY
- {
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Cannot activate server <%s>, "
- "terminating it (Server Ping Object failed).\n",
- server));
-
- return -2;
- }
- ACE_ENDTRY;
- ACE_CHECK_RETURN (-2);
-
- // Now ping it until we get a response.
- while (ACE_OS::gettimeofday () < end)
- {
- ACE_TRY_EX (ping2);
- {
- if (OPTIONS::instance()->debug () >= 2)
- ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::ready_check: ping server.\n"));
-
- ping_object->ping (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_TRY_CHECK_EX (ping2);
-
- if (OPTIONS::instance()->debug () >= 2)
- ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::ready_check: Pinged Server OK\n"));
-
- // If we got here, we successfully pinged, therefore we
- // can exit the function.
- return 0;
- }
- ACE_CATCHANY // todo : I doubt we really want to retry on all exceptions. Maybe just transient?
- {
- // Ignore the exception
- if (OPTIONS::instance()->debug () >= 2)
- ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::ready_check: Server not ready (Exception)\n"));
- }
- ACE_ENDTRY;
- ACE_CHECK_RETURN (-2);
-
- // Sleep between sending pings.
- ACE_OS::sleep (OPTIONS::instance ()->ping_interval ());
- }
-
- // If we fall out here, that means we didn't get a response before timing
- // out, so return an error.
- return -1;
-}
-
-
-// Adds an entry to the Repository about this <server>
-
-void
-ImR_Activator_i::register_server (
- const char *server,
- const ImplementationRepository::StartupOptions &options
- ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException,
- ImplementationRepository::AlreadyRegistered,
- ImplementationRepository::NotFound
- ))
-{
- if (OPTIONS::instance ()->readonly ())
- {
- ACE_THROW (CORBA::NO_PERMISSION ());
- }
-
- if (OPTIONS::instance ()->debug () >= 1)
- ACE_DEBUG((LM_DEBUG, "Imr Activator: Register server %s.\n", server));
-
- if (OPTIONS::instance ()->debug () >= 2)
+ if (this->debug_ > 1)
{
ACE_DEBUG ((LM_DEBUG,
- "ImR_Activator_i::register_server:\nServer: %s\n"
- "Command Line: %s\n"
- "Working Directory: %s\n"
- "Activation Mode: %s\n\n",
- server,
- options.command_line.in (),
- options.working_directory.in (),
- OPTIONS::instance ()->convert_str (options.activation)));
-
- for (CORBA::ULong i = 0; i < options.environment.length (); ++i)
- ACE_DEBUG ((LM_DEBUG, "Environment variable %s=%s\n",
- options.environment[i].name.in (),
- options.environment[i].value.in ()));
+ "ImR_Activator_i::init: The Activator IOR is: <%s>\n", ior.in ()));
}
- // Add the server
- int status = this->repository_.add (server,
- "",
- options.command_line.in (),
- options.environment,
- options.working_directory.in (),
- options.activation);
-
- if (status == 1)
- {
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Server %s Already Registered!\n",
- server));
- ACE_THROW (ImplementationRepository::AlreadyRegistered ());
- }
-}
-
-
-// Updates the entry in the Repository about this <server> or adds it
-// if necessary.
-
-void
-ImR_Activator_i::reregister_server (const char *server,
- const ImplementationRepository::StartupOptions &options
- ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException,
- ImplementationRepository::AlreadyRegistered,
- ImplementationRepository::NotFound
- ))
-{
- if (OPTIONS::instance ()->debug () >= 1)
- ACE_DEBUG((LM_DEBUG, "ImR Activator: Reregister server %s.\n", server));
-
- if (OPTIONS::instance ()->readonly ())
+ // The last thing we do is write out the ior so that a test program can assume
+ // that the activator is ready to go as soon as the ior is written.
+ if (opts.ior_filename().length() > 0)
{
- ACE_THROW (CORBA::NO_PERMISSION ());
+ FILE* fp = ACE_OS::fopen(opts.ior_filename().c_str(), "w");
+ if (fp == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "ImR Activator: Could not open file: %s\n", opts.ior_filename().c_str()), -1);
+ }
+ ACE_OS::fprintf(fp, "%s", ior.in());
+ ACE_OS::fclose(fp);
}
-
- // Get current starting up value
- int starting_up = this->repository_.starting_up (server);
-
- // Get ready to save the running info
- ACE_CString location;
- ACE_CString server_object_ior;
-
- // Only save the running info if it's still running before we remove it.
- ACE_TRY
- {
- // Get the current running information
- ACE_CString ping_location;
- ACE_CString ping_object_ior;
- this->repository_.get_running_info (server,
- ping_location,
- ping_object_ior);
-
- // Narrow the server
- CORBA::ORB_var orb = OPTIONS::instance ()->orb ();
- CORBA::Object_var object =
- orb->string_to_object (ping_object_ior.c_str () ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- ImplementationRepository::ServerObject_var ping_object =
- ImplementationRepository::ServerObject::_narrow (object.in ()
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- if (!CORBA::is_nil (ping_object.in ()))
- {
- // Ok, we've found our ior, now we remove the server from the
- // repository in order to avoid restarting it if it's not
- // running
- this->repository_.remove (server);
-
- // Now ping the object
- ping_object->ping (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- // If the ping succeeded, then we will save the
- // running information for this server
- location = ping_location;
- server_object_ior = ping_object_ior;
- }
}
ACE_CATCHANY
- {
- // Ignore all exceptions
- }
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ImR_Activator_i::init_with_orb");
+ ACE_RE_THROW;
+ }
ACE_ENDTRY;
-
- // Remove old info
- this->repository_.remove (server);
-
- // Add server with new startup parameters
- this->repository_.add (server,
- "",
- options.command_line.in (),
- options.environment,
- options.working_directory.in (),
- options.activation);
-
- // Set the old running info
- if (location.length () != 0)
- this->repository_.update (server, location, server_object_ior);
-
- // Set old starting up value, if there was one.
- if (starting_up != -1)
- this->repository_.starting_up (server, starting_up);
-
- if (OPTIONS::instance()->debug () >= 2)
- {
- ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::reregister_server:\nServer: %s\n"
- "Command Line: %s\n"
- "Working Directory: %s\n"
- "Activation: %s\n\n",
- server,
- options.command_line.in (),
- options.working_directory.in (),
- OPTIONS::instance ()->convert_str (options.activation)));
- for (CORBA::ULong i = 0; i < options.environment.length (); ++i)
- ACE_DEBUG ((LM_DEBUG, "Environment variable %s=%s\n",
- options.environment[i].name.in (),
- options.environment[i].value.in ()));
- }
-}
-
-
-// Remove the server entry from the Repository
-
-void
-ImR_Activator_i::remove_server (const char *server
- ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException,
- ImplementationRepository::NotFound))
-{
- if (OPTIONS::instance ()->readonly ())
- {
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Activator is readonly. Can't remove server %s.\n",
- server));
- ACE_THROW (CORBA::NO_PERMISSION ());
- }
-
- if (this->repository_.remove (server) == 0)
- {
- if (OPTIONS::instance()->debug () >= 1)
- ACE_DEBUG ((LM_DEBUG, "ImR Activator: Removed Server %s.\n", server));
- }
- else
- {
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Can't remove unknown server %s.\n",
- server));
- ACE_THROW (ImplementationRepository::NotFound ());
- }
+ ACE_CHECK_RETURN (-1);
+ return 0;
}
-// Register the current location of the server
-void
-ImR_Activator_i::server_is_running (const char *server,
- const char *partial_ior,
- ImplementationRepository::ServerObject_ptr server_object
- ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound))
+int
+ImR_Activator_i::init (Options& opts ACE_ENV_ARG_DECL)
{
- CORBA::ORB_var orb = OPTIONS::instance ()->orb ();
-
- if (OPTIONS::instance()->debug () >= 1)
- ACE_DEBUG ((LM_DEBUG, "ImR Activator: Server %s is running.\n", server));
-
- if (OPTIONS::instance()->debug () >= 2)
- ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::server_is_running: at %s\n", partial_ior));
-
- CORBA::String_var server_object_ior =
- orb->object_to_string (server_object ACE_ENV_ARG_PARAMETER);
- ACE_CHECK;
+ ACE_ARGV av(opts.cmdline());
+ int argc = av.argc();
- // Update the status of the server in the repository.
- if (this->repository_.update (server, partial_ior, server_object_ior.in ()) == 0)
- {
- if (OPTIONS::instance()->debug () >= 1)
- ACE_DEBUG ((LM_DEBUG,
- "ImR Activator: Status updated for server %s.\n", server));
- }
- else
- {
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Could not update running information for server <%s>\n",
- server));
- ACE_THROW(ImplementationRepository::NotFound());
- }
+ CORBA::ORB_var orb =
+ CORBA::ORB_init(argc, av.argv(), "TAO_ImR_Activator" ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
- this->repository_.starting_up (server, 0);
-}
+ int ret = this->init_with_orb(orb.in(), opts ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN(-1);
-// Remove the state information for the current server
-void
-ImR_Activator_i::server_is_shutting_down (const char *server ACE_ENV_ARG_DECL)
- ACE_THROW_SPEC ((CORBA::SystemException,
- ImplementationRepository::NotFound))
-{
- if (this->repository_.update (server, "", "") == 0)
- {
- if (OPTIONS::instance()->debug () >= 1)
- ACE_DEBUG ((LM_DEBUG, "ImR Activator: Shut down server %s.\n", server));
- }
- else
- {
- ACE_ERROR ((LM_ERROR,
- "ImR Activator: Could not update information for unknown server <%s>\n",
- server));
- ACE_THROW (ImplementationRepository::NotFound ());
- }
+ return ret;
}
int
-ImR_Activator_i::init (ACE_ENV_SINGLE_ARG_DECL)
+ImR_Activator_i::fini (ACE_ENV_SINGLE_ARG_DECL)
{
- CORBA::ORB_var orb = OPTIONS::instance ()->orb ();
-
ACE_TRY
- {
- CORBA::Object_var obj =
- orb->resolve_initial_references ("IORTable" ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
- IORTable::Table_var adapter =
- IORTable::Table::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
- if (CORBA::is_nil (adapter.in ()))
- {
- ACE_ERROR ((LM_ERROR, "Nil IORTable\n"));
- return -1;
- }
-
- obj = orb->resolve_initial_references ("RootPOA" ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
- if (CORBA::is_nil (obj.in ()))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "Unable to initialize the ROOT POA.\n"),
- -1);
- }
- this->root_poa_ = PortableServer::POA::_narrow (obj.in () ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- PortableServer::POAManager_var poa_manager =
- this->root_poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- CORBA::PolicyList policies (2);
- policies.length (2);
-
- policies[0] =
- this->root_poa_->create_id_assignment_policy (PortableServer::USER_ID
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- policies[1] =
- this->root_poa_->create_lifespan_policy (PortableServer::PERSISTENT
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- // Create a child POA with userId "ImR_Activator"
- this->imr_poa_ =
- this->root_poa_->create_POA ("ImR_Activator",
- poa_manager.in (),
- policies
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
- // If create_POA throws an exception then the process will end, and free all memory.
- for (CORBA::ULong i = 0; i < policies.length (); ++i)
- {
- CORBA::Policy_ptr policy = policies[i];
- policy->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_TRY_CHECK;
- }
-
- // Get the ObjectId for the string 'ImR_Activator'
- PortableServer::ObjectId_var imr_id =
- PortableServer::string_to_ObjectId ("ImR_Activator");
-
- // Activate the object
- this->imr_poa_->activate_object_with_id (imr_id.in (),
- this
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- obj = this->imr_poa_->id_to_reference (imr_id.in () ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
- ImplementationRepository::Administration_var activator =
- ImplementationRepository::Administration::_narrow(obj.in() ACE_ENV_ARG_PARAMETER);
-
- CORBA::String_var ior = orb->object_to_string (activator.in () ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- adapter->bind ("ImR_Activator", ior.in() ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- obj = orb->resolve_initial_references ("ImplRepoService" ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
- if (CORBA::is_nil (obj.in ()))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "Unable to get a reference to a Locator.\n"),
- -1);
- }
-
- ImplementationRepository::Locator_var locator =
- ImplementationRepository::Locator::_narrow (obj.in ()
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- ACE_DEBUG((LM_DEBUG, "Starting activator : %s\n", this->name_.c_str()));
-
- ACE_Reactor *reactor = orb->orb_core ()->reactor ();
+ {
+ if (debug_ > 0)
+ ACE_DEBUG((LM_DEBUG, "ImR Activator: Shutting down...\n"));
- if (reactor != 0)
- {
- if (this->process_mgr_.open (ACE_Process_Manager::DEFAULT_SIZE,
- reactor) == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "The ACE_Process_Manager didnt get initialized\n"),
- -1);
- }
- }
+ this->root_poa_->destroy (1, 1 ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
- // Initialize the persistent storage
- if (this->repository_.init ())
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "Repository failed to initialize\n"),
- -1);
- }
+ this->unblock_all_servers();
-
- // We need to send the list of our persisted server names to the Locator
- // so that it knows we are managing them.
- 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);
- }
- ImplementationRepository::Locator::ServerNameList server_names;
- server_names.length(this->repository_.get_repository_size());
- Server_Repository::HASH_IMR_MAP::ENTRY* next_entry = 0;
- for (CORBA::ULong idx = 0;server_iter->next(next_entry) != 0; server_iter->advance())
- {
- ACE_CString server_name = next_entry->ext_id_;
- server_names[idx++] = server_name.c_str();
- }
+ this->locator_->unregister_activator (name_.c_str(),
+ this->registration_token_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
- this->registration_token_ =
- locator->register_activator (this->name_.c_str(),
- activator.in (),
- server_names
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
+ this->orb_->destroy(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
- // The last thing we do is write out the ior so that a test program can assume
- // that the activator is ready to go as soon as the ior is written.
- if (OPTIONS::instance ()->debug () >= 2)
- {
- ACE_DEBUG ((LM_DEBUG,
- "ImR_Activator_i::init: The Activator IOR is: <%s>\n",
- ior.in ()));
- }
-
- ACE_CString filename = OPTIONS::instance()->output_filename();
- if (filename.length() > 0)
- {
- FILE* fp = ACE_OS::fopen(filename.c_str(), "w");
- if (fp != 0) {
- ACE_OS::fprintf(fp, "%s", ior.in());
- ACE_OS::fclose(fp);
- } else {
- ACE_ERROR((LM_ERROR, "ImR Activator: Could not open file %s\n", filename.c_str()));
- }
- }
-
- }
+ if (debug_ > 0)
+ ACE_DEBUG((LM_DEBUG, "ImR Activator: Shut down successfully.\n"));
+ }
ACE_CATCHANY
- {
- ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Server_i::init");
- ACE_RE_THROW;
- }
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ImR_Activator_i::fini");
+ ACE_RE_THROW;
+ }
ACE_ENDTRY;
ACE_CHECK_RETURN (-1);
return 0;
}
int
-ImR_Activator_i::fini1 (ACE_ENV_SINGLE_ARG_DECL)
+ImR_Activator_i::run (ACE_ENV_SINGLE_ARG_DECL)
{
- CORBA::ORB_var orb = OPTIONS::instance ()->orb ();
-
- ACE_TRY
- {
- CORBA::Object_var table_object =
- orb->resolve_initial_references ("IORTable" ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- IORTable::Table_var adapter =
- IORTable::Table::_narrow (table_object.in () ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
-
- if (CORBA::is_nil (adapter.in ()))
- {
- ACE_ERROR ((LM_ERROR, "Nil IORTable\n"));
- }
- else
- {
- adapter->set_locator (IORTable::Locator::_nil ()
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
- }
-
- }
- ACE_CATCHANY
- {
- ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Server_i::init");
- ACE_RE_THROW;
- }
- ACE_ENDTRY;
+ this->orb_->run(ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
return 0;
}
-
-int
-ImR_Activator_i::fini2 (ACE_ENV_SINGLE_ARG_DECL)
-{
- ACE_TRY
- {
- this->imr_poa_->destroy (1, 1 ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
- 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)
+void
+ImR_Activator_i::start_server
+(
+ ImplementationRepository::AMH_ActivatorResponseHandler_ptr rh,
+ const char* name,
+ const char* cmdline,
+ const char* dir,
+ const ImplementationRepository::EnvironmentList & env ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
{
- 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"));
+ RHListPtr server;
+ waiting_servers_.find(name, server);
+ if (server.null())
+ {
+ server = RHListPtr(new RHList);
+ int err = waiting_servers_.bind(name, server);
+ ACE_ASSERT(err == 0);
+ ACE_UNUSED_ARG(err);
+ }
- // 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 ())
+ if (server->size() == 0)
+ {
+ if (debug_ > 0)
+ ACE_DEBUG((LM_DEBUG, "ImR Activator: Spawn server <%s>\n", name));
+ if (debug_ > 1)
+ ACE_DEBUG((LM_DEBUG, "\tcommand line : <%s>\n\tdirectory : <%s>\n", cmdline, dir));
+
+ // Launch the process using the given command line.
+ ACE_Process_Options proc_opts;
+ proc_opts.command_line (cmdline);
+ proc_opts.working_directory (dir);
+ // 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.
+ proc_opts.handle_inheritence (0);
+
+ for (CORBA::ULong i = 0; i < env.length(); ++i)
+ proc_opts.setenv (env[i].name.in(), env[i].value.in());
+
+ int pid = this->process_mgr_.spawn (proc_opts);
+ if (pid == ACE_INVALID_PID)
{
- server_iter->next (server_entry);
- server_iter->advance ();
+ ACE_ERROR ((LM_ERROR,
+ "ImR Activator: Cannot spawn server <%s> using <%s>\n", name, cmdline));
- ACE_CString logical, server, command_line, working_directory, location;
- ImplementationRepository::ActivationMode activation
- = ImplementationRepository::NORMAL;
- ImplementationRepository::EnvironmentList environment_vars ;
+ ImplementationRepository::CannotActivate* ex = new
+ ImplementationRepository::CannotActivate(CORBA::string_dup ("Process Creation Failed"));
- server_entry->int_id_->get_startup_info (logical,
- command_line,
- environment_vars,
- working_directory,
- activation);
+ ImplementationRepository::AMH_ActivatorExceptionHolder holder(ex);
ACE_TRY
- {
- if (activation == ImplementationRepository::AUTO_START)
- this->activate_server (server_entry->ext_id_.c_str ()
- ACE_ENV_ARG_PARAMETER);
- ACE_TRY_CHECK;
- }
+ {
+ rh->start_server_excep (&holder 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_ERROR((LM_ERROR, "Exception during asynch exception throw.\n"));
+ }
ACE_ENDTRY;
+ return;
}
- orb->run (0 ACE_ENV_ARG_PARAMETER);
- ACE_CHECK_RETURN (-1);
-
- return 0;
-}
+ if (debug_ > 0)
+ {
+ ACE_DEBUG((LM_DEBUG,
+ "ImR Activator: Successfully spawned. Waiting for status of <%s>...\n", name));
+ }
+ }
+ else if (debug_ > 0)
+ {
+ ACE_DEBUG((LM_DEBUG, "ImR Activator: Waiting for status of <%s>...\n", name));
+ }
-ImR_Activator_i::~ImR_Activator_i (void)
-{
+ server->push_back(ImplementationRepository::AMH_ActivatorResponseHandler::_duplicate(rh));
}
-
-// 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))
+ImR_Activator_i::server_status_changed
+(
+ ImplementationRepository::AMH_ActivatorResponseHandler_ptr rh,
+ const char* name ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
{
- 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 ());
+ // First, send the reply, because the servers server_is_running shouldn't
+ // have to wait for all of the waiting clients to return.
+ ACE_TRY_EX(ACE_TRY_LABEL2)
+ {
+ rh->server_status_changed(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK_EX(ACE_TRY_LABEL2);
+ }
+ ACE_CATCHANY
+ {
+ if (debug_ > 1)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ImR_Activator_i::server_status_changed() return");
+ }
+ ACE_ENDTRY;
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)
+ RHListPtr server;
+ this->waiting_servers_.find(name, server);
+ if (! server.null() && server->size() > 0)
{
- ACE_THROW (ImplementationRepository::NotFound ());
+ this->unblock_server(server);
+ }
+ else
+ {
+ if (debug_ > 0)
+ ACE_DEBUG((LM_DEBUG, "ImR Activator: No waiting clients.\n"));
}
-
- // 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))
+ImR_Activator_i::unblock_all_servers()
{
- 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);
+ ServerMap::ENTRY* entry = 0;
+ ServerMap::ITERATOR it(this->waiting_servers_);
+ for (; it.next(entry); it.advance())
+ {
+ ACE_CString name = entry->ext_id_;
+ RHListPtr server = entry->int_id_;
+ this->unblock_server(server);
+ }
+ this->waiting_servers_.unbind_all();
+}
- Server_Repository::HASH_IMR_MAP::ENTRY *server_entry;
+void
+ImR_Activator_i::unblock_server(RHListPtr server)
+{
+ if (debug_ > 0)
+ ACE_DEBUG((LM_DEBUG, "ImR Activator: Unblocking %u waiting clients.\n", server->size()));
- if (OPTIONS::instance()->debug () >= 2)
- ACE_DEBUG ((LM_DEBUG, "ImR_Activator_i::list: Filling ServerList with %d servers\n", n));
+ RHList& svr = *server;
- for (CORBA::ULong i = 0; i < n; i++)
+ for (size_t i = 0; i < svr.size(); ++i)
+ {
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
{
- 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 ());
+ ImplementationRepository::AMH_ActivatorResponseHandler_var ssrh = svr[i];
+ ssrh->start_server(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
}
-
-
- // Now work on the iterator
-
- // Only set up an iterator if we need to
- if (this->repository_.get_repository_size () > how_many)
+ ACE_CATCHANY
{
- 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;
+ if (debug_ > 1)
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ImR_Activator_i::unblock_server()");
}
+ ACE_ENDTRY;
+ }
+ server->clear();
}
+//@@ todo : Use the process_manager so that we're notified when any of our launched
+// processes die. Add a new operation to the Locator idl, so that we can
+// notify the locator when this happens.
-/**
- * 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"));
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
- CORBA::ORB_var orb = OPTIONS::instance ()->orb ();
+template class ACE_Array_Base<ImplementationRepository::AMH_ActivatorResponseHandler_var>;
+template class ACE_Array<ImplementationRepository::AMH_ActivatorResponseHandler_var>;
+template class ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>;
- ACE_CString server_object_ior, location;
+template class ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex>;
- // 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 ());
- }
+template class ACE_Hash_Map_Entry<ACE_CString, ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex> >;
+template class ACE_Hash_Map_Manager_Ex<ACE_CString, ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex>, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex>,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Iterator_Ex<ACE_CString, ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex>,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
+template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex>,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>;
- // 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 ());
- }
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
- server_object->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_TRY_CHECK;
+#pragma instantiate ACE_Array_Base<ImplementationRepository::AMH_ActivatorResponseHandler_var>
+#pragma instantiate ACE_Array<ImplementationRepository::AMH_ActivatorResponseHandler_var>
+#pragma instantiate ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>
- // 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;
- }
-}
+#pragma instantiate ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex>
-void ImR_Activator_i::shutdown_repo( ACE_ENV_SINGLE_ARG_DECL )
- ACE_THROW_SPEC( (CORBA::SystemException) )
-{
- CORBA::ORB_var orb = OPTIONS::instance ()->orb () ;
- this->fini1 (ACE_ENV_SINGLE_ARG_PARAMETER);
- orb->shutdown (0);
- this->fini2 (ACE_ENV_SINGLE_ARG_PARAMETER) ;
-}
+#pragma instantiate ACE_Hash_Map_Entry<ACE_CString, ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex> >
+#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_CString, ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex> ,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex> ,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_CString, ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex> ,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
+#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, ACE_Strong_Bound_Ptr<ACE_Vector<ImplementationRepository::AMH_ActivatorResponseHandler_var>, ACE_Null_Mutex> ,ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>
-#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 */