Merge tag 'upstream/1.2.4'
[quagga-debian.git] / lib / workqueue.h
1 /* 
2  * Quagga Work Queues.
3  *
4  * Copyright (C) 2005 Sun Microsystems, Inc.
5  *
6  * This file is part of Quagga.
7  *
8  * Quagga is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by the
10  * Free Software Foundation; either version 2, or (at your option) any
11  * later version.
12  *
13  * Quagga is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with Quagga; see the file COPYING.  If not, write to the Free
20  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21  * 02111-1307, USA.  
22  */
23
24 #ifndef _QUAGGA_WORK_QUEUE_H
25 #define _QUAGGA_WORK_QUEUE_H
26
27 /* Hold time for the initial schedule of a queue run, in  millisec */
28 #define WORK_QUEUE_DEFAULT_HOLD  50 
29
30 /* action value, for use by item processor and item error handlers */
31 typedef enum
32 {
33   WQ_SUCCESS = 0,
34   WQ_ERROR,             /* Error, run error handler if provided */
35   WQ_RETRY_NOW,         /* retry immediately */
36   WQ_RETRY_LATER,       /* retry later, cease processing work queue */
37   WQ_REQUEUE,           /* requeue item, continue processing work queue */
38   WQ_QUEUE_BLOCKED,     /* Queue cant be processed at this time.
39                          * Similar to WQ_RETRY_LATER, but doesn't penalise
40                          * the particular item.. */
41 } wq_item_status;
42
43 /* A single work queue item, unsurprisingly */
44 struct work_queue_item
45 {
46   void *data;                           /* opaque data */
47   unsigned short ran;                   /* # of times item has been run */
48 };
49
50 #define WQ_UNPLUGGED    (1 << 0) /* available for draining */
51
52 struct work_queue
53 {
54   /* Everything but the specification struct is private
55    * the following may be read
56    */
57   struct thread_master *master;       /* thread master */
58   struct thread *thread;              /* thread, if one is active */
59   char *name;                         /* work queue name */
60   
61   /* Specification for this work queue.
62    * Public, must be set before use by caller. May be modified at will.
63    */
64   struct {
65     /* optional opaque user data, global to the queue. */
66     void *data;
67     
68     /* work function to process items with:
69      * First argument is the workqueue queue.
70      * Second argument is the item data
71      */
72     wq_item_status (*workfunc) (struct work_queue *, void *);
73
74     /* error handling function, optional */
75     void (*errorfunc) (struct work_queue *, struct work_queue_item *);
76     
77     /* callback to delete user specific item data */
78     void (*del_item_data) (struct work_queue *, void *);
79     
80     /* completion callback, called when queue is emptied, optional */
81     void (*completion_func) (struct work_queue *);
82     
83     /* max number of retries to make for item that errors */
84     unsigned int max_retries;   
85
86     unsigned int hold;  /* hold time for first run, in ms */
87   } spec;
88   
89   /* remaining fields should be opaque to users */
90   struct list *items;                 /* queue item list */
91   unsigned long runs;                 /* runs count */
92   unsigned long worst_usec;
93   
94   struct {
95     unsigned int best;
96     unsigned int worst;
97     unsigned int granularity;
98     unsigned long total;
99   } cycles;     /* cycle counts */
100   
101   /* private state */
102   u_int16_t flags;              /* user set flag */
103 };
104
105 /* User API */
106
107 /* create a new work queue, of given name. 
108  * user must fill in the spec of the returned work queue before adding
109  * anything to it
110  */
111 extern struct work_queue *work_queue_new (struct thread_master *,
112                                           const char *);
113 /* destroy work queue */
114 extern void work_queue_free (struct work_queue *);
115
116 /* Add the supplied data as an item onto the workqueue */
117 extern void work_queue_add (struct work_queue *, void *);
118
119 /* plug the queue, ie prevent it from being drained / processed */
120 extern void work_queue_plug (struct work_queue *wq);
121 /* unplug the queue, allow it to be drained again */
122 extern void work_queue_unplug (struct work_queue *wq);
123
124 bool work_queue_is_scheduled (struct work_queue *);
125
126 /* Helpers, exported for thread.c and command.c */
127 extern int work_queue_run (struct thread *);
128 extern struct cmd_element show_work_queues_cmd;
129 #endif /* _QUAGGA_WORK_QUEUE_H */