diff options
author | John Crispin <blogic@openwrt.org> | 2013-11-18 14:15:19 +0400 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-11-18 15:25:21 +0400 |
commit | bc8167eb99bc6febc96f4dab0bbce32186f30c16 (patch) | |
tree | 91d4dbb3a0045a1ab0af58da6c3728ababf44cf3 | |
parent | a34c8f6918c291275ded2b6fd9b94ac91722ded2 (diff) |
runqueue: add a function that allows adding jobs to the front of the runqueue
Signed-off-by: John Crispin <blogic@openwrt.org>
-rw-r--r-- | runqueue.c | 17 | ||||
-rw-r--r-- | runqueue.h | 1 | ||||
-rw-r--r-- | safe_list.c | 6 | ||||
-rw-r--r-- | safe_list.h | 1 |
4 files changed, 23 insertions, 2 deletions
@@ -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; @@ -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); diff --git a/safe_list.c b/safe_list.c index f26b4dd..16f57e0 100644 --- a/safe_list.c +++ b/safe_list.c @@ -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; diff --git a/safe_list.h b/safe_list.h index 3c8b61b..67b673d 100644 --- a/safe_list.h +++ b/safe_list.h @@ -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) \ |