From a570e2a84afc062135d0c4c3a273128a3ee68cf0 Mon Sep 17 00:00:00 2001
From: Guido Trotter <ultrotter@google.com>
Date: Fri, 17 Oct 2008 11:08:10 +0000
Subject: [PATCH] Mainloop: handle sigterm

This fixes removals of the pid files and clean exit in the init script

Reviewed-by: iustinp
---
 lib/daemon.py | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/lib/daemon.py b/lib/daemon.py
index 0f6f540e3..0a3e865e0 100644
--- a/lib/daemon.py
+++ b/lib/daemon.py
@@ -37,6 +37,8 @@ class Mainloop(object):
     self._io_wait = []
     self._signal_wait = []
     self.sigchld_handler = None
+    self.sigterm_handler = None
+    self.quit = False
 
   def Run(self):
     # TODO: Does not yet support adding new event sources while running
@@ -45,8 +47,9 @@ class Mainloop(object):
       poller.register(fd, conditions)
 
     self.sigchld_handler = utils.SignalHandler([signal.SIGCHLD])
+    self.sigterm_handler = utils.SignalHandler([signal.SIGTERM])
     try:
-      while True:
+      while not self.quit:
         try:
           io_events = poller.poll(1000)
         except select.error, err:
@@ -68,9 +71,16 @@ class Mainloop(object):
           for owner in self._signal_wait:
             owner.OnSignal(signal.SIGCHLD)
           self.sigchld_handler.Clear()
+
+        if self.sigterm_handler.called:
+          self.quit = True
+          self.sigterm_handler.Clear()
     finally:
       self.sigchld_handler.Reset()
       self.sigchld_handler = None
+      self.sigterm_handler.Reset()
+      self.sigterm_handler = None
+
 
   def RegisterIO(self, owner, fd, condition):
     """Registers a receiver for I/O notifications
-- 
GitLab