]> git.puffer.fish Git - matthieu/frr.git/commitdiff
[workqueue] Update workqueue users callbacks to additional arguments
authorpaul <paul>
Mon, 14 Nov 2005 14:46:35 +0000 (14:46 +0000)
committerpaul <paul>
Mon, 14 Nov 2005 14:46:35 +0000 (14:46 +0000)
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.

lib/ChangeLog
lib/workqueue.c
lib/workqueue.h

index 4293457582af44188ccc858a8285674eb936389b..e544d044d338deed37ed5786d81623bd680a8184 100644 (file)
@@ -1,3 +1,15 @@
+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
index c2ff10db1bcb7bd4ae319cbc9ad0d5b9956780ce..0c61f5c4f6a1524aa89029a7011958bef29dcb15 100644 (file)
@@ -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) 
index 15c72f62f325abd4d4e1108f9ba209c82bcdbfc9..0a398ded3f12f7ddf5f998c8c80cc0a65fd18ea9 100644 (file)
@@ -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 */