]>
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. */
46 * Abstract it so we can use different methodologies to
49 typedef fd_set thread_fd_set
;
51 #if defined(HAVE_POLL_CALL)
54 /* number of pfd stored in pfds */
56 /* number of pfd stored in pfds + number of snmp pfd */
58 /* number of pfd that fit in the allocated space of pfds */
70 /* Master of the theads. */
71 struct thread_master
{
73 struct thread
**write
;
75 struct thread_list event
;
76 struct thread_list ready
;
77 struct thread_list unuse
;
78 struct pqueue
*background
;
80 struct fd_handler handler
;
84 typedef unsigned char thread_type
;
88 thread_type type
; /* thread type */
89 thread_type add_type
; /* thread type */
90 struct thread
*next
; /* next pointer of the thread */
91 struct thread
*prev
; /* previous pointer of the thread */
92 struct thread_master
*master
; /* pointer to the struct thread_master. */
93 int (*func
)(struct thread
*); /* event function */
94 void *arg
; /* event argument */
96 int val
; /* second argument of the event. */
97 int fd
; /* file descriptor in case of read/write. */
98 struct timeval sands
; /* rest of time sands value. */
100 int index
; /* used for timers to store position in queue */
102 struct cpu_thread_history
*hist
; /* cache pointer to cpu_history */
103 unsigned long yield
; /* yield time in us */
104 const char *funcname
;
105 const char *schedfrom
;
109 struct cpu_thread_history
{
110 int (*func
)(struct thread
*);
111 unsigned int total_calls
;
112 unsigned int total_active
;
114 unsigned long total
, max
;
116 struct time_stats cpu
;
118 const char *funcname
;
121 /* Struct timeval's tv_usec one second value. */
122 #define TIMER_SECOND_MICRO 1000000L
125 #define THREAD_READ 0
126 #define THREAD_WRITE 1
127 #define THREAD_TIMER 2
128 #define THREAD_EVENT 3
129 #define THREAD_READY 4
130 #define THREAD_BACKGROUND 5
131 #define THREAD_UNUSED 6
132 #define THREAD_EXECUTE 7
134 /* Thread yield time. */
135 #define THREAD_YIELD_TIME_SLOT 10 * 1000L /* 10ms */
138 #define THREAD_ARG(X) ((X)->arg)
139 #define THREAD_FD(X) ((X)->u.fd)
140 #define THREAD_VAL(X) ((X)->u.val)
142 #define THREAD_READ_ON(master, thread, func, arg, sock) \
145 thread = thread_add_read(master, func, arg, sock); \
148 #define THREAD_WRITE_ON(master, thread, func, arg, sock) \
151 thread = thread_add_write(master, func, arg, sock); \
154 #define THREAD_TIMER_ON(master, thread, func, arg, time) \
157 thread = thread_add_timer(master, func, arg, time); \
160 #define THREAD_TIMER_MSEC_ON(master, thread, func, arg, time) \
163 thread = thread_add_timer_msec(master, func, arg, \
167 #define THREAD_OFF(thread) \
170 thread_cancel(thread); \
175 #define THREAD_READ_OFF(thread) THREAD_OFF(thread)
176 #define THREAD_WRITE_OFF(thread) THREAD_OFF(thread)
177 #define THREAD_TIMER_OFF(thread) THREAD_OFF(thread)
179 #define debugargdef const char *funcname, const char *schedfrom, int fromln
181 #define thread_add_read(m,f,a,v) funcname_thread_add_read_write(THREAD_READ,m,f,a,v,#f,__FILE__,__LINE__)
182 #define thread_add_write(m,f,a,v) funcname_thread_add_read_write(THREAD_WRITE,m,f,a,v,#f,__FILE__,__LINE__)
183 #define thread_add_timer(m,f,a,v) funcname_thread_add_timer(m,f,a,v,#f,__FILE__,__LINE__)
184 #define thread_add_timer_msec(m,f,a,v) funcname_thread_add_timer_msec(m,f,a,v,#f,__FILE__,__LINE__)
185 #define thread_add_timer_tv(m,f,a,v) funcname_thread_add_timer_tv(m,f,a,v,#f,__FILE__,__LINE__)
186 #define thread_add_event(m,f,a,v) funcname_thread_add_event(m,f,a,v,#f,__FILE__,__LINE__)
187 #define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f,__FILE__,__LINE__)
189 /* The 4th arg to thread_add_background is the # of milliseconds to delay. */
190 #define thread_add_background(m,f,a,v) funcname_thread_add_background(m,f,a,v,#f,__FILE__,__LINE__)
193 extern struct thread_master
*thread_master_create(void);
194 extern void thread_master_free(struct thread_master
*);
195 extern void thread_master_free_unused(struct thread_master
*);
197 extern struct thread
*funcname_thread_add_read_write(int dir
,
198 struct thread_master
*,
199 int (*)(struct thread
*),
200 void *, int, debugargdef
);
201 extern struct thread
*funcname_thread_add_timer(struct thread_master
*,
202 int (*)(struct thread
*),
203 void *, long, debugargdef
);
204 extern struct thread
*funcname_thread_add_timer_msec(struct thread_master
*,
205 int (*)(struct thread
*),
206 void *, long, debugargdef
);
207 extern struct thread
*funcname_thread_add_timer_tv(struct thread_master
*,
208 int (*)(struct thread
*),
209 void *, struct timeval
*,
211 extern struct thread
*funcname_thread_add_event(struct thread_master
*,
212 int (*)(struct thread
*),
213 void *, int, debugargdef
);
214 extern struct thread
*
215 funcname_thread_add_background(struct thread_master
*,
216 int (*func
)(struct thread
*), void *arg
,
217 long milliseconds_to_delay
, debugargdef
);
218 extern struct thread
*funcname_thread_execute(struct thread_master
*,
219 int (*)(struct thread
*), void *,
223 extern void thread_cancel(struct thread
*);
224 extern unsigned int thread_cancel_event(struct thread_master
*, void *);
225 extern struct thread
*thread_fetch(struct thread_master
*, struct thread
*);
226 extern void thread_call(struct thread
*);
227 extern unsigned long thread_timer_remain_second(struct thread
*);
228 extern struct timeval
thread_timer_remain(struct thread
*);
229 extern int thread_should_yield(struct thread
*);
230 /* set yield time for thread */
231 extern void thread_set_yield_time(struct thread
*, unsigned long);
233 /* Internal libfrr exports */
234 extern void thread_getrusage(RUSAGE_T
*);
235 extern void thread_cmd_init(void);
237 /* Returns elapsed real (wall clock) time. */
238 extern unsigned long thread_consumed_time(RUSAGE_T
*after
, RUSAGE_T
*before
,
239 unsigned long *cpu_time_elapsed
);
241 /* only for use in logging functions! */
242 extern struct thread
*thread_current
;
244 #endif /* _ZEBRA_THREAD_H */