CORBA::Boolean ImR_Activator_i::kill_server (const char* name, CORBA::Long lastpid, CORBA::Short signum) { if (debug_ > 1) ORBSVCS_DEBUG((LM_DEBUG, "ImR Activator: Killing server <%C>, lastpid = %d\n", name, lastpid)); pid_t lpid = static_cast<pid_t>(lastpid); pid_t pid = 0; bool found = false; int result = -1; for (ProcessMap::iterator iter = process_map_.begin(); !found && iter != process_map_.end (); iter++) { if (iter->item () == name) { pid = iter->key (); found = pid == lpid; } } if (!found && pid == 0) { pid = lpid; } #if defined (ACE_WIN32) found = false; // sigchild apparently doesn't work on windows #endif if (pid != 0) { result = #if !defined (ACE_WIN32) (signum != 9) ? ACE_OS::kill (pid, signum) : #endif ACE::terminate_process (pid); if (this->running_server_list_.remove (name) == 0) { this->dying_server_list_.insert (name); } if (debug_ > 1) ORBSVCS_DEBUG((LM_DEBUG, "ImR Activator: Killing server <%C> " "signal %d to pid %d, found %d, this->notify_imr_ %d, result = %d\n", name, signum, static_cast<int> (pid), found, this->notify_imr_, result)); if (!found && result == 0 && this->notify_imr_) { this->process_map_.bind (pid, name); ACE_Reactor *r = this->orb_->orb_core()->reactor(); Act_token_type token = static_cast<Act_token_type>(pid); r->schedule_timer (this, reinterpret_cast<void *>(token), ACE_Time_Value ()); } } return result == 0; }
CORBA::Boolean ImR_Activator_i::kill_server (const char* name, CORBA::Long lastpid, CORBA::Short signum) { if (debug_ > 1) ORBSVCS_DEBUG((LM_DEBUG, "ImR Activator: Killing server <%s>...\n", name)); pid_t pid = static_cast<pid_t>(lastpid); bool found = false; int result = -1; for (ProcessMap::iterator iter = process_map_.begin(); !found && iter != process_map_.end (); iter++) { if (iter->item () == name) { pid = iter->key (); found = true; } } #if defined (ACE_WIN32) found = false; // sigchild apparently doesn't work on windows #endif if (pid != 0) { result = (signum != 9) ? ACE_OS::kill (pid, signum) : ACE::terminate_process (pid); if (debug_ > 1) ORBSVCS_DEBUG((LM_DEBUG, "ImR Activator: Killing server <%s> " "signal %d to pid %d, result = %d\n", name, signum, pid, result)); if (!found && result == 0 && this->notify_imr_) { this->process_map_.bind (pid, name); #if (ACE_SIZEOF_VOID_P == 8) ACE_INT64 token = static_cast<ACE_INT64>(pid); #else ACE_INT32 token = static_cast<ACE_INT32>(pid); #endif ACE_Reactor *r = this->orb_->orb_core()->reactor(); r->schedule_timer (this, reinterpret_cast<void *>(token), ACE_Time_Value ()); } } return result == 0; }