From ba92e10cb8a623a5c59305b51f8ef364998cd871 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Fri, 8 Dec 2006 17:47:16 +0100 Subject: [PATCH] workqueue: Added non-blocking wait functions. --- lib/workqueue.c | 41 +++++++++++++++++++++++++++++++++++------ lib/workqueue.h | 2 ++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/lib/workqueue.c b/lib/workqueue.c index a5ea7b8d..a015e878 100644 --- a/lib/workqueue.c +++ b/lib/workqueue.c @@ -117,10 +117,9 @@ raw_queue_put(struct raw_queue *q, struct work *w) sem_post(q->queue_sem); } -struct work * -raw_queue_get(struct raw_queue *q) +static inline struct work * +raw_queue_do_get(struct raw_queue *q) { - sem_wait(q->queue_sem); pthread_mutex_lock(&q->queue_mutex); struct work *w = clist_head(&q->queue); ASSERT(w); @@ -129,6 +128,22 @@ raw_queue_get(struct raw_queue *q) return w; } +struct work * +raw_queue_get(struct raw_queue *q) +{ + sem_wait(q->queue_sem); + return raw_queue_do_get(q); +} + +struct work * +raw_queue_try_get(struct raw_queue *q) +{ + if (!sem_trywait(q->queue_sem)) + return raw_queue_do_get(q); + else + return NULL; +} + void work_queue_init(struct worker_pool *p, struct work_queue *q) { @@ -153,12 +168,14 @@ work_submit(struct work_queue *q, struct work *w) q->nr_running++; } -struct work * -work_wait(struct work_queue *q) +static struct work * +work_do_wait(struct work_queue *q, int try) { while (q->nr_running) { - struct work *w = raw_queue_get(&q->finished); + struct work *w = (try ? raw_queue_try_get : raw_queue_get)(&q->finished); + if (!w) + return NULL; q->nr_running--; if (w->returned) w->returned(q, w); @@ -168,6 +185,18 @@ work_wait(struct work_queue *q) return NULL; } +struct work * +work_wait(struct work_queue *q) +{ + return work_do_wait(q, 0); +} + +struct work * +work_try_wait(struct work_queue *q) +{ + return work_do_wait(q, 1); +} + #ifdef TEST #include diff --git a/lib/workqueue.h b/lib/workqueue.h index 32ea19fc..5f8b5fcd 100644 --- a/lib/workqueue.h +++ b/lib/workqueue.h @@ -76,10 +76,12 @@ void raw_queue_init(struct raw_queue *q); void raw_queue_cleanup(struct raw_queue *q); void raw_queue_put(struct raw_queue *q, struct work *w); struct work *raw_queue_get(struct raw_queue *q); +struct work *raw_queue_try_get(struct raw_queue *q); void work_queue_init(struct worker_pool *p, struct work_queue *q); void work_queue_cleanup(struct work_queue *q); void work_submit(struct work_queue *q, struct work *w); struct work *work_wait(struct work_queue *q); +struct work *work_try_wait(struct work_queue *q); #endif /* !_UCW_WORKQUEUE_H */ -- 2.39.2