diff options
| author | paul <paul> | 2005-05-23 13:42:46 +0000 | 
|---|---|---|
| committer | paul <paul> | 2005-05-23 13:42:46 +0000 | 
| commit | 269d74fdc39a612da8f627bf97628c68d25a16ab (patch) | |
| tree | 8add14e852e83369123ee576a995b28f006800d4 /lib/workqueue.h | |
| parent | a94feb380df46bdfc742257648c9825e8e7b17c0 (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.h | 30 | 
1 files changed, 28 insertions, 2 deletions
diff --git a/lib/workqueue.h b/lib/workqueue.h index 257667e25c..626d8e6cb9 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;  | 
