Increase priority of service child status watchers.
authorDavin McCall <davmac@davmac.org>
Thu, 15 Jun 2017 18:37:04 +0000 (19:37 +0100)
committerDavin McCall <davmac@davmac.org>
Thu, 15 Jun 2017 18:37:04 +0000 (19:37 +0100)
We want to make sure that if we send a signal to a service process, we
haven't already reaped that process (since in that case, in theory, the
process ID may have been re-used and we will end up signalling the wrong
process).

src/service.cc

index 764a45112b3bf9a26e6f12f1eeb543a076cf2136..3c802e8cc6f6a1737b16b2d880df4f3e169b0237 100644 (file)
@@ -847,7 +847,11 @@ bool base_process_service::start_ps_process(const std::vector<const char *> &cmd
     pid_t forkpid;
     
     try {
-        child_status_listener.add_watch(eventLoop, pipefd[0], IN_EVENTS);
+        // We add the status listener with a high priority (i.e. low priority value) so that process
+        // termination is handled early. This means we have always recorded that the process is
+        // terminated by the time that we handle events that might otherwise cause us to signal the
+        // process, so we avoid sending a signal to an invalid (and possibly recycled) process ID.
+        child_status_listener.add_watch(eventLoop, pipefd[0], IN_EVENTS, true, DEFAULT_PRIORITY - 10);
         child_status_registered = true;
         
         forkpid = child_listener.fork(eventLoop);