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

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: 
1.1.1.2   misho      25: #include <zebra.h>
                     26: 
1.1       misho      27: struct rusage_t
                     28: {
                     29: #ifdef HAVE_RUSAGE
                     30:   struct rusage cpu;
                     31: #endif
                     32:   struct timeval real;
                     33: };
                     34: #define RUSAGE_T        struct rusage_t
                     35: 
                     36: #define GETRUSAGE(X) thread_getrusage(X)
                     37: 
                     38: /* Linked list of thread. */
                     39: struct thread_list
                     40: {
                     41:   struct thread *head;
                     42:   struct thread *tail;
                     43:   int count;
                     44: };
                     45: 
1.1.1.4 ! misho      46: struct pqueue;
        !            47: 
1.1       misho      48: /* Master of the theads. */
                     49: struct thread_master
                     50: {
                     51:   struct thread_list read;
                     52:   struct thread_list write;
1.1.1.4 ! misho      53:   struct pqueue *timer;
1.1       misho      54:   struct thread_list event;
                     55:   struct thread_list ready;
                     56:   struct thread_list unuse;
1.1.1.4 ! misho      57:   struct pqueue *background;
1.1       misho      58:   fd_set readfd;
                     59:   fd_set writefd;
                     60:   fd_set exceptfd;
                     61:   unsigned long alloc;
                     62: };
                     63: 
                     64: typedef unsigned char thread_type;
                     65: 
                     66: /* Thread itself. */
                     67: struct thread
                     68: {
                     69:   thread_type type;            /* thread type */
                     70:   thread_type add_type;                /* thread type */
                     71:   struct thread *next;         /* next pointer of the thread */   
                     72:   struct thread *prev;         /* previous pointer of the thread */
                     73:   struct thread_master *master;        /* pointer to the struct thread_master. */
                     74:   int (*func) (struct thread *); /* event function */
                     75:   void *arg;                   /* event argument */
                     76:   union {
                     77:     int val;                   /* second argument of the event. */
                     78:     int fd;                    /* file descriptor in case of read/write. */
                     79:     struct timeval sands;      /* rest of time sands value. */
                     80:   } u;
1.1.1.4 ! misho      81:   int index;                   /* used for timers to store position in queue */
1.1.1.3   misho      82:   struct timeval real;
1.1       misho      83:   struct cpu_thread_history *hist; /* cache pointer to cpu_history */
1.1.1.4 ! misho      84:   const char *funcname;
        !            85:   const char *schedfrom;
        !            86:   int schedfrom_line;
1.1       misho      87: };
                     88: 
                     89: struct cpu_thread_history 
                     90: {
                     91:   int (*func)(struct thread *);
                     92:   unsigned int total_calls;
                     93:   struct time_stats
                     94:   {
                     95:     unsigned long total, max;
                     96:   } real;
                     97: #ifdef HAVE_RUSAGE
                     98:   struct time_stats cpu;
                     99: #endif
                    100:   thread_type types;
1.1.1.4 ! misho     101:   const char *funcname;
1.1       misho     102: };
                    103: 
                    104: /* Clocks supported by Quagga */
                    105: enum quagga_clkid {
                    106:   QUAGGA_CLK_REALTIME = 0,     /* ala gettimeofday() */
                    107:   QUAGGA_CLK_MONOTONIC,                /* monotonic, against an indeterminate base */
                    108:   QUAGGA_CLK_REALTIME_STABILISED, /* like realtime, but non-decrementing */
                    109: };
                    110: 
                    111: /* Thread types. */
                    112: #define THREAD_READ           0
                    113: #define THREAD_WRITE          1
                    114: #define THREAD_TIMER          2
                    115: #define THREAD_EVENT          3
                    116: #define THREAD_READY          4
                    117: #define THREAD_BACKGROUND     5
                    118: #define THREAD_UNUSED         6
                    119: #define THREAD_EXECUTE        7
                    120: 
                    121: /* Thread yield time.  */
                    122: #define THREAD_YIELD_TIME_SLOT     10 * 1000L /* 10ms */
                    123: 
                    124: /* Macros. */
                    125: #define THREAD_ARG(X) ((X)->arg)
                    126: #define THREAD_FD(X)  ((X)->u.fd)
                    127: #define THREAD_VAL(X) ((X)->u.val)
                    128: 
                    129: #define THREAD_READ_ON(master,thread,func,arg,sock) \
                    130:   do { \
                    131:     if (! thread) \
                    132:       thread = thread_add_read (master, func, arg, sock); \
                    133:   } while (0)
                    134: 
                    135: #define THREAD_WRITE_ON(master,thread,func,arg,sock) \
                    136:   do { \
                    137:     if (! thread) \
                    138:       thread = thread_add_write (master, func, arg, sock); \
                    139:   } while (0)
                    140: 
                    141: #define THREAD_TIMER_ON(master,thread,func,arg,time) \
                    142:   do { \
                    143:     if (! thread) \
                    144:       thread = thread_add_timer (master, func, arg, time); \
                    145:   } while (0)
                    146: 
1.1.1.2   misho     147: #define THREAD_TIMER_MSEC_ON(master,thread,func,arg,time) \
                    148:   do { \
                    149:     if (! thread) \
                    150:       thread = thread_add_timer_msec (master, func, arg, time); \
                    151:   } while (0)
                    152: 
