feat: added ability to identify process vm regions
[lunaix-os.git] / lunaix-os / kernel / time / timer.c
index 42a9ac214262d655a3e4b628091fce92d397373b..981b64565fc458121e3f071d4ba65a1540621876 100644 (file)
@@ -141,24 +141,24 @@ timer_init(uint32_t frequency)
     sched_ticks_counter = 0;
 }
 
     sched_ticks_counter = 0;
 }
 
-int
+struct lx_timer*
 timer_run_second(uint32_t second, void (*callback)(void*), void* payload, uint8_t flags)
 {
     return timer_run(second * timer_ctx->running_frequency, callback, payload, flags);
 }
 
 timer_run_second(uint32_t second, void (*callback)(void*), void* payload, uint8_t flags)
 {
     return timer_run(second * timer_ctx->running_frequency, callback, payload, flags);
 }
 
-int
+struct lx_timer*
 timer_run_ms(uint32_t millisecond, void (*callback)(void*), void* payload, uint8_t flags)
 {
     return timer_run(timer_ctx->running_frequency / 1000 * millisecond, callback, payload, flags);
 }
 
 timer_run_ms(uint32_t millisecond, void (*callback)(void*), void* payload, uint8_t flags)
 {
     return timer_run(timer_ctx->running_frequency / 1000 * millisecond, callback, payload, flags);
 }
 
-int
+struct lx_timer*
 timer_run(ticks_t ticks, void (*callback)(void*), void* payload, uint8_t flags)
 {
     struct lx_timer* timer = (struct lx_timer*)lxmalloc(sizeof(struct lx_timer));
 
 timer_run(ticks_t ticks, void (*callback)(void*), void* payload, uint8_t flags)
 {
     struct lx_timer* timer = (struct lx_timer*)lxmalloc(sizeof(struct lx_timer));
 
-    if (!timer) return 0;
+    if (!timer) return NULL;
 
     timer->callback = callback;
     timer->counter = ticks;
 
     timer->callback = callback;
     timer->counter = ticks;
@@ -168,7 +168,7 @@ timer_run(ticks_t ticks, void (*callback)(void*), void* payload, uint8_t flags)
 
     llist_append(timer_ctx->active_timers, &timer->link);
 
 
     llist_append(timer_ctx->active_timers, &timer->link);
 
-    return 1;
+    return timer;
 }
 
 static void
 }
 
 static void
@@ -179,17 +179,20 @@ timer_update(const isr_param* param)
 
     llist_for_each(pos, n, &timer_list_head->link, link)
     {
 
     llist_for_each(pos, n, &timer_list_head->link, link)
     {
-        if (--pos->counter) {
+        if (!pos->counter) {
+            llist_delete(&pos->link);
+            lxfree(pos);
+            continue;
+        }
+        
+        if (--(pos->counter)) {
             continue;
         }
 
         pos->callback ? pos->callback(pos->payload) : 1;
 
             continue;
         }
 
         pos->callback ? pos->callback(pos->payload) : 1;
 
-        if (pos->flags & TIMER_MODE_PERIODIC) {
+        if ((pos->flags & TIMER_MODE_PERIODIC)) {
             pos->counter = pos->deadline;
             pos->counter = pos->deadline;
-        } else {
-            llist_delete(&pos->link);
-            lxfree(pos);
         }
     }
     
         }
     }