{
using std::list;
list<service_record *>::const_iterator i = records.begin();
- for ( ; i != records.end(); i++ ) {
+ for ( ; i != records.end(); ++i ) {
if (strcmp((*i)->get_name().c_str(), name) == 0) {
return *i;
}
{
if (have_console) {
bp_sys::tcsetpgrp(0, bp_sys::getpgrp());
- discard_console_log_buffer();
release_console();
}
force_stop = false;
- // If we are a soft dependency of another target, break the acquisition from that target now:
+ // If we are a soft dependency of another target, break the acquisition from that target now,
+ // so that we don't re-start:
for (auto & dependent : dependents) {
if (dependent->dep_type != dependency_type::REGULAR) {
- if (dependent->holding_acq) {
+ if (dependent->holding_acq && ! dependent->waiting_on) {
dependent->holding_acq = false;
release();
}
}
bool will_restart = (desired_state == service_state_t::STARTED)
- && services->get_auto_restart();
+ && !services->is_shutting_down();
- for (auto dependency : depends_on) {
+ for (auto & dependency : depends_on) {
// we signal dependencies in case they are waiting for us to stop:
dependency.get_to()->dependent_stopped();
}
// Start failure will have been logged already, only log if we are stopped for other reasons:
if (! start_failed) {
log_service_stopped(service_name);
+
+ // If this service chains to another, start the other service now:
+ if (! will_restart && ! start_on_completion.empty()) {
+ try {
+ auto chain_to = services->load_service(start_on_completion.c_str());
+ chain_to->start();
+ }
+ catch (service_load_exc &sle) {
+ log(loglevel_t::ERROR, "Couldn't chain to service ", start_on_completion, ": ",
+ "couldn't load ", sle.service_name, ": ", sle.exc_description);
+ }
+ catch (std::bad_alloc &bae) {
+ log(loglevel_t::ERROR, "Couldn't chain to service ", start_on_completion,
+ ": Out of memory");
+ }
+ }
}
notify_listeners(service_event_t::STOPPED);
}
bool service_record::do_auto_restart() noexcept
{
if (auto_restart) {
- return services->get_auto_restart();
+ return !services->is_shutting_down();
}
return false;
}
notify_listeners(service_event_t::STARTED);
if (onstart_flags.rw_ready) {
- open_control_socket();
+ rootfs_is_rw();
}
if (onstart_flags.log_ready) {
setup_external_log();
force_stop = true;
if (! pinned_started) {
prop_stop = true;
- services->add_transition_queue(this);
+ services->add_prop_queue(this);
}
}
}