aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2016-10-14 12:41:23 -0400
committerKevin O'Connor <kevin@koconnor.net>2016-10-19 13:35:48 -0400
commit884cee27eb28f5c21aa9c3474ce8dc722e4b7c46 (patch)
tree0d729822c73433ba19de1522962bc32624a8f123
parent0f87493487d81522df481bcce7fc8eb5f3134d8d (diff)
downloadkutter-884cee27eb28f5c21aa9c3474ce8dc722e4b7c46.tar.gz
kutter-884cee27eb28f5c21aa9c3474ce8dc722e4b7c46.tar.xz
kutter-884cee27eb28f5c21aa9c3474ce8dc722e4b7c46.zip
sched: Improve AVR optimization of reschedule_timer()
Tweak the AVR register pressure optimization in reschedule_timer() to optimize it further. This improves the performance of AVR timers when there are several pending timers. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--src/sched.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/sched.c b/src/sched.c
index 450bc2c8..a5064650 100644
--- a/src/sched.c
+++ b/src/sched.c
@@ -136,14 +136,18 @@ reschedule_timer(struct timer *t)
// Find new timer position and update list
timer_list = pos;
- while (pos->next && sched_is_before(pos->next->waketime, minwaketime))
+ struct timer *prev;
+ for (;;) {
+ prev = pos;
+ if (CONFIG_MACH_AVR)
+ // micro optimization for AVR - reduces register pressure
+ asm("" : "+r"(prev) : : "memory");
pos = pos->next;
- t->next = pos->next;
- pos->next = t;
-
- if (CONFIG_MACH_AVR)
- // micro optimization for AVR - reduces register pressure
- barrier();
+ if (!pos || !sched_is_before(pos->waketime, minwaketime))
+ break;
+ }
+ t->next = pos;
+ prev->next = t;
return timer_list;
}