Move base_process_service timer expiry handling out of friend class.
authorDavin McCall <davmac@davmac.org>
Sat, 13 Jan 2018 18:52:22 +0000 (18:52 +0000)
committerDavin McCall <davmac@davmac.org>
Sat, 13 Jan 2018 18:52:22 +0000 (18:52 +0000)
One less friend class is a good thing. The timer now just calls a single
public 'timer_expiry' function. The latter function can also be used in
tests.

src/baseproc-service.cc
src/includes/proc-service.h
src/proc-service.cc
src/tests/test-baseproc.cc

index ac5664b26874017c032c500277abf1cef7eac91b..1645b0561930693550f3946943bcce0bb6bb6954 100644 (file)
@@ -314,3 +314,25 @@ void base_process_service::kill_pg(int signo) noexcept
     }
     kill(-pgid, signo);
 }
+
+void base_process_service::timer_expired() noexcept
+{
+    stop_timer_armed = false;
+
+    // Timer expires if:
+    // We are stopping, including after having startup cancelled (stop timeout, state is STOPPING); We are
+    // starting (start timeout, state is STARTING); We are waiting for restart timer before restarting,
+    // including smooth recovery (restart timeout, state is STARTING or STARTED).
+    if (get_state() == service_state_t::STOPPING) {
+        kill_with_fire();
+    }
+    else if (pid != -1) {
+        // Starting, start timed out.
+        stop_dependents();
+        interrupt_start();
+    }
+    else {
+        // STARTING / STARTED, and we have a pid: must be restarting (smooth recovery if STARTED)
+        do_restart();
+    }
+}
index a1935c770a1afef659ee71bc4dcd4761fd356a34..0952fffb659eb1aa6755cbe0421d8036086e604e 100644 (file)
@@ -26,7 +26,6 @@ class base_process_service : public service_record
 {
     friend class service_child_watcher;
     friend class exec_status_pipe_watcher;
-    friend class process_restart_timer;
     friend class base_process_service_test;
 
     private:
@@ -151,6 +150,9 @@ class base_process_service : public service_record
     {
         start_is_interruptible = value;
     }
+
+    // The restart/stop timer expired.
+    void timer_expired() noexcept;
 };
 
 class process_service : public base_process_service
index 03ab278fb094736c265a91d08123471ebd41589b..168ca52224bb988409c0d0cedecc3f9730a5df23 100644 (file)
@@ -498,24 +498,7 @@ void scripted_service::bring_down() noexcept
 
 dasynq::rearm process_restart_timer::timer_expiry(eventloop_t &, int expiry_count)
 {
-    service->stop_timer_armed = false;
-
-    // Timer expires if:
-    // We are stopping, including after having startup cancelled (stop timeout, state is STOPPING); We are
-    // starting (start timeout, state is STARTING); We are waiting for restart timer before restarting,
-    // including smooth recovery (restart timeout, state is STARTING or STARTED).
-    if (service->get_state() == service_state_t::STOPPING) {
-        service->kill_with_fire();
-    }
-    else if (service->pid != -1) {
-        // Starting, start timed out.
-        service->stop_dependents();
-        service->interrupt_start();
-    }
-    else {
-        // STARTING / STARTED, and we have a pid: must be restarting (smooth recovery if STARTED)
-        service->do_restart();
-    }
+    service->timer_expired();
 
     // Leave the timer disabled, or, if it has been reset by any processing above, leave it armed:
     return dasynq::rearm::NOOP;
index 20a51f6fefe336993d0c31712a2ccd82b8b657bc..c1a41038de0562daabfe18e90040d79fde175f8f 100644 (file)
@@ -211,3 +211,25 @@ bool base_process_service::interrupt_start() noexcept
         return false;
     }
 }
+
+void base_process_service::timer_expired() noexcept
+{
+    stop_timer_armed = false;
+
+    // Timer expires if:
+    // We are stopping, including after having startup cancelled (stop timeout, state is STOPPING); We are
+    // starting (start timeout, state is STARTING); We are waiting for restart timer before restarting,
+    // including smooth recovery (restart timeout, state is STARTING or STARTED).
+    if (get_state() == service_state_t::STOPPING) {
+        kill_with_fire();
+    }
+    else if (pid != -1) {
+        // Starting, start timed out.
+        stop_dependents();
+        interrupt_start();
+    }
+    else {
+        // STARTING / STARTED, and we have a pid: must be restarting (smooth recovery if STARTED)
+        do_restart();
+    }
+}