1.1       misho     153: #define THREAD_OFF(thread) \
                    154:   do { \
                    155:     if (thread) \
                    156:       { \
                    157:         thread_cancel (thread); \
                    158:         thread = NULL; \
                    159:       } \
                    160:   } while (0)
                    161: 
                    162: #define THREAD_READ_OFF(thread)  THREAD_OFF(thread)
                    163: #define THREAD_WRITE_OFF(thread)  THREAD_OFF(thread)
                    164: #define THREAD_TIMER_OFF(thread)  THREAD_OFF(thread)
                    165: 
1.1.1.4 ! misho     166: #define debugargdef  const char *funcname, const char *schedfrom, int fromln
        !           167: 
        !           168: #define thread_add_read(m,f,a,v) funcname_thread_add_read(m,f,a,v,#f,__FILE__,__LINE__)
        !           169: #define thread_add_write(m,f,a,v) funcname_thread_add_write(m,f,a,v,#f,__FILE__,__LINE__)
        !           170: #define thread_add_timer(m,f,a,v) funcname_thread_add_timer(m,f,a,v,#f,__FILE__,__LINE__)
        !           171: #define thread_add_timer_msec(m,f,a,v) funcname_thread_add_timer_msec(m,f,a,v,#f,__FILE__,__LINE__)
        !           172: #define thread_add_event(m,f,a,v) funcname_thread_add_event(m,f,a,v,#f,__FILE__,__LINE__)
        !           173: #define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f,__FILE__,__LINE__)
1.1       misho     174: 
                    175: /* The 4th arg to thread_add_background is the # of milliseconds to delay. */
1.1.1.4 ! misho     176: #define thread_add_background(m,f,a,v) funcname_thread_add_background(m,f,a,v,#f,__FILE__,__LINE__)
1.1       misho     177: 
                    178: /* Prototypes. */
                    179: extern struct thread_master *thread_master_create (void);
                    180: extern void thread_master_free (struct thread_master *);
                    181: 
                    182: extern struct thread *funcname_thread_add_read (struct thread_master *, 
                    183:                                                int (*)(struct thread *),
1.1.1.4 ! misho     184:                                                void *, int, debugargdef);
1.1       misho     185: extern struct thread *funcname_thread_add_write (struct thread_master *,
                    186:                                                 int (*)(struct thread *),
1.1.1.4 ! misho     187:                                                 void *, int, debugargdef);
1.1       misho     188: extern struct thread *funcname_thread_add_timer (struct thread_master *,
                    189:                                                 int (*)(struct thread *),
1.1.1.4 ! misho     190:                                                 void *, long, debugargdef);
1.1       misho     191: extern struct thread *funcname_thread_add_timer_msec (struct thread_master *,
                    192:                                                      int (*)(struct thread *),
1.1.1.4 ! misho     193:                                                      void *, long, debugargdef);
1.1       misho     194: extern struct thread *funcname_thread_add_event (struct thread_master *,
                    195:                                                 int (*)(struct thread *),
1.1.1.4 ! misho     196:                                                 void *, int, debugargdef);
1.1       misho     197: extern struct thread *funcname_thread_add_background (struct thread_master *,
                    198:                                                int (*func)(struct thread *),
                    199:                                               void *arg,
                    200:                                               long milliseconds_to_delay,
1.1.1.4 ! misho     201:                                               debugargdef);
1.1       misho     202: extern struct thread *funcname_thread_execute (struct thread_master *,
                    203:                                                int (*)(struct thread *),
1.1.1.4 ! misho     204:                                                void *, int, debugargdef);
        !           205: #undef debugargdef
        !           206: 
1.1       misho     207: extern void thread_cancel (struct thread *);
                    208: extern unsigned int thread_cancel_event (struct thread_master *, void *);
                    209: extern struct thread *thread_fetch (struct thread_master *, struct thread *);
                    210: extern void thread_call (struct thread *);
                    211: extern unsigned long thread_timer_remain_second (struct thread *);
1.1.1.4 ! misho     212: extern struct timeval thread_timer_remain(struct thread*);
1.1       misho     213: extern int thread_should_yield (struct thread *);
1.1.1.4 ! misho     214: extern unsigned long timeval_elapsed (struct timeval a, struct timeval b);
1.1       misho     215: 
                    216: /* Internal libzebra exports */
                    217: extern void thread_getrusage (RUSAGE_T *);
                    218: extern struct cmd_element show_thread_cpu_cmd;
                    219: extern struct cmd_element clear_thread_cpu_cmd;
                    220: 
                    221: /* replacements for the system gettimeofday(), clock_gettime() and
                    222:  * time() functions, providing support for non-decrementing clock on
                    223:  * all systems, and fully monotonic on /some/ systems.
                    224:  */
                    225: extern int quagga_gettime (enum quagga_clkid, struct timeval *);
                    226: extern time_t quagga_time (time_t *);
                    227: 
                    228: /* Returns elapsed real (wall clock) time. */
                    229: extern unsigned long thread_consumed_time(RUSAGE_T *after, RUSAGE_T *before,
                    230:                                          unsigned long *cpu_time_elapsed);
                    231: 
                    232: /* Global variable containing a recent result from gettimeofday.  This can
                    233:    be used instead of calling gettimeofday if a recent value is sufficient.
                    234:    This is guaranteed to be refreshed before a thread is called. */
                    235: extern struct timeval recent_time;
                    236: /* Similar to recent_time, but a monotonically increasing time value */
                    237: extern struct timeval recent_relative_time (void);
1.1.1.4 ! misho     238: 
        !           239: /* only for use in logging functions! */
        !           240: extern struct thread *thread_current;
        !           241: 
1.1       misho     242: #endif /* _ZEBRA_THREAD_H */

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