Annotation of embedaddon/quagga/lib/workqueue.h, revision 1.1
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:
! 122: /* Helpers, exported for thread.c and command.c */
! 123: extern int work_queue_run (struct thread *);
! 124: extern struct cmd_element show_work_queues_cmd;
! 125: #endif /* _QUAGGA_WORK_QUEUE_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>