Annotation of embedaddon/quagga/lib/thread.h, revision 1.1

1.1     ! misho       1: /* Thread management routine header.
        !             2:  * Copyright (C) 1998 Kunihiro Ishiguro
        !             3:  *
        !             4:  * This file is part of GNU Zebra.
        !             5:  *
        !             6:  * GNU Zebra is free software; you can redistribute it and/or modify it
        !             7:  * under the terms of the GNU General Public License as published by the
        !             8:  * Free Software Foundation; either version 2, or (at your option) any
        !             9:  * later version.
        !            10:  *
        !            11:  * GNU Zebra is distributed in the hope that it will be useful, but
        !            12:  * WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            14:  * General Public License for more details.
        !            15:  *
        !            16:  * You should have received a copy of the GNU General Public License
        !            17:  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
        !            18:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
        !            19:  * 02111-1307, USA.  
        !            20:  */
        !            21: 
        !            22: #ifndef _ZEBRA_THREAD_H
        !            23: #define _ZEBRA_THREAD_H
        !            24: 
        !            25: struct rusage_t
        !            26: {
        !            27: #ifdef HAVE_RUSAGE
        !            28:   struct rusage cpu;
        !            29: #endif
        !            30:   struct timeval real;
        !            31: };
        !            32: #define RUSAGE_T        struct rusage_t
        !            33: 
        !            34: #define GETRUSAGE(X) thread_getrusage(X)
        !            35: 
        !            36: /* Linked list of thread. */
        !            37: struct thread_list
        !            38: {
        !            39:   struct thread *head;
        !            40:   struct thread *tail;
        !            41:   int count;
        !            42: };
        !            43: 
        !            44: /* Master of the theads. */
        !            45: struct thread_master
        !            46: {
        !            47:   struct thread_list read;
        !            48:   struct thread_list write;
        !            49:   struct thread_list timer;
        !            50:   struct thread_list event;
        !            51:   struct thread_list ready;
        !            52:   struct thread_list unuse;
        !            53:   struct thread_list background;
        !            54:   fd_set readfd;
        !            55:   fd_set writefd;
        !            56:   fd_set exceptfd;
        !            57:   unsigned long alloc;
        !            58: };
        !            59: 
        !            60: typedef unsigned char thread_type;
        !            61: 
        !            62: /* Thread itself. */
        !            63: struct thread
        !            64: {
        !            65:   thread_type type;            /* thread type */
        !            66:   thread_type add_type;                /* thread type */
        !            67:   struct thread *next;         /* next pointer of the thread */   
        !            68:   struct thread *prev;         /* previous pointer of the thread */
        !            69:   struct thread_master *master;        /* pointer to the struct thread_master. */
        !            70:   int (*func) (struct thread *); /* event function */
        !            71:   void *arg;                   /* event argument */
        !            72:   union {
        !            73:     int val;                   /* second argument of the event. */
        !            74:     int fd;                    /* file descriptor in case of read/write. */
        !            75:     struct timeval sands;      /* rest of time sands value. */
        !            76:   } u;
        !            77:   RUSAGE_T ru;                 /* Indepth usage info.  */
        !            78:   struct cpu_thread_history *hist; /* cache pointer to cpu_history */
        !            79:   char* funcname;
        !            80: };
        !            81: 
        !            82: struct cpu_thread_history 
        !            83: {
        !            84:   int (*func)(struct thread *);
        !            85:   char *funcname;
        !            86:   unsigned int total_calls;
        !            87:   struct time_stats
        !            88:   {
        !            89:     unsigned long total, max;
        !            90:   } real;
        !            91: #ifdef HAVE_RUSAGE
        !            92:   struct time_stats cpu;
        !            93: #endif
        !            94:   thread_type types;
        !            95: };
        !            96: 
        !            97: /* Clocks supported by Quagga */
        !            98: enum quagga_clkid {
        !            99:   QUAGGA_CLK_REALTIME = 0,     /* ala gettimeofday() */
        !           100:   QUAGGA_CLK_MONOTONIC,                /* monotonic, against an indeterminate base */
        !           101:   QUAGGA_CLK_REALTIME_STABILISED, /* like realtime, but non-decrementing */
        !           102: };
        !           103: 
        !           104: /* Thread types. */
        !           105: #define THREAD_READ           0
        !           106: #define THREAD_WRITE          1
        !           107: #define THREAD_TIMER          2
        !           108: #define THREAD_EVENT          3
        !           109: #define THREAD_READY          4
        !           110: #define THREAD_BACKGROUND     5
        !           111: #define THREAD_UNUSED         6
        !           112: #define THREAD_EXECUTE        7
        !           113: 
        !           114: /* Thread yield time.  */
        !           115: #define THREAD_YIELD_TIME_SLOT     10 * 1000L /* 10ms */
        !           116: 
        !           117: /* Macros. */
        !           118: #define THREAD_ARG(X) ((X)->arg)
        !           119: #define THREAD_FD(X)  ((X)->u.fd)
        !           120: #define THREAD_VAL(X) ((X)->u.val)
        !           121: 
        !           122: #define THREAD_READ_ON(master,thread,func,arg,sock) \
        !           123:   do { \
        !           124:     if (! thread) \
        !           125:       thread = thread_add_read (master, func, arg, sock); \
        !           126:   } while (0)
        !           127: 
        !           128: #define THREAD_WRITE_ON(master,thread,func,arg,sock) \
        !           129:   do { \
        !           130:     if (! thread) \
        !           131:       thread = thread_add_write (master, func, arg, sock); \
        !           132:   } while (0)
        !           133: 
        !           134: #define THREAD_TIMER_ON(master,thread,func,arg,time) \
        !           135:   do { \
        !           136:     if (! thread) \
        !           137:       thread = thread_add_timer (master, func, arg, time); \
        !           138:   } while (0)
        !           139: 
        !           140: #define THREAD_OFF(thread) \
        !           141:   do { \
        !           142:     if (thread) \
        !           143:       { \
        !           144:         thread_cancel (thread); \
        !           145:         thread = NULL; \
        !           146:       } \
        !           147:   } while (0)
        !           148: 
        !           149: #define THREAD_READ_OFF(thread)  THREAD_OFF(thread)
        !           150: #define THREAD_WRITE_OFF(thread)  THREAD_OFF(thread)
        !           151: #define THREAD_TIMER_OFF(thread)  THREAD_OFF(thread)
        !           152: 
        !           153: #define thread_add_read(m,f,a,v) funcname_thread_add_read(m,f,a,v,#f)
        !           154: #define thread_add_write(m,f,a,v) funcname_thread_add_write(m,f,a,v,#f)
        !           155: #define thread_add_timer(m,f,a,v) funcname_thread_add_timer(m,f,a,v,#f)
        !           156: #define thread_add_timer_msec(m,f,a,v) funcname_thread_add_timer_msec(m,f,a,v,#f)
        !           157: #define thread_add_event(m,f,a,v) funcname_thread_add_event(m,f,a,v,#f)
        !           158: #define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f)
        !           159: 
        !           160: /* The 4th arg to thread_add_background is the # of milliseconds to delay. */
        !           161: #define thread_add_background(m,f,a,v) funcname_thread_add_background(m,f,a,v,#f)
        !           162: 
        !           163: /* Prototypes. */
        !           164: extern struct thread_master *thread_master_create (void);
        !           165: extern void thread_master_free (struct thread_master *);
        !           166: 
        !           167: extern struct thread *funcname_thread_add_read (struct thread_master *, 
        !           168:                                                int (*)(struct thread *),
        !           169:                                                void *, int, const char*);
        !           170: extern struct thread *funcname_thread_add_write (struct thread_master *,
        !           171:                                                 int (*)(struct thread *),
        !           172:                                                 void *, int, const char*);
        !           173: extern struct thread *funcname_thread_add_timer (struct thread_master *,
        !           174:                                                 int (*)(struct thread *),
        !           175:                                                 void *, long, const char*);
        !           176: extern struct thread *funcname_thread_add_timer_msec (struct thread_master *,
        !           177:                                                      int (*)(struct thread *),
        !           178:                                                      void *, long, const char*);
        !           179: extern struct thread *funcname_thread_add_event (struct thread_master *,
        !           180:                                                 int (*)(struct thread *),
        !           181:                                                 void *, int, const char*);
        !           182: extern struct thread *funcname_thread_add_background (struct thread_master *,
        !           183:                                                int (*func)(struct thread *),
        !           184:                                               void *arg,
        !           185:                                               long milliseconds_to_delay,
        !           186:                                               const char *funcname);
        !           187: extern struct thread *funcname_thread_execute (struct thread_master *,
        !           188:                                                int (*)(struct thread *),
        !           189:                                                void *, int, const char *);
        !           190: extern void thread_cancel (struct thread *);
        !           191: extern unsigned int thread_cancel_event (struct thread_master *, void *);
        !           192: extern struct thread *thread_fetch (struct thread_master *, struct thread *);
        !           193: extern void thread_call (struct thread *);
        !           194: extern unsigned long thread_timer_remain_second (struct thread *);
        !           195: extern int thread_should_yield (struct thread *);
        !           196: 
        !           197: /* Internal libzebra exports */
        !           198: extern void thread_getrusage (RUSAGE_T *);
        !           199: extern struct cmd_element show_thread_cpu_cmd;
        !           200: extern struct cmd_element clear_thread_cpu_cmd;
        !           201: 
        !           202: /* replacements for the system gettimeofday(), clock_gettime() and
        !           203:  * time() functions, providing support for non-decrementing clock on
        !           204:  * all systems, and fully monotonic on /some/ systems.
        !           205:  */
        !           206: extern int quagga_gettime (enum quagga_clkid, struct timeval *);
        !           207: extern time_t quagga_time (time_t *);
        !           208: 
        !           209: /* Returns elapsed real (wall clock) time. */
        !           210: extern unsigned long thread_consumed_time(RUSAGE_T *after, RUSAGE_T *before,
        !           211:                                          unsigned long *cpu_time_elapsed);
        !           212: 
        !           213: /* Global variable containing a recent result from gettimeofday.  This can
        !           214:    be used instead of calling gettimeofday if a recent value is sufficient.
        !           215:    This is guaranteed to be refreshed before a thread is called. */
        !           216: extern struct timeval recent_time;
        !           217: /* Similar to recent_time, but a monotonically increasing time value */
        !           218: extern struct timeval recent_relative_time (void);
        !           219: #endif /* _ZEBRA_THREAD_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>