From 889e9311e5c900ce24eecf00fcb5b8b9d51bb020 Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 14 Nov 2005 14:46:35 +0000 Subject: [workqueue] Update workqueue users callbacks to additional arguments 2005-11-14 Paul Jakma * (general) pass struct work-queue to callback functions. * workqueue.h: (struct work_queue) move the state flag variables to end. Add an opaque pointer to spec, for user-data global to the queue. Pass reference to work_queue to all callbacks. * workqueue.c: (work_queue_item_remove) pass ref to workqueue to user callbacks. (work_queue_run) ditto. --- lib/ChangeLog | 12 ++++++++++++ lib/workqueue.c | 4 ++-- lib/workqueue.h | 25 ++++++++++++++++++------- 3 files changed, 32 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/ChangeLog b/lib/ChangeLog index 42934575..e544d044 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,15 @@ +2005-11-14 Paul Jakma + + * (general) pass struct work-queue to callback functions. + * workqueue.h: (struct work_queue) move the state flag + variables to end. + Add an opaque pointer to spec, for user-data global to the + queue. + Pass reference to work_queue to all callbacks. + * workqueue.c: (work_queue_item_remove) pass ref to workqueue + to user callbacks. + (work_queue_run) ditto. + 2005-11-14 Paul Jakma * (general) Add state to detect queue floods. There's no sense diff --git a/lib/workqueue.c b/lib/workqueue.c index c2ff10db..0c61f5c4 100644 --- a/lib/workqueue.c +++ b/lib/workqueue.c @@ -147,7 +147,7 @@ work_queue_item_remove (struct work_queue *wq, struct listnode *ln) /* call private data deletion callback if needed */ if (wq->spec.del_item_data) - wq->spec.del_item_data (item->data); + wq->spec.del_item_data (wq, item->data); list_delete_node (wq->items, ln); work_queue_item_free (item); @@ -284,7 +284,7 @@ work_queue_run (struct thread *thread) /* run and take care of items that want to be retried immediately */ do { - ret = wq->spec.workfunc (item->data); + ret = wq->spec.workfunc (wq, item->data); item->ran++; } while ((ret == WQ_RETRY_NOW) diff --git a/lib/workqueue.h b/lib/workqueue.h index 15c72f62..0a398ded 100644 --- a/lib/workqueue.h +++ b/lib/workqueue.h @@ -57,26 +57,31 @@ enum work_queue_flags struct work_queue { - /* Everything but the specification struct is private */ + /* Everything but the specification struct is private + * the following may be read + */ struct thread_master *master; /* thread master */ struct thread *thread; /* thread, if one is active */ char *name; /* work queue name */ - char status; /* status */ -#define WQ_STATE_FLOODED (1 << 0) - enum work_queue_flags flags; /* flags */ /* Specification for this work queue. * Public, must be set before use by caller. May be modified at will. */ struct { - /* work function to process items with */ - wq_item_status (*workfunc) (void *); + /* optional opaque user data, global to the queue. */ + void *data; + + /* work function to process items with: + * First argument is the workqueue queue. + * Second argument is the item data + */ + wq_item_status (*workfunc) (struct work_queue *, void *); /* error handling function, optional */ void (*errorfunc) (struct work_queue *, struct work_queue_item *); /* callback to delete user specific item data */ - void (*del_item_data) (void *); + void (*del_item_data) (struct work_queue *, void *); /* completion callback, called when queue is emptied, optional */ void (*completion_func) (struct work_queue *); @@ -110,6 +115,12 @@ struct work_queue unsigned int granularity; unsigned long total; } cycles; /* cycle counts */ + + /* private state */ + enum work_queue_flags flags; /* user set flag */ + char status; /* internal status */ +#define WQ_STATE_FLOODED (1 << 0) + }; /* User API */ -- cgit v1.2.1