diff options
author | paul <paul> | 2005-05-23 15:42:46 +0200 |
---|---|---|
committer | paul <paul> | 2005-05-23 15:42:46 +0200 |
commit | 269d74fdc39a612da8f627bf97628c68d25a16ab (patch) | |
tree | 8add14e852e83369123ee576a995b28f006800d4 /lib/workqueue.h | |
parent | 2005-05-23 Paul Jakma <paul@dishone.st> (diff) | |
download | frr-269d74fdc39a612da8f627bf97628c68d25a16ab.tar.xz frr-269d74fdc39a612da8f627bf97628c68d25a16ab.zip |
2005-05-23 Paul Jakma <paul@dishone.st>
* workqueue.h: Add a WQ_QUEUE_BLOCKED item_status return code,
to allow a queue function to indicate the queue is not
ready/blocked - rather than any problem with the item at hand.
Add a notion of being able to 'plug' and 'unplug' a queue.
Add helpers to plug/unplug a queue.
Add a completion callback, to be called when a queue is emptied.
* workqueue.c: (work_queue_new) remove useless list_free.
(work_queue_schedule) new internal helper function to schedule
queue, if appropriate.
(work_queue_add) use work_queue_schedule
(show_work_queues) Print 'P' if queue is plugged.
(work_queue_plug) new API function, plug a queue - ie prevent it
from 'drained' / processed / scheduled.
(work_queue_unplug) unplug a queue, allowing it to be drained
/ scheduled / processed again.
(work_queue_run) Add support for WQ_QUEUE_BLOCKED.
Add comment for RETRY_NOW case.
Make hysteris more aggresive in ramping up granularity, improves
performance significantly.
Add support for calling completion callback when queue is emptied,
possibly useful for knowing when to unplug a queue.
Diffstat (limited to 'lib/workqueue.h')
-rw-r--r-- | lib/workqueue.h | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/lib/workqueue.h b/lib/workqueue.h index 257667e25..626d8e6cb 100644 --- a/lib/workqueue.h +++ b/lib/workqueue.h @@ -35,7 +35,10 @@ typedef enum WQ_ERROR, /* Error, run error handler if provided */ WQ_RETRY_NOW, /* retry immediately */ WQ_RETRY_LATER, /* retry later, cease processing work queue */ - WQ_REQUEUE /* requeue item, continue processing work queue */ + WQ_REQUEUE, /* requeue item, continue processing work queue */ + WQ_QUEUE_BLOCKED, /* Queue cant be processed at this time. + * Similar to WQ_RETRY_LATER, but doesn't penalise + * the particular item.. */ } wq_item_status; /* A single work queue item, unsurprisingly */ @@ -45,11 +48,18 @@ struct work_queue_item unsigned short ran; /* # of times item has been run */ }; +enum work_queue_flags +{ + WQ_UNPLUGGED = 0, + WQ_PLUGGED = 1, +}; + struct work_queue { struct thread_master *master; /* thread master */ struct thread *thread; /* thread, if one is active */ char *name; /* work queue name */ + enum work_queue_flags flags; /* flags */ /* specification for this work queue */ struct { @@ -62,6 +72,9 @@ struct work_queue /* callback to delete user specific item data */ void (*del_item_data) (void *); + /* completion callback, called when queue is emptied, optional */ + void (*completion_func) (struct work_queue *); + /* max number of retries to make for item that errors */ unsigned int max_retries; @@ -71,7 +84,7 @@ struct work_queue /* remaining fields should be opaque to users */ struct list *items; /* queue item list */ - unsigned long runs; /* runs count */ + unsigned long runs; /* runs count */ struct { unsigned int best; @@ -81,11 +94,24 @@ struct work_queue }; /* User API */ + +/* create a new work queue, of given name. + * user must fill in the spec of the returned work queue before adding + * anything to it + */ extern struct work_queue *work_queue_new (struct thread_master *, const char *); +/* destroy work queue */ extern void work_queue_free (struct work_queue *); + +/* Add the supplied data as an item onto the workqueue */ extern void work_queue_add (struct work_queue *, void *); +/* plug the queue, ie prevent it from being drained / processed */ +extern void work_queue_plug (struct work_queue *wq); +/* unplug the queue, allow it to be drained again */ +extern void work_queue_unplug (struct work_queue *wq); + /* Helpers, exported for thread.c and command.c */ extern int work_queue_run (struct thread *); extern struct cmd_element show_work_queues_cmd; |