/usr/share/pyshared/paste/webkit/FakeWebware/TaskKit/TaskHandler.py is in python-pastewebkit 1.0-7.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | from time import time, sleep
from threading import Event, Thread
class TaskHandler:
"""
While the Task class only knows what task to perform with the run()-method,
the TaskHandler has all the knowledge about the periodicity of the task.
Instances of this class are managed by the Scheduler in the
scheduled, running and onDemand dictionaries.
"""
## Init ##
def __init__(self, scheduler, start, period, task, name):
self._scheduler = scheduler
self._task = task
self._name = name
self._thread = None
self._isRunning = 0
self._suspend = 0
self._lastTime = None
self._startTime = start
self._registerTime = time()
self._reregister = 1
self._rerun = 0
self._period = abs(period)
## Scheduling ##
def reset(self, start, period, task, reregister):
self._startTime = start
self._period = abs(period)
self._task = task
self._reregister = reregister
def runTask(self):
"""
Runs this task in a background thread.
"""
if self._suspend:
self._scheduler.notifyCompletion(self)
return
self._rerun = 0
self._thread = Thread(None, self._task._run, self.name(), (self,))
self._isRunning = 1
self._thread.start()
def reschedule(self):
"""
Method to determine whether this task should be rescheduled. Increments the
startTime and returns true if this is a periodically executed task.
"""
if self._period == 0:
return 0
else:
if self._lastTime - self._startTime > self._period: #if the time taken to run the task exceeds the period
self._startTime = self._lastTime + self._period
else:
self._startTime = self._startTime + self._period
return 1
def notifyCompletion(self):
self._isRunning = 0
self._lastTime = time()
self._scheduler.notifyCompletion(self)
## Attributes ##
def isRunning(self):
return self._isRunning
def runAgain(self):
"""
This method lets the Scheduler check to see whether this task should be
re-run when it terminates
"""
return self._rerun
def isOnDemand(self):
"""
Returns true if this task is not scheduled for periodic execution.
"""
return self._period == 1
def runOnCompletion(self):
"""
Method to request that this task be re-run after its current completion.
Intended for on-demand tasks that are requested by the Scheduler while
they are already running.
"""
self._rerun = 1
def unregister(self):
"""
Method to request that this task not be kept after its current completion.
Used to remove a task from the scheduler
"""
self._reregister = 0
self._rerun = 0
def disable(self):
"""
Method to disable future invocations of this task.
"""
self._suspend = 1
def enable(self):
"""
Method to enable future invocations of this task.
"""
self._suspend = 0
def period(self):
"""
Returns the period of this task.
"""
return self._period
def setPeriod(self, period):
"""
Mmethod to change the period for this task.
"""
self._period = period
def stop(self):
self._isRunning = 0
def name(self):
return self._name
def startTime(self, newTime=None):
if newTime:
self._startTime = newTime
return self._startTime
|