@@ -38,36 +38,15 @@ def __init__(self, runq_len=16, waitq_len=16, lpqlen=42):
38
38
self .lpq = utimeq .utimeq (lpqlen )
39
39
self .hp_tasks = []
40
40
41
- # Schedule a single low priority task if one is ready or overdue.
42
- # The most overdue task is scheduled even if normal tasks are pending.
43
- # The most due task is scheduled only if no normal tasks are pending.
44
- def schedule_lp_task (self , cur_task , tnow ):
45
- t = self .lpq .peektime ()
46
- tim = time .ticks_diff (t , tnow )
47
- to_run = self ._max_overdue_ms > 0 and tim < - self ._max_overdue_ms
48
- if not to_run : # No overdue LP task.
49
- if len (self .runq ): # zero delay tasks go straight to runq
50
- return False
51
- to_run = tim <= 0 # True if LP task is due
52
- if to_run and self .waitq : # Set False if a normal tasks is due.
53
- t = self .waitq .peektime ()
54
- to_run = time .ticks_diff (t , tnow ) > 0 # No normal task is ready
55
- if to_run :
56
- self .lpq .pop (cur_task )
57
- self .call_soon (cur_task [1 ], * cur_task [2 ])
58
- return True
59
- return False
60
-
61
41
def max_overdue_ms (self , t = None ):
62
42
if t is not None :
63
- self ._max_overdue_ms = t
43
+ self ._max_overdue_ms = int ( t )
64
44
return self ._max_overdue_ms
65
45
66
46
# Low priority versions of call_later() call_later_ms() and call_at_()
67
47
def call_after_ms (self , delay , callback , * args ):
68
48
self .call_at_lp_ (time .ticks_add (self .time (), delay ), callback , * args )
69
49
70
-
71
50
def call_after (self , delay , callback , * args ):
72
51
self .call_at_lp_ (time .ticks_add (self .time (), int (delay * 1000 )), callback , * args )
73
52
@@ -85,24 +64,42 @@ def _schedule_hp(self, func, callback, *args):
85
64
else :
86
65
self .hp_tasks .append ([func , callback , args ])
87
66
67
+ # Low priority (LP) scheduling.
68
+ # Schedule a single low priority task if one is ready or overdue.
69
+ # The most overdue task is scheduled even if normal tasks are pending.
70
+ # The most due task is scheduled only if no normal tasks are pending.
71
+
88
72
def run_forever (self ):
89
73
cur_task = [0 , 0 , 0 ]
90
74
while True :
91
75
tnow = self .time ()
92
- # Schedule a LP task if no normal task is ready
93
- l = len (self .lpq )
94
- if (l and not self .schedule_lp_task (cur_task , tnow )) or l == 0 :
95
- # Expire entries in waitq and move them to runq
96
- while self .waitq :
97
- t = self .waitq .peektime ()
98
- delay = time .ticks_diff (t , tnow )
99
- if delay > 0 :
100
- break
101
- self .waitq .pop (cur_task )
102
- if __debug__ and DEBUG :
103
- log .debug ("Moving from waitq to runq: %s" , cur_task [1 ])
76
+ if self .lpq :
77
+ # Schedule a LP task if overdue or if no normal task is ready
78
+ to_run = False # Assume no LP task is to run
79
+ t = self .lpq .peektime ()
80
+ tim = time .ticks_diff (t , tnow )
81
+ to_run = self ._max_overdue_ms > 0 and tim < - self ._max_overdue_ms
82
+ if not (to_run or self .runq ): # No overdue LP task or task on runq
83
+ # zero delay tasks go straight to runq. So don't schedule LP if runq
84
+ to_run = tim <= 0 # True if LP task is due
85
+ if to_run and self .waitq : # Set False if normal tasks due.
86
+ t = self .waitq .peektime ()
87
+ to_run = time .ticks_diff (t , tnow ) > 0 # No normal task is ready
88
+ if to_run :
89
+ self .lpq .pop (cur_task )
104
90
self .call_soon (cur_task [1 ], * cur_task [2 ])
105
91
92
+ # Expire entries in waitq and move them to runq
93
+ while self .waitq :
94
+ t = self .waitq .peektime ()
95
+ delay = time .ticks_diff (t , tnow )
96
+ if delay > 0 :
97
+ break
98
+ self .waitq .pop (cur_task )
99
+ if __debug__ and DEBUG :
100
+ log .debug ("Moving from waitq to runq: %s" , cur_task [1 ])
101
+ self .call_soon (cur_task [1 ], * cur_task [2 ])
102
+
106
103
# Process runq
107
104
l = len (self .runq )
108
105
if __debug__ and DEBUG :
0 commit comments