From 111f021eb322dac375c3a1393a06c27965b15aa1 Mon Sep 17 00:00:00 2001
From: Josarn <josuaarndt@live.de>
Date: Fri, 20 Apr 2018 04:26:16 +0200
Subject: [PATCH] evtimer: optimized adding

---
 sys/evtimer/evtimer.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/sys/evtimer/evtimer.c b/sys/evtimer/evtimer.c
index fdb119e705..b4eae65375 100644
--- a/sys/evtimer/evtimer.c
+++ b/sys/evtimer/evtimer.c
@@ -35,8 +35,7 @@
  * handle the pointer hack in this function */
 void evtimer_add_event_to_list(evtimer_t *evtimer, evtimer_event_t *event)
 {
-    uint32_t delta_sum = 0;
-
+    DEBUG("evtimer: new event offset %" PRIu32 " ms\n", event->offset);
     /* we want list->next to point to the first list element. thus we take the
      * *address* of evtimer->events, then cast it from (evtimer_event_t **) to
      * (evtimer_event_t*). After that, list->next actually equals
@@ -45,20 +44,32 @@ void evtimer_add_event_to_list(evtimer_t *evtimer, evtimer_event_t *event)
 
     while (list->next) {
         evtimer_event_t *list_entry = list->next;
-        if ((list_entry->offset + delta_sum) > event->offset) {
+        /* Stop when new event time is nearer then next */
+        if (event->offset < list_entry->offset) {
+            DEBUG("evtimer: next %" PRIu32 " < %" PRIu32 " ms\n",
+                  event->offset, list_entry->offset);
             break;
         }
-        delta_sum += list_entry->offset;
+        /* Set event offset relative to previous event */
+        event->offset -= list_entry->offset;
         list = list->next;
     }
 
+    DEBUG("evtimer: new event relativ offset %" PRIu32 " ms\n", event->offset);
+
+    /* Set found next bigger event after new event */
     event->next = list->next;
     if (list->next) {
+        /* Set offset following event relative to new event */
         evtimer_event_t *next_entry = list->next;
-        next_entry->offset += delta_sum;
+        DEBUG("evtimer: recalculate offset for %" PRIu32 " ms\n",
+              next_entry->offset);
+
         next_entry->offset -= event->offset;
+
+        DEBUG("evtimer: resulting new event offset %" PRIu32 " ms\n",
+              next_entry->offset);
     }
-    event->offset -= delta_sum;
 
     list->next = event;
 }
-- 
GitLab