Set target state to STOPPED when stop is issued
[oweals/dinit.git] / src / service.cc
index 88ec6c698355de7cf7342ebee62fb9c7de3caf12..18987c669ba69cc5e811bc55930f91d3cff1a7e0 100644 (file)
@@ -52,6 +52,9 @@ void service_record::stopped() noexcept
 
     restarting |= auto_restart;
     bool will_restart = restarting && required_by > 0;
+    if (restarting && ! will_restart) {
+        notify_listeners(service_event_t::STARTCANCELLED);
+    }
     restarting = false;
 
     // If we won't restart, break soft dependencies now
@@ -143,6 +146,7 @@ void service_record::release(bool issue_stop) noexcept
 {
     if (--required_by == 0) {
         desired_state = service_state_t::STOPPED;
+        prop_require = false;
 
         // Can stop, and can release dependencies now. We don't need to issue a release if
         // the require was pending though:
@@ -489,6 +493,8 @@ void service_record::stop(bool bring_down) noexcept
         bring_down = true;
     }
 
+    desired_state = service_state_t::STOPPED;
+
     if (bring_down && service_state != service_state_t::STOPPED
                && service_state != service_state_t::STOPPING) {
        stop_reason = stopped_reason_t::NORMAL;
@@ -496,7 +502,7 @@ void service_record::stop(bool bring_down) noexcept
     }
 }
 
-void service_record::restart() noexcept
+bool service_record::restart() noexcept
 {
     // Re-start without affecting dependency links/activation.
 
@@ -504,7 +510,11 @@ void service_record::restart() noexcept
         restarting = true;
         stop_reason = stopped_reason_t::NORMAL;
         do_stop();
+        return true;
     }
+
+    // Wrong state
+    return false;
 }
 
 void service_record::do_stop() noexcept
@@ -551,11 +561,6 @@ void service_record::do_stop() noexcept
 
     if (pinned_started) return;
 
-    if (required_by == 0) {
-        prop_release = true;
-        services->add_prop_queue(this);
-    }
-
     service_state = service_state_t::STOPPING;
     waiting_for_deps = true;
     if (all_deps_stopped) {
@@ -597,6 +602,8 @@ bool service_record::stop_dependents() noexcept
             dept->get_from()->prop_stop = true;
             services->add_prop_queue(dept->get_from());
         }
+        // Note that soft dependencies are held (for now). If we restart, we don't want those dependencies
+        // to be broken.
     }
 
     return all_deps_stopped;