Commits

Jason R. Coombs committed 8bb5854

Extract Thread.daemon property compatibility into _cpcompat. Now BackgroundTask behaves like a Python 2.6+ Thread (w.r.t. the daemon property) even on Python 2.3+.

  • Participants
  • Parent commits 4ca43d7
  • Branches cherrypy-3.2.x

Comments (0)

Files changed (2)

cherrypy/_cpcompat.py

     # Python 3.2 and earlier
     Timer = threading._Timer
     Event = threading._Event
+
+# Prior to Python 2.6, the Thread class did not have a .daemon property.
+# This mix-in adds that property.
+class SetDaemonProperty:
+    def __get_daemon(self):
+        return self.isDaemon()
+    def __set_daemon(self, daemon):
+        self.setDaemon(daemon)
+
+    if sys.version_info < (2,6):
+        daemon = property(__get_daemon, __set_daemon)

cherrypy/process/plugins.py

 import time
 import threading
 
-from cherrypy._cpcompat import basestring, get_daemon, get_thread_ident, ntob, set, Timer
+from cherrypy._cpcompat import (basestring, get_daemon, get_thread_ident,
+    ntob, set, Timer, SetDaemonProperty)
 
 # _module__file__base is used by Autoreload to make
 # absolute any filenames retrieved from sys.modules which are not
                 raise
 
 
-class BackgroundTask(threading.Thread):
+class BackgroundTask(SetDaemonProperty, threading.Thread):
     """A subclass of threading.Thread whose run() method repeats.
 
     Use this class for most repeating tasks. It uses time.sleep() to wait
     it won't delay stopping the whole process.
     """
 
-    def __init__(self, interval, function, args=[], kwargs={}, bus=None, daemon=True):
+    def __init__(self, interval, function, args=[], kwargs={}, bus=None):
         threading.Thread.__init__(self)
         self.interval = interval
         self.function = function
         self.kwargs = kwargs
         self.running = False
         self.bus = bus
-        if daemon is not None:
-            self.daemon = daemon
-        else:
-            self.daemon = current_thread().daemon
+
+        # default to daemonic
+        self.daemon = True
 
     def cancel(self):
         self.running = False
                 # Quit on first error to avoid massive logs.
                 raise
 
-    def _set_daemon(self):
-        return True
-
 
 class Monitor(SimplePlugin):
     """WSPBus listener to periodically run a callback in its own thread."""