The algorithm in addDailyAction in Scheduler.py is broken.
I wrote a little test script to exercise the algorithm for various cases
and this is the result:

Start time: 00:00 (12:00am)
  Current time: 23:01 (11:01pm)
  Expected delay: 0:59
  Computed delay - 1:59
 
  Current time: 23:59 (11:59pm)
  Expected delay: 0:01
  Computed delay - 1:01
 
  Current time: 00:01 (12:01am)
  Expected delay: 23:59
  Computed delay - 0:59
 
  Current time: 00:59 (12:59am)
  Expected delay: 23:01
  Computed delay - 0:01
 
Start time: 00:30 (12:30am)
  Current time: 23:01 (11:01pm)
  Expected delay: 1:29
  Computed delay - 1:29
 
  Current time: 23:59 (11:59pm)
  Expected delay: 0:31
  Computed delay - 1:31
 
  Current time: 00:01 (12:01am)
  Expected delay: 00:29
  Computed delay - 0:29
 
  Current time: 00:59 (12:59am)
  Expected delay: 23:31
  Computed delay - 0:31

The attached patch corrects the problem.

brett


Index: Scheduler.py
===================================================================
RCS file: /cvsroot/webware/Webware/TaskKit/Scheduler.py,v
retrieving revision 1.11
diff -u -3 -p -r1.11 Scheduler.py
--- Scheduler.py	22 Oct 2002 18:46:56 -0000	1.11
+++ Scheduler.py	12 Aug 2003 21:54:42 -0000
@@ -206,21 +206,34 @@ class Scheduler(Thread):
 		currHour = current[3]
 		currMin = current[4]
 
-		#minute difference
-		if minute > currMin:
-			minuteDifference = minute - currMin
-		elif minute < currMin:
-			minuteDifference = 60 - currMin + minute
-		else: #equal
-			minuteDifference = 0
-
-		#hourDifference
 		if hour > currHour:
 			hourDifference = hour - currHour
+			if minute > currMin:
+				minuteDifference = minute - currMin
+			elif minute < currMin:
+				minuteDifference = 60 - currMin + minute
+				hourDifference -= 1
+			else:
+				minuteDifference = 0
 		elif hour < currHour:
 			hourDifference = 24 - currHour + hour
-		else: #equal
-			hourDifference = 0
+			if minute > currMin:
+				minuteDifference = minute - currMin
+			elif minute < currMin:
+				minuteDifference = 60 - currMin + minute
+				hourDifference -= 1
+			else:
+				minuteDifference = 0
+		else:
+			if minute > currMin:
+				hourDifference = 0
+				minuteDifference = minute - currMin
+			elif minute < currMin:
+				minuteDifference = 60 - currMin + minute
+				hourDifference = 23
+			else:
+				hourDifference = 0
+				minuteDifference = 0
 
 		delay = (minuteDifference + (hourDifference * 60)) * 60
 		self.addPeriodicAction(time.time()+delay, 24*60*60, task, name)

Reply via email to