]>
git.proxmox.com Git - mirror_frr.git/blob - lib/thread.h
1 /* Thread management routine header.
2 * Copyright (C) 1998 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
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
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.
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
22 #ifndef _ZEBRA_THREAD_H
23 #define _ZEBRA_THREAD_H
32 #define RUSAGE_T struct rusage_t
34 #define GETRUSAGE(X) thread_getrusage(X)
36 /* Linked list of thread. */
47 * Abstract it so we can use different methodologies to
50 typedef fd_set thread_fd_set
;
52 #if defined(HAVE_POLL)
56 /* number of pfd stored in pfds */
58 /* number of pfd stored in pfds + number of snmp pfd */
60 /* number of pfd that fit in the allocated space of pfds */
73 /* Master of the theads. */
77 struct thread
**write
;
79 struct thread_list event
;
80 struct thread_list ready
;
81 struct thread_list unuse
;
82 struct pqueue
*background
;
84 struct fd_handler handler
;
88 typedef unsigned char thread_type
;
93 thread_type type
; /* thread type */
94 thread_type add_type
; /* thread type */
95 struct thread
*next
; /* next pointer of the thread */
96 struct thread
*prev
; /* previous pointer of the thread */
97 struct thread_master
*master
; /* pointer to the struct thread_master. */
98 int (*func
) (struct thread
*); /* event function */
99 void *arg
; /* event argument */
101 int val
; /* second argument of the event. */
102 int fd
; /* file descriptor in case of read/write. */
103 struct timeval sands
; /* rest of time sands value. */
105 int index
; /* used for timers to store position in queue */
107 struct cpu_thread_history
*hist
; /* cache pointer to cpu_history */
108 unsigned long yield
; /* yield time in us */
109 const char *funcname
;
110 const char *schedfrom
;
114 struct cpu_thread_history
116 int (*func
)(struct thread
*);
117 unsigned int total_calls
;
120 unsigned long total
, max
;
122 struct time_stats cpu
;
124 const char *funcname
;
127 /* Clocks supported by Quagga */
129 QUAGGA_CLK_MONOTONIC
= 1, /* monotonic, against an indeterminate base */
132 /* Struct timeval's tv_usec one second value. */
133 #define TIMER_SECOND_MICRO 1000000L
136 #define THREAD_READ 0
137 #define THREAD_WRITE 1
138 #define THREAD_TIMER 2
139 #define THREAD_EVENT 3
140 #define THREAD_READY 4
141 #define THREAD_BACKGROUND 5
142 #define THREAD_UNUSED 6
143 #define THREAD_EXECUTE 7
145 /* Thread yield time. */
146 #define THREAD_YIELD_TIME_SLOT 10 * 1000L /* 10ms */
149 #define THREAD_ARG(X) ((X)->arg)
150 #define THREAD_FD(X) ((X)->u.fd)
151 #define THREAD_VAL(X) ((X)->u.val)
153 #define THREAD_READ_ON(master,thread,func,arg,sock) \
156 thread = thread_add_read (master, func, arg, sock); \
159 #define THREAD_WRITE_ON(master,thread,func,arg,sock) \
162 thread = thread_add_write (master, func, arg, sock); \
165 #define THREAD_TIMER_ON(master,thread,func,arg,time) \
168 thread = thread_add_timer (master, func, arg, time); \
171 #define THREAD_TIMER_MSEC_ON(master,thread,func,arg,time) \
174 thread = thread_add_timer_msec (master, func, arg, time); \
177 #define THREAD_OFF(thread) \
181 thread_cancel (thread); \
186 #define THREAD_READ_OFF(thread) THREAD_OFF(thread)
187 #define THREAD_WRITE_OFF(thread) THREAD_OFF(thread)
188 #define THREAD_TIMER_OFF(thread) THREAD_OFF(thread)
190 #define debugargdef const char *funcname, const char *schedfrom, int fromln
192 #define thread_add_read(m,f,a,v) funcname_thread_add_read_write(THREAD_READ,m,f,a,v,#f,__FILE__,__LINE__)
193 #define thread_add_write(m,f,a,v) funcname_thread_add_read_write(THREAD_WRITE,m,f,a,v,#f,__FILE__,__LINE__)
194 #define thread_add_timer(m,f,a,v) funcname_thread_add_timer(m,f,a,v,#f,__FILE__,__LINE__)
195 #define thread_add_timer_msec(m,f,a,v) funcname_thread_add_timer_msec(m,f,a,v,#f,__FILE__,__LINE__)
196 #define thread_add_timer_tv(m,f,a,v) funcname_thread_add_timer_tv(m,f,a,v,#f,__FILE__,__LINE__)
197 #define thread_add_event(m,f,a,v) funcname_thread_add_event(m,f,a,v,#f,__FILE__,__LINE__)
198 #define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f,__FILE__,__LINE__)
200 /* The 4th arg to thread_add_background is the # of milliseconds to delay. */
201 #define thread_add_background(m,f,a,v) funcname_thread_add_background(m,f,a,v,#f,__FILE__,__LINE__)
204 extern struct thread_master
*thread_master_create (void);
205 extern void thread_master_free (struct thread_master
*);
206 extern void thread_master_free_unused(struct thread_master
*);
208 extern struct thread
*funcname_thread_add_read_write (int dir
, struct thread_master
*,
209 int (*)(struct thread
*),
210 void *, int, debugargdef
);
211 extern struct thread
*funcname_thread_add_timer (struct thread_master
*,
212 int (*)(struct thread
*),
213 void *, long, debugargdef
);
214 extern struct thread
*funcname_thread_add_timer_msec (struct thread_master
*,
215 int (*)(struct thread
*),
216 void *, long, debugargdef
);
217 extern struct thread
*funcname_thread_add_timer_tv (struct thread_master
*,
218 int (*)(struct thread
*),
219 void *, struct timeval
*,
221 extern struct thread
*funcname_thread_add_event (struct thread_master
*,
222 int (*)(struct thread
*),
223 void *, int, debugargdef
);
224 extern struct thread
*funcname_thread_add_background (struct thread_master
*,
225 int (*func
)(struct thread
*),
227 long milliseconds_to_delay
,
229 extern struct thread
*funcname_thread_execute (struct thread_master
*,
230 int (*)(struct thread
*),
231 void *, int, debugargdef
);
234 extern void thread_cancel (struct thread
*);
235 extern unsigned int thread_cancel_event (struct thread_master
*, void *);
236 extern struct thread
*thread_fetch (struct thread_master
*, struct thread
*);
237 extern void thread_call (struct thread
*);
238 extern unsigned long thread_timer_remain_second (struct thread
*);
239 extern struct timeval
thread_timer_remain(struct thread
*);
240 extern int thread_should_yield (struct thread
*);
241 extern unsigned long timeval_elapsed (struct timeval a
, struct timeval b
);
242 /* set yield time for thread */
243 extern void thread_set_yield_time (struct thread
*, unsigned long);
245 /* Internal libzebra exports */
246 extern void thread_getrusage (RUSAGE_T
*);
247 extern void thread_cmd_init (void);
249 /* replacements for the system gettimeofday(), clock_gettime() and
250 * time() functions, providing support for non-decrementing clock on
251 * all systems, and fully monotonic on /some/ systems.
253 extern int quagga_gettime (enum quagga_clkid
, struct timeval
*);
254 extern time_t quagga_monotime (void);
256 /* Returns elapsed real (wall clock) time. */
257 extern unsigned long thread_consumed_time(RUSAGE_T
*after
, RUSAGE_T
*before
,
258 unsigned long *cpu_time_elapsed
);
260 /* Global variable containing a recent result from gettimeofday. This can
261 be used instead of calling gettimeofday if a recent value is sufficient.
262 This is guaranteed to be refreshed before a thread is called. */
263 extern struct timeval recent_time
;
264 /* Similar to recent_time, but a monotonically increasing time value */
265 extern struct timeval
recent_relative_time (void);
267 /* only for use in logging functions! */
268 extern struct thread
*thread_current
;
270 #endif /* _ZEBRA_THREAD_H */