summaryrefslogtreecommitdiff
path: root/lib/workqueue.h
diff options
context:
space:
mode:
authorpaul <paul>2005-05-23 13:42:46 +0000
committerpaul <paul>2005-05-23 13:42:46 +0000
commit269d74fdc39a612da8f627bf97628c68d25a16ab (patch)
tree8add14e852e83369123ee576a995b28f006800d4 /lib/workqueue.h
parenta94feb380df46bdfc742257648c9825e8e7b17c0 (diff)
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.h30
1 files changed, 28 insertions, 2 deletions
diff --git a/lib/workqueue.h b/lib/workqueue.h
index 257667e2..626d8e6c 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;