diff options
| author | paul <paul> | 2005-04-25 16:26:42 +0000 | 
|---|---|---|
| committer | paul <paul> | 2005-04-25 16:26:42 +0000 | 
| commit | 354d119a6569b2c6335ae9309e4606e5cccedb6a (patch) | |
| tree | e29bb213c52bb46b3454f845fa5892df306b82e2 /lib/workqueue.h | |
| parent | b64d92a8a88e69f711976a3c12c17667ecaba4ee (diff) | |
2005-04-25 Paul Jakma <paul.jakma@sun.com>
	* workqueue.{c,h}: Helper API for setting up and running queues via
	  background threads.
	* command.c: install the 'show workqueues' command
	* memtypes.c: Add work queue mtypes, and a rib-queue type for
	  a zebra rib work queue.
	* memtypes.h: Updated to match memtypes.c
	* Makefile.am: Add new workqueue files to build.
Diffstat (limited to 'lib/workqueue.h')
| -rw-r--r-- | lib/workqueue.h | 91 | 
1 files changed, 91 insertions, 0 deletions
diff --git a/lib/workqueue.h b/lib/workqueue.h new file mode 100644 index 0000000000..45fffe7ba7 --- /dev/null +++ b/lib/workqueue.h @@ -0,0 +1,91 @@ +/*  + * Quagga Work Queues. + * + * Copyright (C) 2005 Sun Microsystems, Inc. + * + * This file is part of Quagga. + * + * Quagga is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * Quagga is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Quagga; see the file COPYING.  If not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA.   + */ + +#ifndef _QUAGGA_WORK_QUEUE_H +#define _QUAGGA_WORK_QUEUE_H + +/* Work queue default hold and cycle times - millisec */ +#define WORK_QUEUE_DEFAULT_HOLD  50  /* hold time for initial run of a queue */ +#define WORK_QUEUE_DEFAULT_DELAY 10  /* minimum delay between queue runs */ + +/* action value, for use by item processor and item error handlers */ +typedef enum +{ +  WQ_SUCCESS = 0, +  WQ_ERROR,             /* Error, run error handler if provided */ +  WQ_RETRY_NOW,         /* retry immediately */ +  WQ_RETRY_LATER,       /* retry later, cease processing work queue */ +  WQ_REQUEUE            /* requeue item, continue processing work queue */ +} wq_item_status; + +/* A single work queue item, unsurprisingly */ +struct work_queue_item +{ +  void *data;                           /* opaque data */ +  unsigned short retry_count;           /* number of times retried */             +}; + +struct work_queue +{ +  struct thread_master *master;       /* thread master */ +  struct thread *thread;              /* thread, if one is active */ +  char *name;                         /* work queue name */ +   +  /* specification for this work queue */ +  struct { +    /* work function to process items with */ +    wq_item_status (*workfunc) (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 *); +     +    /* max number of retries to make for item that errors */ +    unsigned int max_retries;	 + +    unsigned int hold;	/* hold time for first run, in ms */ +    unsigned int delay; /* min delay between queue runs, in ms */ +  } spec; +   +  /* remaining fields should be opaque to users */ +  struct list *items;                 /* queue item list */ +  unsigned long runs;                  /* runs count */ +   +  struct { +    unsigned int best; +    unsigned int granularity; +    unsigned long total; +  } cycles;	/* cycle counts */ +}; + +/* User API */ +struct work_queue *work_queue_new (struct thread_master *, const char *); +void work_queue_free (struct work_queue *); +void work_queue_add (struct work_queue *, void *); + +/* Helpers, exported for thread.c and command.c */ +int work_queue_run (struct thread *); +extern struct cmd_element show_work_queues_cmd; +#endif /* _QUAGGA_WORK_QUEUE_H */  | 
