runqueue: add a function that allows adding jobs to the front of the runqueue
authorJohn Crispin <blogic@openwrt.org>
Mon, 18 Nov 2013 10:15:19 +0000 (11:15 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 18 Nov 2013 11:25:21 +0000 (12:25 +0100)
Signed-off-by: John Crispin <blogic@openwrt.org>
runqueue.c
runqueue.h
safe_list.c
safe_list.h

index 189a00555e12cb43a087dce5d2fd4783e1e23344..1784e304b8555188fd6e70a81b1bf37c9344dda0 100644 (file)
@@ -145,7 +145,7 @@ __runqueue_task_timeout(struct uloop_timeout *timeout)
                runqueue_task_cancel(t, t->cancel_type);
 }
 
-void runqueue_task_add(struct runqueue *q, struct runqueue_task *t, bool running)
+static void _runqueue_task_add(struct runqueue *q, struct runqueue_task *t, bool running, bool first)
 {
        struct safe_list *head;
 
@@ -166,7 +166,10 @@ void runqueue_task_add(struct runqueue *q, struct runqueue_task *t, bool running
 
        t->timeout.cb = __runqueue_task_timeout;
        t->q = q;
-       safe_list_add(&t->list, head);
+       if (first)
+               safe_list_add_first(&t->list, head);
+       else
+               safe_list_add(&t->list, head);
        t->cancelled = false;
        t->queued = true;
        t->running = running;
@@ -175,6 +178,16 @@ void runqueue_task_add(struct runqueue *q, struct runqueue_task *t, bool running
        runqueue_start_next(q);
 }
 
+void runqueue_task_add(struct runqueue *q, struct runqueue_task *t, bool running)
+{
+       _runqueue_task_add(q, t, running, 0);
+}
+
+void runqueue_task_add_first(struct runqueue *q, struct runqueue_task *t, bool running)
+{
+       _runqueue_task_add(q, t, running, 1);
+}
+
 void runqueue_task_kill(struct runqueue_task *t)
 {
        struct runqueue *q = t->q;
index 00ad1ebf859e0286594659928629359c3b3e7993..0d4173dbf54501c4413ef6cfeea10ec865373113 100644 (file)
@@ -100,6 +100,7 @@ void runqueue_stop(struct runqueue *q);
 void runqueue_resume(struct runqueue *q);
 
 void runqueue_task_add(struct runqueue *q, struct runqueue_task *t, bool running);
+void runqueue_task_add_first(struct runqueue *q, struct runqueue_task *t, bool running);
 void runqueue_task_complete(struct runqueue_task *t);
 
 void runqueue_task_cancel(struct runqueue_task *t, int type);
index f26b4dd11d7f2b591210092c7dfd1fec33cccf8a..16f57e084f4bb7dd59afee1366191f5d069a0fec 100644 (file)
@@ -86,6 +86,12 @@ void safe_list_add(struct safe_list *list, struct safe_list *head)
        list_add_tail(&list->list, &head->list);
 }
 
+void safe_list_add_first(struct safe_list *list, struct safe_list *head)
+{
+       list->i = NULL;
+       list_add(&list->list, &head->list);
+}
+
 void safe_list_del(struct safe_list *list)
 {
        struct safe_list_iterator *i, *next_i, **tail;
index 3c8b61ba6c80c3f9c28ff01bc11906bcd023723d..67b673d9db3c9420659de01e9e81eb0ab6d68876 100644 (file)
@@ -42,6 +42,7 @@ int safe_list_for_each(struct safe_list *list,
                       void *ctx);
 
 void safe_list_add(struct safe_list *list, struct safe_list *head);
+void safe_list_add_first(struct safe_list *list, struct safe_list *head);
 void safe_list_del(struct safe_list *list);
 
 #define INIT_SAFE_LIST(_head) \