Annotation of embedaddon/quagga/lib/workqueue.h, revision 1.1.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>