summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2012-12-12 08:56:17 -0500
committerJason R. Coombs <jaraco@jaraco.com>2012-12-12 08:56:17 -0500
commite89d42768d7743a826dc7a11641704c90ddfc5b7 (patch)
tree24f39196775d9fe75befd373bb5253598bb2c948
parent66e11a608ce5d894d9a98d42b80e570f3585935c (diff)
downloadcherrypy-e89d42768d7743a826dc7a11641704c90ddfc5b7.tar.gz
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+.
-rw-r--r--cherrypy/_cpcompat.py11
-rw-r--r--cherrypy/process/plugins.py17
2 files changed, 18 insertions, 10 deletions
diff --git a/cherrypy/_cpcompat.py b/cherrypy/_cpcompat.py
index 0e9d38c1..4e703703 100644
--- a/cherrypy/_cpcompat.py
+++ b/cherrypy/_cpcompat.py
@@ -334,3 +334,14 @@ else:
# 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)
diff --git a/cherrypy/process/plugins.py b/cherrypy/process/plugins.py
index 8be25505..03e76856 100644
--- a/cherrypy/process/plugins.py
+++ b/cherrypy/process/plugins.py
@@ -7,7 +7,8 @@ import sys
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
@@ -450,7 +451,7 @@ class PerpetualTimer(Timer):
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
@@ -460,7 +461,7 @@ class BackgroundTask(threading.Thread):
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
@@ -468,10 +469,9 @@ class BackgroundTask(threading.Thread):
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
@@ -491,9 +491,6 @@ class BackgroundTask(threading.Thread):
# 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."""