diff options
Diffstat (limited to 'TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp')
-rw-r--r-- | TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp | 1814 |
1 files changed, 907 insertions, 907 deletions
diff --git a/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp b/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp index 7884c6c36c7..b4374928d61 100644 --- a/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp +++ b/TAO/orbsvcs/ImplRepo_Service/ImR_Locator_i.cpp @@ -17,59 +17,60 @@ #include "ace/ARGV.h" #include "ace/OS_NS_sys_time.h" #include "ace/Vector_T.h" +#include "ace/Argv_Type_Converter.h" static const int DEFAULT_START_LIMIT = 1; static const int PING_RETRY_SCHEDULE[] = {0, 10, 100, 500, 1000, 1000, 1000, 1000, 5000, 5000}; -static const ACE_Time_Value DEFAULT_SERVER_TIMEOUT (0, 10 * 1000); // 10ms +static const ACE_Time_Value DEFAULT_SERVER_TIMEOUT(0, 10 * 1000); // 10ms // We want to give shutdown a little more time to work, so that we // can guarantee to the tao_imr utility that it has shutdown. The tao_imr // utility prints a different message depending on whether shutdown succeeds // or times out. -static const ACE_Time_Value DEFAULT_SHUTDOWN_TIMEOUT (0, 5000 * 1000); +static const ACE_Time_Value DEFAULT_SHUTDOWN_TIMEOUT(0, 5000 * 1000); static PortableServer::POA_ptr -createPersistentPOA (PortableServer::POA_ptr root_poa, const char* poa_name ACE_ENV_ARG_DECL) { +createPersistentPOA(PortableServer::POA_ptr root_poa, const char* poa_name ACE_ENV_ARG_DECL) { PortableServer::LifespanPolicy_var life = - root_poa->create_lifespan_policy (PortableServer::PERSISTENT ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (PortableServer::POA::_nil ()); + root_poa->create_lifespan_policy(PortableServer::PERSISTENT ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN(PortableServer::POA::_nil()); PortableServer::IdAssignmentPolicy_var assign = - root_poa->create_id_assignment_policy (PortableServer::USER_ID ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (PortableServer::POA::_nil ()); + root_poa->create_id_assignment_policy(PortableServer::USER_ID ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN(PortableServer::POA::_nil()); CORBA::PolicyList pols; - pols.length (2); - pols[0] = PortableServer::LifespanPolicy::_duplicate (life.in ()); - pols[1] = PortableServer::IdAssignmentPolicy::_duplicate (assign.in ()); + pols.length(2); + pols[0] = PortableServer::LifespanPolicy::_duplicate(life.in()); + pols[1] = PortableServer::IdAssignmentPolicy::_duplicate(assign.in()); - PortableServer::POAManager_var mgr = root_poa->the_POAManager (); + PortableServer::POAManager_var mgr = root_poa->the_POAManager(); PortableServer::POA_var poa = - root_poa->create_POA (poa_name, mgr.in (), pols ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (PortableServer::POA::_nil ()); + root_poa->create_POA(poa_name, mgr.in(), pols ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN(PortableServer::POA::_nil()); - life->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (PortableServer::POA::_nil ()); - assign->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (PortableServer::POA::_nil ()); + life->destroy(ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN(PortableServer::POA::_nil()); + assign->destroy(ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN(PortableServer::POA::_nil()); - return poa._retn (); + return poa._retn(); } ImR_Locator_i::ImR_Locator_i (void) - : forwarder_ (*this) - , ins_locator_ (0) - , debug_ (0) - , read_only_ (false) + : forwarder_(*this) + , ins_locator_(0) + , debug_(0) + , read_only_(false) { // Visual C++ 6.0 is not smart enough to do a direct assignment // while allocating the INS_Locator. So, we have to do it in // two steps. INS_Locator* locator; - ACE_NEW (locator, - INS_Locator (*this)); + ACE_NEW(locator, + INS_Locator(*this)); ins_locator_ = locator; } @@ -85,21 +86,21 @@ ImR_Locator_i::~ImR_Locator_i (void) int ImR_Locator_i::init_with_orb (CORBA::ORB_ptr orb, Options& opts ACE_ENV_ARG_DECL) { - orb_ = CORBA::ORB::_duplicate (orb); - debug_ = opts.debug (); - read_only_ = opts.readonly (); - startup_timeout_ = opts.startup_timeout (); - ping_interval_ = opts.ping_interval (); + orb_ = CORBA::ORB::_duplicate(orb); + debug_ = opts.debug(); + read_only_ = opts.readonly(); + startup_timeout_ = opts.startup_timeout(); + ping_interval_ = opts.ping_interval(); CORBA::Object_var obj = this->orb_->resolve_initial_references ("RootPOA" ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); this->root_poa_ = PortableServer::POA::_narrow (obj.in () ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); - ACE_ASSERT (! CORBA::is_nil (this->root_poa_.in ())); + ACE_ASSERT(! CORBA::is_nil(this->root_poa_.in())); - this->forwarder_.init (orb ACE_ENV_ARG_PARAMETER); - this->adapter_.init (& this->forwarder_); + this->forwarder_.init(orb ACE_ENV_ARG_PARAMETER); + this->adapter_.init(& this->forwarder_); // Register the Adapter_Activator reference to be the RootPOA's // Adapter Activator. @@ -107,31 +108,31 @@ ImR_Locator_i::init_with_orb (CORBA::ORB_ptr orb, Options& opts ACE_ENV_ARG_DECL ACE_CHECK_RETURN (-1); // Use a persistent POA so that any IOR - this->imr_poa_ = createPersistentPOA (this->root_poa_.in (), - "ImplRepo_Service" ACE_ENV_ARG_PARAMETER); + this->imr_poa_ = createPersistentPOA(this->root_poa_.in(), + "ImplRepo_Service" ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); - ACE_ASSERT (! CORBA::is_nil (this->imr_poa_.in ())); + ACE_ASSERT(! CORBA::is_nil(this->imr_poa_.in())); - waiter_svt_.debug (debug_ > 1); + waiter_svt_.debug(debug_ > 1); PortableServer::ObjectId_var id = PortableServer::string_to_ObjectId ("ImR_AsyncStartupWaiter"); - this->imr_poa_->activate_object_with_id (id.in (), &waiter_svt_ ACE_ENV_ARG_PARAMETER); + this->imr_poa_->activate_object_with_id(id.in(), &waiter_svt_ ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); - obj = this->imr_poa_->id_to_reference (id.in () ACE_ENV_ARG_PARAMETER); + obj = this->imr_poa_->id_to_reference (id.in() ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); if (startup_timeout_ > ACE_Time_Value::zero) - { - obj = set_timeout_policy (obj.in (), startup_timeout_); - } - waiter_ = ImplementationRepository::AsyncStartupWaiter::_narrow (obj.in () ACE_ENV_ARG_PARAMETER); + { + obj = set_timeout_policy(obj.in(), startup_timeout_); + } + waiter_ = ImplementationRepository::AsyncStartupWaiter::_narrow(obj.in() ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); id = PortableServer::string_to_ObjectId ("ImplRepo_Service"); - this->imr_poa_->activate_object_with_id (id.in (), this ACE_ENV_ARG_PARAMETER); + this->imr_poa_->activate_object_with_id(id.in(), this ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); - obj = this->imr_poa_->id_to_reference (id.in () ACE_ENV_ARG_PARAMETER); + obj = this->imr_poa_->id_to_reference (id.in() ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); - CORBA::String_var ior = this->orb_->object_to_string (obj.in () ACE_ENV_ARG_PARAMETER); + CORBA::String_var ior = this->orb_->object_to_string(obj.in() ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); // Register the ImR for use with INS @@ -139,7 +140,7 @@ ImR_Locator_i::init_with_orb (CORBA::ORB_ptr orb, Options& opts ACE_ENV_ARG_DECL ACE_CHECK_RETURN (-1); IORTable::Table_var ior_table = IORTable::Table::_narrow (obj.in () ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); - ACE_ASSERT (! CORBA::is_nil (ior_table.in ())); + ACE_ASSERT(! CORBA::is_nil(ior_table.in())); ior_table->bind ("ImplRepoService", ior.in () ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); ior_table->bind ("ImR", ior.in () ACE_ENV_ARG_PARAMETER); @@ -148,12 +149,12 @@ ImR_Locator_i::init_with_orb (CORBA::ORB_ptr orb, Options& opts ACE_ENV_ARG_DECL ACE_CHECK_RETURN (-1); // Set up multicast support (if enabled) - if (opts.multicast ()) - { - ACE_Reactor* reactor = orb->orb_core ()->reactor (); - if (this->setup_multicast (reactor, ior.in ()) != 0) - return -1; - } + if (opts.multicast()) + { + ACE_Reactor* reactor = orb->orb_core()->reactor(); + if (this->setup_multicast (reactor, ior.in()) != 0) + return -1; + } // Initialize the persistent storage. This will load any values that // may have been persisted before. @@ -162,9 +163,9 @@ ImR_Locator_i::init_with_orb (CORBA::ORB_ptr orb, Options& opts ACE_ENV_ARG_DECL int init_result = this->repository_.init (opts); if (init_result == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, "Repository failed to initialize\n"), -1); - } + { + ACE_ERROR_RETURN ((LM_ERROR, "Repository failed to initialize\n"), -1); + } // Activate the two poa managers PortableServer::POAManager_var poaman = @@ -178,160 +179,163 @@ ImR_Locator_i::init_with_orb (CORBA::ORB_ptr orb, Options& opts ACE_ENV_ARG_DECL ACE_CHECK_RETURN (-1); // We write the ior file last so that the tests can know we are ready. - if (opts.ior_filename ().length () > 0) + if (opts.ior_filename().length() > 0) + { + FILE* fp = ACE_OS::fopen(opts.ior_filename().c_str(), ACE_TEXT("w")); + if (fp == 0) { - FILE* fp = ACE_OS::fopen (opts.ior_filename ().c_str (), "w"); - if (fp == 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - "ImR: Could not open file: %s\n", opts.ior_filename ().c_str ()), -1); - } - ACE_OS::fprintf (fp, "%s", ior.in ()); - ACE_OS::fclose (fp); + ACE_ERROR_RETURN ((LM_ERROR, + "ImR: Could not open file: %s\n", opts.ior_filename().c_str()), -1); } + ACE_OS::fprintf(fp, "%s", ior.in()); + ACE_OS::fclose(fp); + } return 0; } int -ImR_Locator_i::init (Options& opts ACE_ENV_ARG_DECL) +ImR_Locator_i::init(Options& opts ACE_ENV_ARG_DECL) { - ACE_CString cmdline = opts.cmdline (); - cmdline += " -orbcollocation no -orbuseimr 0"; - ACE_ARGV av (cmdline.c_str ()); - int argc = av.argc (); - char** argv = av.argv (); - - CORBA::ORB_var orb = CORBA::ORB_init (argc, argv, "TAO_ImR_Locator" ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - int err = this->init_with_orb (orb.in (), opts ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); + ACE_TString cmdline = opts.cmdline(); + cmdline += ACE_TEXT(" -orbcollocation no -orbuseimr 0"); + ACE_ARGV av(cmdline.c_str()); + int argc = av.argc(); + ACE_TCHAR** argv = av.argv(); + + ACE_Argv_Type_Converter convert (argc, argv); + + CORBA::ORB_var orb = CORBA::ORB_init(convert.get_argc(), convert.get_ASCII_argv(), + "TAO_ImR_Locator" ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN(-1); + int err = this->init_with_orb(orb.in(), opts ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN(-1); return err; } int -ImR_Locator_i::run (ACE_ENV_SINGLE_ARG_DECL) +ImR_Locator_i::run(ACE_ENV_SINGLE_ARG_DECL) { if (debug_ > 0) - { - ACE_DEBUG ((LM_DEBUG, "Implementation Repository: Running\n" - "\tPing Interval : %dms\n" - "\tStartup Timeout : %ds\n" - "\tPersistence : %s\n" - "\tMulticast : %s\n" - "\tDebug : %d\n" - "\tLocked : %s\n\n", - ping_interval_.msec (), - startup_timeout_.sec (), - repository_.repo_mode (), - ior_multicast_.reactor () != 0 ? "Enabled" : "Disabled", - debug (), - read_only_ ? "True" : "False")); - } - this->auto_start_servers (ACE_ENV_SINGLE_ARG_PARAMETER); + { + ACE_DEBUG((LM_DEBUG, "Implementation Repository: Running\n" + "\tPing Interval : %dms\n" + "\tStartup Timeout : %ds\n" + "\tPersistence : %s\n" + "\tMulticast : %s\n" + "\tDebug : %d\n" + "\tLocked : %s\n\n", + ping_interval_.msec(), + startup_timeout_.sec(), + ACE_TEXT_TO_CHAR_IN(repository_.repo_mode()), + ior_multicast_.reactor() != 0 ? "Enabled" : "Disabled", + debug(), + read_only_ ? "True" : "False")); + } + this->auto_start_servers(ACE_ENV_SINGLE_ARG_PARAMETER); ACE_CHECK_RETURN (-1); - this->orb_->run (ACE_ENV_SINGLE_ARG_PARAMETER); + this->orb_->run(ACE_ENV_SINGLE_ARG_PARAMETER); ACE_CHECK_RETURN (-1); return 0; } void -ImR_Locator_i::shutdown (CORBA::Boolean activators, CORBA::Boolean servers ACE_ENV_ARG_DECL) +ImR_Locator_i::shutdown(CORBA::Boolean activators, CORBA::Boolean servers ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - if (servers != 0 && this->repository_.servers ().current_size () > 0) + if (servers != 0 && this->repository_.servers().current_size() > 0) + { + // Note : shutdown is oneway, so we can't throw + ACE_ERROR((LM_ERROR, "ImR: Shutdown of all servers not implemented.\n")); + } + if (activators != 0 && this->repository_.activators().current_size() > 0) + { + ACE_Vector<ImplementationRepository::Activator_var> acts; + Locator_Repository::AIMap::ENTRY* entry = 0; + Locator_Repository::AIMap::ITERATOR it(this->repository_.activators()); + for (;it.next(entry) != 0; it.advance()) { - // Note : shutdown is oneway, so we can't throw - ACE_ERROR ((LM_ERROR, "ImR: Shutdown of all servers not implemented.\n")); + Activator_Info_Ptr info = entry->int_id_; + ACE_ASSERT(! info.null()); + connect_activator(*info); + if (! CORBA::is_nil(info->activator.in())) + acts.push_back(info->activator); } - if (activators != 0 && this->repository_.activators ().current_size () > 0) - { - ACE_Vector<ImplementationRepository::Activator_var> acts; - Locator_Repository::AIMap::ENTRY* entry = 0; - Locator_Repository::AIMap::ITERATOR it (this->repository_.activators ()); - for (;it.next (entry) != 0; it.advance ()) - { - Activator_Info_Ptr info = entry->int_id_; - ACE_ASSERT (! info.null ()); - connect_activator (*info); - if (! CORBA::is_nil (info->activator.in ())) - acts.push_back (info->activator); - } - int shutdown_errs = 0; + int shutdown_errs = 0; - for (size_t i = 0; i < acts.size (); ++i) - { - ACE_TRY - { - acts[i]->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; - acts[i] = ImplementationRepository::Activator::_nil (); - } - ACE_CATCHANY - { - ++shutdown_errs; - if (debug_ > 1) - { - ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ImR: shutdown activator"); - } - } - ACE_ENDTRY; - ACE_CHECK; - } - if (debug_ > 0 && shutdown_errs > 0) + for (size_t i = 0; i < acts.size(); ++i) + { + ACE_TRY + { + acts[i]->shutdown(ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + acts[i] = ImplementationRepository::Activator::_nil(); + } + ACE_CATCHANY + { + ++shutdown_errs; + if (debug_ > 1) { - ACE_DEBUG ((LM_DEBUG, "ImR: Some activators could not be shut down.\n")); + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ImR: shutdown activator"); } + } + ACE_ENDTRY; + ACE_CHECK; } + if (debug_ > 0 && shutdown_errs > 0) + { + ACE_DEBUG((LM_DEBUG, "ImR: Some activators could not be shut down.\n")); + } + } // Technically, we should wait for all the activators to unregister, but // ,for now at least, it doesn't seem worth it. - shutdown (false ACE_ENV_ARG_PARAMETER); + shutdown(false ACE_ENV_ARG_PARAMETER); } void ImR_Locator_i::shutdown (bool wait_for_completion ACE_ENV_ARG_DECL) { - this->orb_->shutdown (wait_for_completion ACE_ENV_ARG_PARAMETER); + this->orb_->shutdown(wait_for_completion ACE_ENV_ARG_PARAMETER); } int ImR_Locator_i::fini (ACE_ENV_SINGLE_ARG_DECL) { ACE_TRY - { - if (debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR: Shutting down...\n")); + { + if (debug_ > 1) + ACE_DEBUG((LM_DEBUG, "ImR: Shutting down...\n")); - teardown_multicast (); + teardown_multicast(); - this->root_poa_->destroy (1, 1 ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; + this->root_poa_->destroy (1, 1 ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - this->orb_->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; + this->orb_->destroy(ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; - if (debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Shut down successfully.\n")); - } + if (debug_ > 0) + ACE_DEBUG((LM_DEBUG, "ImR: Shut down successfully.\n")); + } ACE_CATCHANY - { - ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ImR_Locator_i::fini"); - ACE_RE_THROW; - } + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ImR_Locator_i::fini"); + ACE_RE_THROW; + } ACE_ENDTRY; ACE_CHECK_RETURN (-1); return 0; } void -ImR_Locator_i::teardown_multicast () +ImR_Locator_i::teardown_multicast() { - ACE_Reactor* r = ior_multicast_.reactor (); + ACE_Reactor* r = ior_multicast_.reactor(); if (r != 0) { - r->remove_handler (&ior_multicast_, ACE_Event_Handler::READ_MASK); - ior_multicast_.reactor (0); + r->remove_handler(&ior_multicast_, ACE_Event_Handler::READ_MASK); + ior_multicast_.reactor(0); } } @@ -342,49 +346,49 @@ ImR_Locator_i::setup_multicast (ACE_Reactor* reactor, const char* ior) ACE_ASSERT (ior != 0); #if defined (ACE_HAS_IP_MULTICAST) - TAO_ORB_Core* core = TAO_ORB_Core_instance (); + TAO_ORB_Core* core = TAO_ORB_Core_instance(); // See if the -ORBMulticastDiscoveryEndpoint option was specified. - ACE_CString mde (core->orb_params ()->mcast_discovery_endpoint ()); + ACE_CString mde (core->orb_params()->mcast_discovery_endpoint()); if (mde.length () != 0) + { + if (this->ior_multicast_.init(ior, + mde.c_str(), TAO_SERVICEID_IMPLREPOSERVICE) == -1) { - if (this->ior_multicast_.init (ior, - mde.c_str (), TAO_SERVICEID_IMPLREPOSERVICE) == -1) - { - return -1; - } + return -1; } + } else + { + // Port can be specified as param, env var, or default + CORBA::UShort port = + core->orb_params()->service_port (TAO::MCAST_IMPLREPOSERVICE); + if (port == 0) { - // Port can be specified as param, env var, or default - CORBA::UShort port = - core->orb_params ()->service_port (TAO::MCAST_IMPLREPOSERVICE); - if (port == 0) - { - // Check environment var. for multicast port. - const char* port_number = ACE_OS::getenv ("ImplRepoServicePort"); + // Check environment var. for multicast port. + const char* port_number = ACE_OS::getenv ("ImplRepoServicePort"); - if (port_number != 0) - port = static_cast<CORBA::UShort> (ACE_OS::atoi (port_number)); - } - if (port == 0) - port = TAO_DEFAULT_IMPLREPO_SERVER_REQUEST_PORT; - - if (this->ior_multicast_.init (ior, port, - ACE_DEFAULT_MULTICAST_ADDR, TAO_SERVICEID_IMPLREPOSERVICE) == -1) - { - return -1; - } + if (port_number != 0) + port = ACE_OS::atoi (port_number); } + if (port == 0) + port = TAO_DEFAULT_IMPLREPO_SERVER_REQUEST_PORT; - // Register event handler for the ior multicast. - if (reactor->register_handler (&this->ior_multicast_, - ACE_Event_Handler::READ_MASK) == -1) + if (this->ior_multicast_.init(ior, port, + ACE_DEFAULT_MULTICAST_ADDR, TAO_SERVICEID_IMPLREPOSERVICE) == -1) { - if (debug_ >= 1) - ACE_DEBUG ((LM_DEBUG, "ImR: cannot register Event handler\n")); return -1; } + } + + // Register event handler for the ior multicast. + if (reactor->register_handler (&this->ior_multicast_, + ACE_Event_Handler::READ_MASK) == -1) + { + if (debug_ >= 1) + ACE_DEBUG ((LM_DEBUG, "ImR: cannot register Event handler\n")); + return -1; + } #else /* ACE_HAS_IP_MULTICAST*/ ACE_UNUSED_ARG (reactor); ACE_UNUSED_ARG (ior); @@ -398,23 +402,23 @@ ImR_Locator_i::register_activator (const char* aname, ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - ACE_ASSERT (aname != 0); - ACE_ASSERT (! CORBA::is_nil (activator)); + ACE_ASSERT(aname != 0); + ACE_ASSERT(! CORBA::is_nil(activator)); // Before we can register the activator, we need to ensure that any existing // registration is purged. - this->unregister_activator_i (aname); - ACE_CHECK_RETURN (0); + this->unregister_activator_i(aname); + ACE_CHECK_RETURN(0); CORBA::String_var ior = this->orb_->object_to_string (activator ACE_ENV_ARG_PARAMETER); ACE_CHECK_RETURN (-1); - CORBA::Long token = ACE_OS::gettimeofday ().msec (); + CORBA::Long token = ACE_OS::gettimeofday().msec(); - int err = this->repository_.add_activator (aname, token, ior.in (), activator); - ACE_ASSERT (err == 0); - ACE_UNUSED_ARG (err); + int err = this->repository_.add_activator (aname, token, ior.in(), activator); + ACE_ASSERT(err == 0); + ACE_UNUSED_ARG(err); if (this->debug_ > 0) ACE_DEBUG ((LM_DEBUG, "ImR: Activator registered for %s.\n", aname)); @@ -428,63 +432,64 @@ ImR_Locator_i::unregister_activator (const char* aname, ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - ACE_ASSERT (aname != 0); + ACE_ASSERT(aname != 0); Activator_Info_Ptr info = this->get_activator (aname); - if (! info.null ()) + if (! info.null()) + { + if (info->token != token && this->debug_ > 0) { - if (info->token != token && this->debug_ > 0) - { - ACE_DEBUG ((LM_DEBUG, "ImR: Ignoring unregister activator:%s. Wrong token.\n", aname)); - return; - } + ACE_DEBUG((LM_DEBUG, "ImR: Ignoring unregister activator:%s. Wrong token.\n", aname)); + return; + } - this->unregister_activator_i (aname); - ACE_CHECK; + this->unregister_activator_i(aname); + ACE_CHECK; - if (this->debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Activator %s unregistered.\n", aname)); - } + if (this->debug_ > 0) + ACE_DEBUG ((LM_DEBUG, "ImR: Activator %s unregistered.\n", aname)); + } else - { - if (this->debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Ignoring unregister activator:%s. Unknown activator.\n", aname)); - } + { + if (this->debug_ > 0) + ACE_DEBUG((LM_DEBUG, "ImR: Ignoring unregister activator:%s. Unknown activator.\n", aname)); + } } void -ImR_Locator_i::unregister_activator_i (const char* aname) +ImR_Locator_i::unregister_activator_i(const char* aname) { - ACE_ASSERT (aname != 0); + ACE_ASSERT(aname != 0); int err = this->repository_.remove_activator (aname); - ACE_UNUSED_ARG (err); + ACE_UNUSED_ARG(err); } + void ImR_Locator_i::notify_child_death (const char* name ACE_ENV_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException)) { - ACE_ASSERT (name != 0); + ACE_ASSERT(name != 0); if (this->debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR: Server has died <%s>.\n", name)); + ACE_DEBUG((LM_DEBUG, "ImR: Server has died <%s>.\n", name)); - Server_Info_Ptr info = this->repository_.get_server (name); - if (! info.null ()) - { - info->ior = ""; - info->partial_ior = ""; + Server_Info_Ptr info = this->repository_.get_server(name); + if (! info.null()) + { + info->ior = ""; + info->partial_ior = ""; - int err = this->repository_.update_server (*info); - ACE_ASSERT (err == 0); - ACE_UNUSED_ARG (err); - } + int err = this->repository_.update_server(*info); + ACE_ASSERT(err == 0); + ACE_UNUSED_ARG(err); + } else - { - if (this->debug_ > 1) - ACE_DEBUG ((LM_DEBUG, - "ImR: Failed to find server in repository.\n")); - } + { + if (this->debug_ > 1) + ACE_DEBUG((LM_DEBUG, + "ImR: Failed to find server in repository.\n")); + } } void @@ -498,7 +503,7 @@ ACE_THROW_SPEC ((CORBA::SystemException, // This is the version called by tao_imr to activate the server, manually // starting it if necessary. - activate_server_by_name (server, true ACE_ENV_ARG_PARAMETER); + activate_server_by_name(server, true ACE_ENV_ARG_PARAMETER); } char* @@ -509,16 +514,16 @@ ACE_THROW_SPEC ((CORBA::SystemException, { // Activate the server, starting it if necessary. Don't start MANUAL // servers unless manual_start=true - ACE_ASSERT (name != 0); + ACE_ASSERT(name != 0); - Server_Info_Ptr info = this->repository_.get_server (name); - if (info.null ()) - { - ACE_ERROR ((LM_ERROR, "ImR: Cannot find info for server <%s>\n", name)); - ACE_THROW_RETURN (ImplementationRepository::NotFound (), 0); - } + Server_Info_Ptr info = this->repository_.get_server(name); + if (info.null()) + { + ACE_ERROR ((LM_ERROR, "ImR: Cannot find info for server <%s>\n", name)); + ACE_THROW_RETURN(ImplementationRepository::NotFound (), 0); + } - return activate_server_i (*info, manual_start ACE_ENV_ARG_PARAMETER); + return activate_server_i(*info, manual_start ACE_ENV_ARG_PARAMETER); } char* @@ -527,16 +532,16 @@ ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound, ImplementationRepository::CannotActivate)) { - ACE_ASSERT (object_name != 0); + ACE_ASSERT(object_name != 0); // We assume that the first part of the object name is the server name. // So a name of foo/bar means that the server name is foo. - ACE_CString server_name (object_name); + ACE_CString server_name(object_name); ssize_t pos = server_name.find ('/'); if (pos != ACE_CString::npos) - server_name = server_name.substr (pos + 1); + server_name = server_name.substr(pos + 1); - return activate_server_by_name (server_name.c_str (), false ACE_ENV_ARG_PARAMETER); + return activate_server_by_name(server_name.c_str(), false ACE_ENV_ARG_PARAMETER); } char* @@ -546,47 +551,47 @@ ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::CannotActivate)) { if (info.activation_mode == ImplementationRepository::PER_CLIENT) - { - return activate_perclient_server_i (info, manual_start ACE_ENV_ARG_PARAMETER); - } + { + return activate_perclient_server_i(info, manual_start ACE_ENV_ARG_PARAMETER); + } - while (true) + while(true) + { + if (is_alive(info)) { - if (is_alive (info)) - { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, "ImR: Successfully activated <%s> at \n\t%s\n", - info.name.c_str (), info.partial_ior.c_str ())); - } - info.start_count = 0; - - waiter_svt_.unblock_all (info.name.c_str ()); + if (debug_ > 1) + { + ACE_DEBUG((LM_DEBUG, "ImR: Successfully activated <%s> at \n\t%s\n", + info.name.c_str(), info.partial_ior.c_str())); + } + info.start_count = 0; - return CORBA::string_dup (info.partial_ior.c_str ()); - } + waiter_svt_.unblock_all(info.name.c_str()); - info.reset (); + return CORBA::string_dup(info.partial_ior.c_str()); + } - if (! info.starting && info.start_count >= info.start_limit) - { - if (this->debug_ > 0) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: Cannot Activate <%s>.\n", info.name.c_str ())); - } + info.reset(); - waiter_svt_.unblock_all (info.name.c_str ()); + if (! info.starting && info.start_count >= info.start_limit) + { + if (this->debug_ > 0) + { + ACE_DEBUG((LM_DEBUG, + "ImR: Cannot Activate <%s>.\n", info.name.c_str())); + } - ACE_THROW_RETURN (ImplementationRepository::CannotActivate - (CORBA::string_dup ("Cannot start server.")), 0); - } + waiter_svt_.unblock_all(info.name.c_str()); - // Note : We already updated info with StartupInfo in server_is_running () - ImplementationRepository::StartupInfo_var si = - start_server (info, manual_start ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (0); + ACE_THROW_RETURN (ImplementationRepository::CannotActivate + (CORBA::string_dup ("Cannot start server.")), 0); } + + // Note : We already updated info with StartupInfo in server_is_running() + ImplementationRepository::StartupInfo_var si = + start_server(info, manual_start ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN(0); + } } char* @@ -596,198 +601,198 @@ ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::CannotActivate)) { do + { + ImplementationRepository::StartupInfo* psi = + start_server(info, manual_start ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN(0); + + if (psi != 0) { - ImplementationRepository::StartupInfo* psi = - start_server (info, manual_start ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (0); + ImplementationRepository::StartupInfo_var si = psi; + ACE_ASSERT(info.name == si->name.in()); + info.partial_ior = si->partial_ior.in(); + info.ior = si->ior.in(); - if (psi != 0) + if (is_alive(info)) + { + if (debug_ > 1) { - ImplementationRepository::StartupInfo_var si = psi; - ACE_ASSERT (info.name == si->name.in ()); - info.partial_ior = si->partial_ior.in (); - info.ior = si->ior.in (); - - if (is_alive (info)) - { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, "ImR: Successfully activated <%s> at \n\t%s\n", - info.name.c_str (), info.partial_ior.c_str ())); - } - return CORBA::string_dup (info.partial_ior.c_str ()); - } - info.reset (); + ACE_DEBUG((LM_DEBUG, "ImR: Successfully activated <%s> at \n\t%s\n", + info.name.c_str(), info.partial_ior.c_str())); } - } while (info.start_count < info.start_limit); + return CORBA::string_dup(info.partial_ior.c_str()); + } + info.reset(); + } + } while (info.start_count < info.start_limit); if (this->debug_ > 0) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: Cannot Activate <%s>.\n", info.name.c_str ())); - } + { + ACE_DEBUG((LM_DEBUG, + "ImR: Cannot Activate <%s>.\n", info.name.c_str())); + } ACE_THROW_RETURN (ImplementationRepository::CannotActivate - (CORBA::string_dup ("Cannot start server.")), 0); + (CORBA::string_dup ("Cannot start server.")), 0); } ImplementationRepository::StartupInfo* -ImR_Locator_i::start_server (Server_Info& info, bool manual_start ACE_ENV_ARG_DECL) +ImR_Locator_i::start_server(Server_Info& info, bool manual_start ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound, ImplementationRepository::CannotActivate)) { if (info.activation_mode == ImplementationRepository::MANUAL && ! manual_start) - { - if (debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Cannot start server <%s>. ActivationMode=MANUAL\n", info.name.c_str ())); - ACE_THROW_RETURN (ImplementationRepository::CannotActivate - (CORBA::string_dup ("Cannot implicitly activate MANUAL server.")), 0); - } - if (info.cmdline.length () == 0) - { - if (debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Cannot start server <%s>." - " No command line.\n", info.name.c_str ())); - ACE_THROW_RETURN (ImplementationRepository::CannotActivate - (CORBA::string_dup ("No command line registered for server.")), 0); - } + { + if (debug_ > 0) + ACE_DEBUG((LM_DEBUG, "ImR: Cannot start server <%s>. ActivationMode=MANUAL\n", info.name.c_str())); + ACE_THROW_RETURN(ImplementationRepository::CannotActivate + (CORBA::string_dup ("Cannot implicitly activate MANUAL server.")), 0); + } + if (info.cmdline.length() == 0) + { + if (debug_ > 0) + ACE_DEBUG((LM_DEBUG, "ImR: Cannot start server <%s>." + " No command line.\n", info.name.c_str())); + ACE_THROW_RETURN(ImplementationRepository::CannotActivate + (CORBA::string_dup ("No command line registered for server.")), 0); + } - Activator_Info_Ptr ainfo = get_activator (info.activator); + Activator_Info_Ptr ainfo = get_activator(info.activator); - if (ainfo.null () || CORBA::is_nil (ainfo->activator.in ())) - { - if (debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Cannot start server <%s>. " - "Activator <%s> not found.\n", info.name.c_str (), info.activator.c_str ())); - ACE_THROW_RETURN (ImplementationRepository::CannotActivate - (CORBA::string_dup ("No activator registered for server.")), 0); - } + if (ainfo.null() || CORBA::is_nil(ainfo->activator.in())) + { + if (debug_ > 0) + ACE_DEBUG((LM_DEBUG, "ImR: Cannot start server <%s>. " + "Activator <%s> not found.\n", info.name.c_str(), info.activator.c_str())); + ACE_THROW_RETURN(ImplementationRepository::CannotActivate + (CORBA::string_dup ("No activator registered for server.")), 0); + } ACE_TRY - { - ++ info.waiting_clients; - - if (info.waiting_clients <= 1 || info.activation_mode == ImplementationRepository::PER_CLIENT) - { - info.starting = true; - ++info.start_count; - ACE_ASSERT (info.start_count <= info.start_limit); - if (this->debug_ > 0) - { - ACE_DEBUG ((LM_DEBUG, "ImR: Starting server <%s>. Attempt %d/%d.\n", - info.name.c_str (), info.start_count, info.start_limit)); - } - ainfo->activator->start_server ( - info.name.c_str (), - info.cmdline.c_str (), - info.dir.c_str (), - info.env_vars - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - } + { + ++ info.waiting_clients; - if (info.partial_ior.length () == 0) - { - if (this->debug_ > 0) - { - ACE_DEBUG ((LM_DEBUG, "ImR: Waiting for <%s> to start...\n", info.name.c_str ())); - } + if (info.waiting_clients <= 1 || info.activation_mode == ImplementationRepository::PER_CLIENT) + { + info.starting = true; + ++info.start_count; + ACE_ASSERT(info.start_count <= info.start_limit); + if (this->debug_ > 0) + { + ACE_DEBUG ((LM_DEBUG, "ImR: Starting server <%s>. Attempt %d/%d.\n", + info.name.c_str(), info.start_count, info.start_limit)); + } + ainfo->activator->start_server( + info.name.c_str(), + info.cmdline.c_str(), + info.dir.c_str(), + info.env_vars + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } - ImplementationRepository::StartupInfo_var si = - waiter_->wait_for_startup (info.name.c_str () ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; + if (info.partial_ior.length() == 0) + { + if (this->debug_ > 0) + { + ACE_DEBUG ((LM_DEBUG, "ImR: Waiting for <%s> to start...\n", info.name.c_str())); + } - -- info.waiting_clients; - info.starting = false; + ImplementationRepository::StartupInfo_var si = + waiter_->wait_for_startup(info.name.c_str() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - return si._retn (); - } - else // The server_is_running () came in before the wait_for_startup () - { - if (this->debug_ > 0) - { - ACE_DEBUG ((LM_DEBUG, "ImR: <%s> Skipping wait. Already started.\n", info.name.c_str ())); - } - -- info.waiting_clients; - info.starting = false; - } - } - ACE_CATCH (CORBA::TIMEOUT, ex) - { -- info.waiting_clients; info.starting = false; - // We may have connected successfully, because the timeout could occur before - // the AsyncStartupWaiter manages to return. In fact, when the ImR is very busy - // this is the most likely code path. - if (info.partial_ior.length () == 0) - { - if (debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR : Timeout waiting for <%s> to start.\n", info.name.c_str ())); - info.reset (); - } + + return si._retn(); } - ACE_CATCH (ImplementationRepository::CannotActivate, ex) + else // The server_is_running() came in before the wait_for_startup() { + if (this->debug_ > 0) + { + ACE_DEBUG ((LM_DEBUG, "ImR: <%s> Skipping wait. Already started.\n", info.name.c_str())); + } -- info.waiting_clients; info.starting = false; - info.reset (); - if (debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Activator cannot start <%s>.\n", info.name.c_str ())); } - ACE_CATCHANY + } + ACE_CATCH(CORBA::TIMEOUT, ex) + { + -- info.waiting_clients; + info.starting = false; + // We may have connected successfully, because the timeout could occur before + // the AsyncStartupWaiter manages to return. In fact, when the ImR is very busy + // this is the most likely code path. + if (info.partial_ior.length() == 0) { - -- info.waiting_clients; - info.starting = false; if (debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Unexpected exception while starting <%s>.\n", info.name.c_str ())); - if (debug_ > 1) - ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, ""); - ainfo->reset (); - info.reset (); + ACE_DEBUG((LM_DEBUG, "ImR : Timeout waiting for <%s> to start.\n", info.name.c_str())); + info.reset(); } + } + ACE_CATCH(ImplementationRepository::CannotActivate, ex) + { + -- info.waiting_clients; + info.starting = false; + info.reset(); + if (debug_ > 0) + ACE_DEBUG((LM_DEBUG, "ImR: Activator cannot start <%s>.\n", info.name.c_str())); + } + ACE_CATCHANY + { + -- info.waiting_clients; + info.starting = false; + if (debug_ > 0) + ACE_DEBUG((LM_DEBUG, "ImR: Unexpected exception while starting <%s>.\n", info.name.c_str())); + if (debug_ > 1) + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, ""); + ainfo->reset(); + info.reset(); + } ACE_ENDTRY; return 0; // This is not a corba call, so a zero should be ok } CORBA::Object_ptr -ImR_Locator_i::set_timeout_policy (CORBA::Object_ptr obj, const ACE_Time_Value& to) +ImR_Locator_i::set_timeout_policy(CORBA::Object_ptr obj, const ACE_Time_Value& to) { - CORBA::Object_var ret (CORBA::Object::_duplicate (obj)); + CORBA::Object_var ret(CORBA::Object::_duplicate(obj)); ACE_TRY_NEW_ENV - { - TimeBase::TimeT timeout; - ORBSVCS_Time::Time_Value_to_TimeT (timeout, to); - CORBA::Any tmp; - tmp <<= timeout; - - CORBA::PolicyList policies (1); - policies.length (1); - policies[0] = orb_->create_policy (Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE, tmp ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; + { + TimeBase::TimeT timeout; + ORBSVCS_Time::Time_Value_to_TimeT (timeout, to); + CORBA::Any tmp; + tmp <<= timeout; - ret = obj->_set_policy_overrides (policies, CORBA::ADD_OVERRIDE ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; + CORBA::PolicyList policies(1); + policies.length(1); + policies[0] = orb_->create_policy(Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE, tmp ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - policies[0]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; + ret = obj->_set_policy_overrides (policies, CORBA::ADD_OVERRIDE ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - if (CORBA::is_nil (ret.in ())) - { - if (this->debug_ > 0) - { - ACE_DEBUG ((LM_DEBUG, "ImR: Unable to set timeout policy.\n")); - } - ret = CORBA::Object::_duplicate (obj); - } - } - ACE_CATCHANY + policies[0]->destroy(ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (CORBA::is_nil(ret.in())) { - ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ImR_Locator_i::set_timeout_policy ()"); + if (this->debug_ > 0) + { + ACE_DEBUG ((LM_DEBUG, "ImR: Unable to set timeout policy.\n")); + } + ret = CORBA::Object::_duplicate(obj); } + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ImR_Locator_i::set_timeout_policy()"); + } ACE_ENDTRY; - return ret._retn (); + return ret._retn(); } void @@ -797,213 +802,213 @@ ImR_Locator_i::add_or_update_server (const char* server, ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound)) { - ACE_ASSERT (server != 0); + ACE_ASSERT(server != 0); if (this->read_only_) - { - ACE_DEBUG ((LM_DEBUG, "ImR: Cannot add/update server <%s> due to locked database.\n", server)); - ACE_THROW (CORBA::NO_PERMISSION ( - CORBA::SystemException::_tao_minor_code (TAO_IMPLREPO_MINOR_CODE, 0), - CORBA::COMPLETED_NO)); - } + { + ACE_DEBUG((LM_DEBUG, "ImR: Cannot add/update server <%s> due to locked database.\n", server)); + ACE_THROW (CORBA::NO_PERMISSION ( + CORBA::SystemException::_tao_minor_code (TAO_IMPLREPO_MINOR_CODE, 0), + CORBA::COMPLETED_NO)); + } if (debug_ > 0) ACE_DEBUG ((LM_DEBUG, "ImR: Add/Update server <%s>.\n", server)); int limit = options.start_limit; if (limit < 0) - { - limit = -limit; - } + { + limit = -limit; + } else if (limit == 0) - { - limit = 1; - } + { + limit = 1; + } - Server_Info_Ptr info = this->repository_.get_server (server); - if (info.null ()) - { - if (this->debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR: Adding server <%s>.\n", server)); - - this->repository_.add_server (server, - options.activator.in (), - options.command_line.in (), - options.environment, - options.working_directory.in (), - options.activation, - limit); - } + Server_Info_Ptr info = this->repository_.get_server(server); + if (info.null()) + { + if (this->debug_ > 1) + ACE_DEBUG((LM_DEBUG, "ImR: Adding server <%s>.\n", server)); + + this->repository_.add_server (server, + options.activator.in(), + options.command_line.in (), + options.environment, + options.working_directory.in (), + options.activation, + limit); + } else - { - if (this->debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR: Updating server <%s>.\n", server)); - - info->activator = options.activator.in (); - info->cmdline = options.command_line.in (); - info->env_vars = options.environment; - info->dir = options.working_directory.in (); - info->activation_mode = options.activation; - info->start_limit = limit; - info->start_count = 0; - int err = this->repository_.update_server (*info); - ACE_ASSERT (err == 0); - ACE_UNUSED_ARG (err); - } + { + if (this->debug_ > 1) + ACE_DEBUG((LM_DEBUG, "ImR: Updating server <%s>.\n", server)); + + info->activator = options.activator.in(); + info->cmdline = options.command_line.in(); + info->env_vars = options.environment; + info->dir = options.working_directory.in(); + info->activation_mode = options.activation; + info->start_limit = limit; + info->start_count = 0; + int err = this->repository_.update_server(*info); + ACE_ASSERT(err == 0); + ACE_UNUSED_ARG(err); + } if (this->debug_ > 1) - { - // Note : The info var may be null, so we use options. - ACE_DEBUG ((LM_DEBUG, "ImR: Server: %s\n" - "\tActivator: %s\n" - "\tCommand Line: %s\n" - "\tWorking Directory: %s\n" - "\tActivation: %s\n" - "\tStart Limit: %d\n" - "\n", - server, - options.activator.in (), - options.command_line.in (), - options.working_directory.in (), - ImR_Utils::activationModeToString (options.activation).c_str (), - limit - )); - - 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 ())); - } + { + // Note : The info var may be null, so we use options. + ACE_DEBUG ((LM_DEBUG, "ImR: Server: %s\n" + "\tActivator: %s\n" + "\tCommand Line: %s\n" + "\tWorking Directory: %s\n" + "\tActivation: %s\n" + "\tStart Limit: %d\n" + "\n", + server, + options.activator.in(), + options.command_line.in (), + options.working_directory.in (), + ImR_Utils::activationModeToString(options.activation).c_str(), + limit + )); + + 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())); + } } void ImR_Locator_i::remove_server (const char* name ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound)) { - ACE_ASSERT (name != 0); + ACE_ASSERT(name != 0); if (this->read_only_) - { - ACE_ERROR ((LM_ERROR, - "ImR: Can't remove server <%s> due to locked database.\n", name)); - ACE_THROW (CORBA::NO_PERMISSION ( - CORBA::SystemException::_tao_minor_code (TAO_IMPLREPO_MINOR_CODE, 0), - CORBA::COMPLETED_NO)); - } + { + ACE_ERROR ((LM_ERROR, + "ImR: Can't remove server <%s> due to locked database.\n", name)); + ACE_THROW (CORBA::NO_PERMISSION ( + CORBA::SystemException::_tao_minor_code (TAO_IMPLREPO_MINOR_CODE, 0), + CORBA::COMPLETED_NO)); + } // Note : This will be safe, because any Server_Info_Ptr objects will still // be valid, and the actual Server_Info will be destroyed when the last // one goes out of scope. - Server_Info_Ptr info = this->repository_.get_server (name); - if (! info.null ()) + Server_Info_Ptr info = this->repository_.get_server(name); + if (! info.null()) + { + if (this->repository_.remove_server (name) == 0) { - if (this->repository_.remove_server (name) == 0) - { - if (this->debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR: Removing Server <%s>...\n", name)); - - PortableServer::POA_var poa = findPOA (name); - ACE_CHECK; - if (! CORBA::is_nil (poa.in ())) - { - bool etherealize = true; - bool wait = false; - poa->destroy (etherealize, wait ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - } - if (this->debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Removed Server <%s>.\n", name)); - } + if (this->debug_ > 1) + ACE_DEBUG ((LM_DEBUG, "ImR: Removing Server <%s>...\n", name)); + + PortableServer::POA_var poa = findPOA(name); + ACE_CHECK; + if (! CORBA::is_nil(poa.in())) + { + bool etherealize = true; + bool wait = false; + poa->destroy(etherealize, wait ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } + if (this->debug_ > 0) + ACE_DEBUG ((LM_DEBUG, "ImR: Removed Server <%s>.\n", name)); } + } else - { - ACE_ERROR ((LM_ERROR, - "ImR: Can't remove unknown server <%s>.\n", name)); - ACE_THROW (ImplementationRepository::NotFound ()); - } + { + ACE_ERROR ((LM_ERROR, + "ImR: Can't remove unknown server <%s>.\n", name)); + ACE_THROW (ImplementationRepository::NotFound ()); + } } PortableServer::POA_ptr -ImR_Locator_i::findPOA (const char* name) +ImR_Locator_i::findPOA(const char* name) { ACE_TRY_NEW_ENV - { - bool activate_it = false; - return root_poa_->find_POA (name, activate_it ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - } + { + bool activate_it = false; + return root_poa_->find_POA(name, activate_it ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } ACE_CATCHANY - {// Ignore - } + {// Ignore + } ACE_ENDTRY; - return PortableServer::POA::_nil (); + return PortableServer::POA::_nil(); } void ImR_Locator_i::shutdown_server (const char* server ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound)) { - ACE_ASSERT (server != 0); + ACE_ASSERT(server != 0); if (this->debug_ > 0) ACE_DEBUG ((LM_DEBUG, "ImR: Shutting down server <%s>.\n", server)); - Server_Info_Ptr info = this->repository_.get_server (server); - if (info.null ()) - { - ACE_ERROR ((LM_ERROR, - "ImR: shutdown_server () Cannot find info for server <%s>\n", server)); - ACE_THROW (ImplementationRepository::NotFound ()); - } + Server_Info_Ptr info = this->repository_.get_server(server); + if (info.null()) + { + ACE_ERROR ((LM_ERROR, + "ImR: shutdown_server() Cannot find info for server <%s>\n", server)); + ACE_THROW(ImplementationRepository::NotFound()); + } - connect_server (*info); + connect_server(*info); - if (CORBA::is_nil (info->server.in ())) - { - ACE_ERROR ((LM_ERROR, - "ImR: shutdown_server () Cannot connect to server <%s>\n", server)); - ACE_THROW (ImplementationRepository::NotFound ()); - } + if (CORBA::is_nil(info->server.in())) + { + ACE_ERROR ((LM_ERROR, + "ImR: shutdown_server() Cannot connect to server <%s>\n", server)); + ACE_THROW(ImplementationRepository::NotFound()); + } ACE_TRY_NEW_ENV - { - CORBA::Object_var obj = set_timeout_policy (info->server.in (), DEFAULT_SHUTDOWN_TIMEOUT); - ImplementationRepository::ServerObject_var server = - ImplementationRepository::ServerObject::_unchecked_narrow (obj.in () ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - server->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; - } - ACE_CATCH (CORBA::TIMEOUT, ex) - { - info->reset (); - int err = this->repository_.update_server (*info); - ACE_ASSERT (err == 0); - ACE_UNUSED_ARG (err); - // Note : This is a good thing. It means we didn't waste our time waiting for - // the server to finish shutting down. - if (this->debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, "ImR: Timeout while waiting for <%s> shutdown.\n", server)); - } - ACE_RE_THROW; - } + { + CORBA::Object_var obj = set_timeout_policy(info->server.in(), DEFAULT_SHUTDOWN_TIMEOUT); + ImplementationRepository::ServerObject_var server = + ImplementationRepository::ServerObject::_unchecked_narrow (obj.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + server->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCH(CORBA::TIMEOUT, ex) + { + info->reset(); + int err = this->repository_.update_server(*info); + ACE_ASSERT(err == 0); + ACE_UNUSED_ARG(err); + // Note : This is a good thing. It means we didn't waste our time waiting for + // the server to finish shutting down. + if (this->debug_ > 1) + { + ACE_DEBUG((LM_DEBUG, "ImR: Timeout while waiting for <%s> shutdown.\n", server)); + } + ACE_RE_THROW; + } ACE_CATCHANY + { + if (this->debug_ > 1) { - if (this->debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, "ImR: Exception ignored while shutting down <%s>\n", server)); - } + ACE_DEBUG((LM_DEBUG, "ImR: Exception ignored while shutting down <%s>\n", server)); } + } ACE_ENDTRY; - // Note : In most cases this has already been done in the server_is_shutting_down () + // Note : In most cases this has already been done in the server_is_shutting_down() // operation, but it doesn't hurt to update it again. - info->reset (); + info->reset(); - int err = this->repository_.update_server (*info); - ACE_ASSERT (err == 0); - ACE_UNUSED_ARG (err); + int err = this->repository_.update_server(*info); + ACE_ASSERT(err == 0); + ACE_UNUSED_ARG(err); } void @@ -1014,9 +1019,9 @@ ImR_Locator_i::server_is_running (const char* name, ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound)) { - ACE_ASSERT (name != 0); - ACE_ASSERT (partial_ior != 0); - ACE_ASSERT (! CORBA::is_nil (server)); + ACE_ASSERT(name != 0); + ACE_ASSERT(partial_ior != 0); + ACE_ASSERT(! CORBA::is_nil(server)); if (this->debug_ > 0) ACE_DEBUG ((LM_DEBUG, "ImR: Server %s is running at %s.\n", name, partial_ior)); @@ -1025,71 +1030,71 @@ ImR_Locator_i::server_is_running (const char* name, ACE_CHECK; if (this->debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR: Server %s callback at %s.\n", name, ior.in ())); - - Server_Info_Ptr info = this->repository_.get_server (name); - if (info.null ()) - { - if (this->debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Auto adding NORMAL server <%s>.\n", name)); - - ImplementationRepository::EnvironmentList env (0); - this->repository_.add_server (name, - "", // no activator - "", // no cmdline - ImplementationRepository::EnvironmentList (), - "", // no working dir - ImplementationRepository::NORMAL, - DEFAULT_START_LIMIT, - partial_ior, - ior.in (), - ImplementationRepository::ServerObject::_nil () // Will connect at first access - ); - } + ACE_DEBUG ((LM_DEBUG, "ImR: Server %s callback at %s.\n", name, ior.in())); + + Server_Info_Ptr info = this->repository_.get_server(name); + if (info.null()) + { + if (this->debug_ > 0) + ACE_DEBUG ((LM_DEBUG, "ImR: Auto adding NORMAL server <%s>.\n", name)); + + ImplementationRepository::EnvironmentList env(0); + this->repository_.add_server (name, + "", // no activator + "", // no cmdline + ImplementationRepository::EnvironmentList(), + "", // no working dir + ImplementationRepository::NORMAL, + DEFAULT_START_LIMIT, + partial_ior, + ior.in(), + ImplementationRepository::ServerObject::_nil() // Will connect at first access + ); + } else - { - if (info->activation_mode != ImplementationRepository::PER_CLIENT) { - info->ior = ior.in (); - info->partial_ior = partial_ior; - info->server = ImplementationRepository::ServerObject::_nil (); // Will connect at first access - - int err = this->repository_.update_server (*info); - ACE_ASSERT (err == 0); - ACE_UNUSED_ARG (err); - - waiter_svt_.unblock_one (name, partial_ior, ior.in (), false); - } else { - // Note : There's no need to unblock all the waiting request until - // we know the final status of the server. - waiter_svt_.unblock_one (name, partial_ior, ior.in (), true); - } + { + if (info->activation_mode != ImplementationRepository::PER_CLIENT) { + info->ior = ior.in(); + info->partial_ior = partial_ior; + info->server = ImplementationRepository::ServerObject::_nil(); // Will connect at first access + + int err = this->repository_.update_server(*info); + ACE_ASSERT(err == 0); + ACE_UNUSED_ARG(err); + + waiter_svt_.unblock_one(name, partial_ior, ior.in(), false); + } else { + // Note : There's no need to unblock all the waiting request until + // we know the final status of the server. + waiter_svt_.unblock_one(name, partial_ior, ior.in(), true); } + } } void ImR_Locator_i::server_is_shutting_down (const char* server ACE_ENV_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException, ImplementationRepository::NotFound)) { - ACE_ASSERT (server != 0); - Server_Info_Ptr info = this->repository_.get_server (server); - if (info.null ()) + ACE_ASSERT(server != 0); + Server_Info_Ptr info = this->repository_.get_server(server); + if (info.null()) + { + if (this->debug_ > 1) { - if (this->debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, - "ImR_Locator_i::server_is_shutting_down: Unknown server:%s\n", server)); - } - return; + ACE_DEBUG((LM_DEBUG, + "ImR_Locator_i::server_is_shutting_down: Unknown server:%s\n", server)); } + return; + } if (this->debug_ > 0) - ACE_DEBUG ((LM_DEBUG, "ImR: Server <%s> is shutting down.\n", server)); + ACE_DEBUG((LM_DEBUG, "ImR: Server <%s> is shutting down.\n", server)); - info->reset (); + info->reset(); - int err = this->repository_.update_server (*info); - ACE_ASSERT (err == 0); - ACE_UNUSED_ARG (err); + int err = this->repository_.update_server(*info); + ACE_ASSERT(err == 0); + ACE_UNUSED_ARG(err); } void @@ -1098,22 +1103,22 @@ ImR_Locator_i::find (const char* server, ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException)) { - ACE_ASSERT (server != 0); + ACE_ASSERT(server != 0); ACE_NEW_THROW_EX (imr_info, ImplementationRepository::ServerInformation, CORBA::NO_MEMORY ()); - Server_Info_Ptr info = this->repository_.get_server (server); - if (! info.null ()) - { - imr_info = info->createImRServerInfo (ACE_ENV_SINGLE_ARG_PARAMETER); + Server_Info_Ptr info = this->repository_.get_server(server); + if (! info.null()) + { + imr_info = info->createImRServerInfo(ACE_ENV_SINGLE_ARG_PARAMETER); - if (this->debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR: Found server %s.\n", server)); - } + if (this->debug_ > 1) + ACE_DEBUG ((LM_DEBUG, "ImR: Found server %s.\n", server)); +} else - { - if (debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR: Cannot find server <%s>\n", server)); - } + { + if (debug_ > 1) + ACE_DEBUG((LM_DEBUG, "ImR: Cannot find server <%s>\n", server)); + } } void @@ -1128,405 +1133,400 @@ ImR_Locator_i::list (CORBA::ULong how_many, // Initialize the out variables, so if we return early, they will // not be dangling. - server_iterator = ImplementationRepository::ServerInformationIterator::_nil (); + server_iterator = ImplementationRepository::ServerInformationIterator::_nil(); ACE_NEW_THROW_EX (server_list, - ImplementationRepository::ServerInformationList (0), CORBA::NO_MEMORY ()); + ImplementationRepository::ServerInformationList(0), CORBA::NO_MEMORY()); Locator_Repository::SIMap::ENTRY* entry = 0; - Locator_Repository::SIMap::ITERATOR it (this->repository_.servers ()); + Locator_Repository::SIMap::ITERATOR it(this->repository_.servers()); // Number of servers that will go into the server_list. - CORBA::ULong n = this->repository_.servers ().current_size (); + CORBA::ULong n = this->repository_.servers().current_size(); if (how_many > 0 && n > how_many) - { - n = how_many; - } + { + n = how_many; + } - server_list->length (n); + server_list->length(n); if (this->debug_ > 1) ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::list: Filling ServerList with %d servers\n", n)); for (CORBA::ULong i = 0; i < n; i++) - { - it.next (entry); - it.advance (); - ACE_ASSERT (entry != 0); + { + it.next(entry); + it.advance(); + ACE_ASSERT(entry != 0); - Server_Info_Ptr info = entry->int_id_; + Server_Info_Ptr info = entry->int_id_; - ImplementationRepository::ServerInformation_var imr_info = info->createImRServerInfo (ACE_ENV_SINGLE_ARG_PARAMETER); - server_list[i] = *imr_info; - } + ImplementationRepository::ServerInformation_var imr_info = info->createImRServerInfo(ACE_ENV_SINGLE_ARG_PARAMETER); + server_list[i] = *imr_info; + } - if (this->repository_.servers ().current_size () > n) - { - if (this->debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::list: Creating ServerInformation Iterator\n")); + if (this->repository_.servers().current_size() > n) + { + if (this->debug_ > 1) + ACE_DEBUG ((LM_DEBUG, "ImR_Locator_i::list: Creating ServerInformation Iterator\n")); - ImR_Iterator* imr_iter; + ImR_Iterator* imr_iter; - ACE_NEW_THROW_EX (imr_iter, - ImR_Iterator (n, this->repository_, this->imr_poa_.in ()), - CORBA::NO_MEMORY ()); + ACE_NEW_THROW_EX (imr_iter, + ImR_Iterator (n, this->repository_, this->imr_poa_.in()), + CORBA::NO_MEMORY ()); - PortableServer::ServantBase_var tmp (imr_iter); + PortableServer::ServantBase_var tmp(imr_iter); - ACE_TRY - { - PortableServer::ObjectId_var id = - this->imr_poa_->activate_object (imr_iter ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - CORBA::Object_var obj = this->imr_poa_->id_to_reference (id.in () ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - server_iterator = ImplementationRepository:: - ServerInformationIterator::_unchecked_narrow (obj.in () ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - } - ACE_CATCHANY - { - ACE_RE_THROW; - } - ACE_ENDTRY; - ACE_CHECK; + ACE_TRY + { + PortableServer::ObjectId_var id = + this->imr_poa_->activate_object (imr_iter ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + CORBA::Object_var obj = this->imr_poa_->id_to_reference(id.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + server_iterator = ImplementationRepository:: + ServerInformationIterator::_unchecked_narrow(obj.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCHANY + { + ACE_RE_THROW; } + ACE_ENDTRY; + ACE_CHECK; + } } Activator_Info_Ptr ImR_Locator_i::get_activator (const ACE_CString& aname) { Activator_Info_Ptr info = this->repository_.get_activator (aname); - if (! info.null ()) - { - this->connect_activator (*info); - } + if (! info.null()) + { + this->connect_activator (*info); + } return info; } void ImR_Locator_i::connect_activator (Activator_Info& info) { - if (! CORBA::is_nil (info.activator.in ()) || info.ior.length () == 0) + if (! CORBA::is_nil(info.activator.in()) || info.ior.length() == 0) return; ACE_TRY_NEW_ENV - { - CORBA::Object_var obj = - this->orb_->string_to_object (info.ior.c_str () - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; + { + CORBA::Object_var obj = + this->orb_->string_to_object (info.ior.c_str() + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - if (CORBA::is_nil (obj.in ())) - { - info.reset (); - return; - } - - if (startup_timeout_ > ACE_Time_Value::zero) - { - obj = set_timeout_policy (obj.in (), startup_timeout_); - } + if (CORBA::is_nil(obj.in())) + { + info.reset(); + return; + } - info.activator = - ImplementationRepository::Activator::_unchecked_narrow (obj.in () ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; + if (startup_timeout_ > ACE_Time_Value::zero) + { + obj = set_timeout_policy(obj.in(), startup_timeout_); + } - if (CORBA::is_nil (info.activator.in ())) - { - info.reset (); - return; - } + info.activator = + ImplementationRepository::Activator::_unchecked_narrow (obj.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - if (debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR: Connected to activator <%s>\n", info.name.c_str ())); - } - ACE_CATCHANY + if (CORBA::is_nil(info.activator.in())) { - info.reset (); + info.reset(); + return; } + + if (debug_ > 1) + ACE_DEBUG((LM_DEBUG, "ImR: Connected to activator <%s>\n", info.name.c_str())); + } + ACE_CATCHANY + { + info.reset(); + } ACE_ENDTRY; } void -ImR_Locator_i::auto_start_servers (ACE_ENV_SINGLE_ARG_DECL) +ImR_Locator_i::auto_start_servers(ACE_ENV_SINGLE_ARG_DECL) { - if (this->repository_.servers ().current_size () == 0) + if (this->repository_.servers().current_size() == 0) return; Locator_Repository::SIMap::ENTRY* server_entry; - Locator_Repository::SIMap::ITERATOR server_iter (this->repository_.servers ()); + Locator_Repository::SIMap::ITERATOR server_iter(this->repository_.servers()); // For each of the entries in the Locator_Repository, get the startup // information and activate the servers, if they are not already // running. - for (;server_iter.next (server_entry) != 0; server_iter.advance ()) + for (;server_iter.next(server_entry) != 0; server_iter.advance()) + { + Server_Info_Ptr info = server_entry->int_id_; + ACE_ASSERT(! info.null()); + + ACE_TRY + { + if (info->activation_mode == ImplementationRepository::AUTO_START + && info->cmdline.length() > 0) + { + this->activate_server_i (*info, true ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + } + ACE_CATCHANY { - Server_Info_Ptr info = server_entry->int_id_; - ACE_ASSERT (! info.null ()); - - ACE_TRY - { - if (info->activation_mode == ImplementationRepository::AUTO_START - && info->cmdline.length () > 0) - { - this->activate_server_i (*info, true ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - } - } - ACE_CATCHANY - { - if (this->debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: 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; - ACE_CHECK; + if (this->debug_ > 1) + { + ACE_DEBUG ((LM_DEBUG, + "ImR: 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; + ACE_CHECK; + } } void -ImR_Locator_i::connect_server (Server_Info& info) +ImR_Locator_i::connect_server(Server_Info& info) { - if (! CORBA::is_nil (info.server.in ())) - { - return; // already connected - } + if (! CORBA::is_nil(info.server.in())) + { + return; // already connected + } - if (info.ior.length () == 0) - { - info.reset (); - return; // can't connect - } + if (info.ior.length() == 0) + { + info.reset(); + return; // can't connect + } ACE_TRY_NEW_ENV - { - CORBA::Object_var obj = orb_->string_to_object (info.ior.c_str () ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; + { + CORBA::Object_var obj = orb_->string_to_object (info.ior.c_str() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - if (CORBA::is_nil (obj.in ())) - { - info.reset (); - return; - } + if (CORBA::is_nil(obj.in())) + { + info.reset(); + return; + } - obj = set_timeout_policy (obj.in (), DEFAULT_SERVER_TIMEOUT); + obj = set_timeout_policy(obj.in(), DEFAULT_SERVER_TIMEOUT); - info.server = - ImplementationRepository::ServerObject::_unchecked_narrow (obj.in () ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - if (CORBA::is_nil (info.server.in ())) - { - info.reset (); - return; - } + info.server = + ImplementationRepository::ServerObject::_unchecked_narrow (obj.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - if (debug_ > 1) - ACE_DEBUG ((LM_DEBUG, "ImR: Connected to server <%s>\n", info.name.c_str ())); - } - ACE_CATCHANY + if (CORBA::is_nil(info.server.in())) { - info.reset (); + info.reset(); + return; } + + if (debug_ > 1) + ACE_DEBUG((LM_DEBUG, "ImR: Connected to server <%s>\n", info.name.c_str())); + } + ACE_CATCHANY + { + info.reset(); + } ACE_ENDTRY; } bool -ImR_Locator_i::is_alive (Server_Info& info) +ImR_Locator_i::is_alive(Server_Info& info) { - const size_t table_size = sizeof (PING_RETRY_SCHEDULE) / - sizeof (*PING_RETRY_SCHEDULE); - - for (size_t i = 0; i < table_size; ++i) - { - int status = this->is_alive_i (info); - if (status == 0) - return false; - if (status == 1) - return true; - - // This is evil, but there's not much else we can do for now. We - // should never reach this code once the ImR Servers are fixed - // so that they don't lie about server_is_running. Currently, - // they send this notification during poa creation. We have to - // run the orb, because the very thing that may be slowing the - // aliveness of the servers is the fact that they're trying to - // register more objects with us. In practical testing, we - // never retried the ping more than once, because the second - // ping always timed out, even if the servers poa manager had - // not been activated. The only way we saw multiple retries was - // if we ran the orb on the server before the poa manager was - // activated. For this reason, the first retry is immediate, - // and the orb->run () call is not required. The call will - // likely timeout, and is_alive will return true. - if (PING_RETRY_SCHEDULE[i] > 0) - { - ACE_Time_Value tv (0, PING_RETRY_SCHEDULE[i] * 1000); - this->orb_->run (tv); - } + for (size_t i = 0; i < sizeof(PING_RETRY_SCHEDULE) + 1; ++i) + { + int status = this->is_alive_i(info); + if (status == 0) + return false; + if (status == 1) + return true; + + // This is evil, but there's not much else we can do for now. We should never + // reach this code once the ImR Servers are fixed so that they don't lie about + // server_is_running. Currently, they send this notification during poa creation. + // We have to run the orb, because the very thing that may be slowing the + // aliveness of the servers is the fact that they're trying to register more + // objects with us. + // In practical testing, we never retried the ping more than once, because + // the second ping always timed out, even if the servers poa manager had + // not been activated. The only way we saw multiple retries was if we ran + // the orb on the server before the poa manager was activated. + // For this reason, the first retry is immediate, and the orb->run() call + // is not required. The call will likely timeout, and is_alive will return true. + if (PING_RETRY_SCHEDULE[i] > 0) + { + ACE_Time_Value tv(0, PING_RETRY_SCHEDULE[i] * 1000); + this->orb_->run(tv); } + } if (debug_ > 0) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: <%s> Ping retry count exceeded. alive=maybe.\n", info.name.c_str ())); - } + { + ACE_DEBUG((LM_DEBUG, + "ImR: <%s> Ping retry count exceeded. alive=maybe.\n", info.name.c_str())); + } // We return true here, because the server *might* be alive, it's just not starting in a timely // manner. We can't return false, because then we'll just try to start another instance, and the // same thing will likely happen. - info.last_ping = ACE_OS::gettimeofday (); + info.last_ping = ACE_OS::gettimeofday(); return true; } int -ImR_Locator_i::is_alive_i (Server_Info& info) +ImR_Locator_i::is_alive_i(Server_Info& info) { // This is used by the ACE_TRY below when exceptions are turned off. ACE_DECLARE_NEW_CORBA_ENV; - if (info.ior.length () == 0 || info.partial_ior.length () == 0) + if (info.ior.length() == 0 || info.partial_ior.length() == 0) + { + if (debug_ > 1) { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: <%s> not running. alive=false.\n", info.name.c_str ())); - } - info.last_ping = ACE_Time_Value::zero; - return 0; + ACE_DEBUG((LM_DEBUG, + "ImR: <%s> not running. alive=false.\n", info.name.c_str())); } + info.last_ping = ACE_Time_Value::zero; + return 0; + } if (ping_interval_ == ACE_Time_Value::zero) + { + if (debug_ > 1) { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: <%s> Ping verification disabled. alive=true.\n", info.name.c_str ())); - } - return 1; + ACE_DEBUG((LM_DEBUG, + "ImR: <%s> Ping verification disabled. alive=true.\n", info.name.c_str())); } + return 1; + } - if ((ACE_OS::gettimeofday () - info.last_ping) < ping_interval_) + if ((ACE_OS::gettimeofday() - info.last_ping) < ping_interval_) + { + if (debug_ > 1) { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: <%s> within ping interval. alive=true.\n", info.name.c_str ())); - } - return 1; + ACE_DEBUG((LM_DEBUG, + "ImR: <%s> within ping interval. alive=true.\n", info.name.c_str())); } + return 1; + } // If we don't have enough information to start the server if it isn't already // then we might as well assume it is running. That way the client can get the // status directly from the server. - if (info.cmdline.length () == 0 || ! repository_.has_activator (info.activator)) + if (info.cmdline.length() == 0 || ! repository_.has_activator(info.activator)) + { + if (debug_ > 1) { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: Ping verification skipped. <%s> not startable.\n", info.name.c_str ())); - } - return 1; + ACE_DEBUG((LM_DEBUG, + "ImR: Ping verification skipped. <%s> not startable.\n", info.name.c_str())); } + return 1; + } - connect_server (info); + connect_server(info); - if (CORBA::is_nil (info.server.in ())) + if (CORBA::is_nil (info.server.in())) + { + if (debug_ > 1) { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: <%s> Could not connect. alive=false.\n", info.name.c_str ())); - } - return 0; + ACE_DEBUG((LM_DEBUG, + "ImR: <%s> Could not connect. alive=false.\n", info.name.c_str())); } + return 0; + } ACE_TRY - { - // Make a copy, in case the info is updated during the ping. - ImplementationRepository::ServerObject_var server = info.server; + { + // Make a copy, in case the info is updated during the ping. + ImplementationRepository::ServerObject_var server = info.server; - // This will timeout if it takes too long - server->ping (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; + // This will timeout if it takes too long + server->ping (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; - if (debug_ > 1) + if (debug_ > 1) + { + ACE_DEBUG((LM_DEBUG, + "ImR: <%s> Ping successful. alive=true\n", info.name.c_str())); + } + info.last_ping = ACE_OS::gettimeofday(); + } + ACE_CATCH(CORBA::TRANSIENT, ex) + { + const CORBA::ULong BITS_5_THRU_12_MASK = 0x00000f80; + switch (ex.minor() & BITS_5_THRU_12_MASK) + { + case TAO_INVOCATION_SEND_REQUEST_MINOR_CODE: + { + if (debug_ > 1) { - ACE_DEBUG ((LM_DEBUG, - "ImR: <%s> Ping successful. alive=true\n", info.name.c_str ())); + ACE_DEBUG((LM_DEBUG, + "ImR: <%s> Local TRANSIENT. alive=false.\n", info.name.c_str())); } - info.last_ping = ACE_OS::gettimeofday (); - } - ACE_CATCH (CORBA::TRANSIENT, ex) - { - const CORBA::ULong BITS_5_THRU_12_MASK = 0x00000f80; - switch (ex.minor () & BITS_5_THRU_12_MASK) + } + info.last_ping = ACE_Time_Value::zero; + return 0; + case TAO_POA_DISCARDING: + case TAO_POA_HOLDING: + { + if (debug_ > 1) { - case TAO_INVOCATION_SEND_REQUEST_MINOR_CODE: - { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: <%s> Local TRANSIENT. alive=false.\n", info.name.c_str ())); - } - } - info.last_ping = ACE_Time_Value::zero; - return 0; - case TAO_POA_DISCARDING: - case TAO_POA_HOLDING: - { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: <%s> Remote TRANSIENT. alive=maybe.\n", info.name.c_str ())); - } - } - return -1; // We keep trying to ping, because returning 1 now, would just lead - // to clients getting the same exception. If we can't ping after several - // attempts, then we'll give up and return 1, letting the client worry about it. - default: - { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, - "ImR: <%s> TRANSIENT exception. alive=false.\n", info.name.c_str ())); - } - info.last_ping = ACE_Time_Value::zero; - } - return 0; + ACE_DEBUG((LM_DEBUG, + "ImR: <%s> Remote TRANSIENT. alive=maybe.\n", info.name.c_str())); } - } - ACE_CATCH (CORBA::TIMEOUT, ex) - { - if (debug_ > 1) + } + return -1; // We keep trying to ping, because returning 1 now, would just lead + // to clients getting the same exception. If we can't ping after several + // attempts, then we'll give up and return 1, letting the client worry about it. + default: + { + if (debug_ > 1) { - ACE_DEBUG ((LM_DEBUG, - "ImR: <%s> Ping timed out. alive=true.\n", info.name.c_str ())); + ACE_DEBUG((LM_DEBUG, + "ImR: <%s> TRANSIENT exception. alive=false.\n", info.name.c_str())); } - return 1; // This is "alive" as far as we're concerned. Presumably the client - // will have a less stringent timeout policy, or will want to know - // about the timeout. In any case, we're only guaranteeing that the - // server is alive, not that it's responsive. + info.last_ping = ACE_Time_Value::zero; + } + return 0; + } + } + ACE_CATCH(CORBA::TIMEOUT, ex) + { + if (debug_ > 1) + { + ACE_DEBUG((LM_DEBUG, + "ImR: <%s> Ping timed out. alive=true.\n", info.name.c_str())); } + return 1; // This is "alive" as far as we're concerned. Presumably the client + // will have a less stringent timeout policy, or will want to know + // about the timeout. In any case, we're only guaranteeing that the + // server is alive, not that it's responsive. + } ACE_CATCHANY + { + if (debug_ > 1) { - if (debug_ > 1) - { - ACE_DEBUG ((LM_DEBUG, "ImR: <%s> Unexpected Ping exception. alive=false\n", info.name.c_str ())); - ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "\n"); - } - info.last_ping = ACE_Time_Value::zero; - return false; + ACE_DEBUG((LM_DEBUG, "ImR: <%s> Unexpected Ping exception. alive=false\n", info.name.c_str())); + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "\n"); } + info.last_ping = ACE_Time_Value::zero; + return false; + } ACE_ENDTRY; return 1; } int -ImR_Locator_i::debug () const +ImR_Locator_i::debug() const { return debug_; } |