Annotation of embedaddon/quagga/lib/workqueue.h, revision 1.1.1.2
1.1 misho 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:
93: struct {
94: unsigned int best;
95: unsigned int granularity;
96: unsigned long total;
97: } cycles; /* cycle counts */
98:
99: /* private state */
100: u_int16_t flags; /* user set flag */
101: };
102:
103: /* User API */
104:
105: /* create a new work queue, of given name.
106: * user must fill in the spec of the returned work queue before adding
107: * anything to it
108: */
109: extern struct work_queue *work_queue_new (struct thread_master *,
110: const char *);
111: /* destroy work queue */
112: extern void work_queue_free (struct work_queue *);
113:
114: /* Add the supplied data as an item onto the workqueue */
115: extern void work_queue_add (struct work_queue *, void *);
116:
117: /* plug the queue, ie prevent it from being drained / processed */
118: extern void work_queue_plug (struct work_queue *wq);
119: /* unplug the queue, allow it to be drained again */
120: extern void work_queue_unplug (struct work_queue *wq);
121:
1.1.1.2 ! misho 122: bool work_queue_is_scheduled (struct work_queue *);
! 123:
1.1 misho 124: /* Helpers, exported for thread.c and command.c */
125: extern int work_queue_run (struct thread *);
126: extern struct cmd_element show_work_queues_cmd;
127: #endif /* _QUAGGA_WORK_QUEUE_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>