summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ChangeLog12
-rw-r--r--lib/workqueue.c4
-rw-r--r--lib/workqueue.h25
3 files changed, 32 insertions, 9 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 42934575..e544d044 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,5 +1,17 @@
2005-11-14 Paul Jakma <paul.jakma@sun.com>
+ * (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 <paul.jakma@sun.com>
+
* (general) Add state to detect queue floods. There's no sense
trying to be sparing of CPU resources, if the queue is
flooding and using ever more memory resources. we should just
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 */