[workqueue] Update workqueue users callbacks to additional arguments

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.
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 4293457..e544d04 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 c2ff10d..0c61f5c 100644
--- a/lib/workqueue.c
+++ b/lib/workqueue.c
@@ -147,7 +147,7 @@
 
   /* 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 @@
     /* 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 15c72f6..0a398de 100644
--- a/lib/workqueue.h
+++ b/lib/workqueue.h
@@ -57,26 +57,31 @@
 
 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 @@
     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 */