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 along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 #ifndef _ZEBRA_THREAD_H
22 #define _ZEBRA_THREAD_H
28 #include "frratomic.h"
39 #define RUSAGE_T struct rusage_t
41 #define GETRUSAGE(X) thread_getrusage(X)
43 PREDECL_LIST(thread_list
)
44 PREDECL_HEAP(thread_timer_list
)
47 /* number of pfd that fit in the allocated space of pfds. This is a
49 * and is the same for both pfds and copy. */
52 /* file descriptors to monitor for i/o */
54 /* number of pollfds stored in pfds */
57 /* chunk used for temp copy of pollfds */
59 /* number of pollfds stored in copy */
64 struct thread
*thread
;
66 struct thread
**threadref
;
69 /* Master of the theads. */
70 struct thread_master
{
74 struct thread
**write
;
75 struct thread_timer_list_head timer
;
76 struct thread_list_head event
, ready
, unuse
;
77 struct list
*cancel_req
;
79 pthread_cond_t cancel_cond
;
80 struct hash
*cpu_record
;
83 struct fd_handler handler
;
85 long selectpoll_timeout
;
94 uint8_t type
; /* thread type */
95 uint8_t add_type
; /* thread type */
96 struct thread_list_item threaditem
;
97 struct thread_timer_list_item timeritem
;
98 struct thread
**ref
; /* external reference (if given) */
99 struct thread_master
*master
; /* pointer to the struct thread_master */
100 int (*func
)(struct thread
*); /* event function */
101 void *arg
; /* event argument */
103 int val
; /* second argument of the event. */
104 int fd
; /* file descriptor in case of r/w */
105 struct timeval sands
; /* rest of time sands value. */
108 struct cpu_thread_history
*hist
; /* cache pointer to cpu_history */
109 unsigned long yield
; /* yield time in microseconds */
110 const char *funcname
; /* name of thread function */
111 const char *schedfrom
; /* source file thread was scheduled from */
112 int schedfrom_line
; /* line number of source file */
113 pthread_mutex_t mtx
; /* mutex for thread.c functions */
116 struct cpu_thread_history
{
117 int (*func
)(struct thread
*);
118 atomic_uint_fast32_t total_calls
;
119 atomic_uint_fast32_t total_active
;
121 atomic_size_t total
, max
;
123 struct time_stats cpu
;
124 atomic_uint_fast32_t types
;
125 const char *funcname
;
128 /* Struct timeval's tv_usec one second value. */
129 #define TIMER_SECOND_MICRO 1000000L
132 #define THREAD_READ 0
133 #define THREAD_WRITE 1
134 #define THREAD_TIMER 2
135 #define THREAD_EVENT 3
136 #define THREAD_READY 4
137 #define THREAD_UNUSED 5
138 #define THREAD_EXECUTE 6
140 /* Thread yield time. */
141 #define THREAD_YIELD_TIME_SLOT 10 * 1000L /* 10ms */
144 #define THREAD_ARG(X) ((X)->arg)
145 #define THREAD_FD(X) ((X)->u.fd)
146 #define THREAD_VAL(X) ((X)->u.val)
148 #define THREAD_OFF(thread) \
151 thread_cancel(thread); \
156 #define THREAD_READ_OFF(thread) THREAD_OFF(thread)
157 #define THREAD_WRITE_OFF(thread) THREAD_OFF(thread)
158 #define THREAD_TIMER_OFF(thread) THREAD_OFF(thread)
160 #define debugargdef const char *funcname, const char *schedfrom, int fromln
162 #define thread_add_read(m,f,a,v,t) funcname_thread_add_read_write(THREAD_READ,m,f,a,v,t,#f,__FILE__,__LINE__)
163 #define thread_add_write(m,f,a,v,t) funcname_thread_add_read_write(THREAD_WRITE,m,f,a,v,t,#f,__FILE__,__LINE__)
164 #define thread_add_timer(m,f,a,v,t) funcname_thread_add_timer(m,f,a,v,t,#f,__FILE__,__LINE__)
165 #define thread_add_timer_msec(m,f,a,v,t) funcname_thread_add_timer_msec(m,f,a,v,t,#f,__FILE__,__LINE__)
166 #define thread_add_timer_tv(m,f,a,v,t) funcname_thread_add_timer_tv(m,f,a,v,t,#f,__FILE__,__LINE__)
167 #define thread_add_event(m,f,a,v,t) funcname_thread_add_event(m,f,a,v,t,#f,__FILE__,__LINE__)
168 #define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f,__FILE__,__LINE__)
169 #define thread_execute_name(m, f, a, v, n) \
170 funcname_thread_execute(m, f, a, v, n, __FILE__, __LINE__)
173 extern struct thread_master
*thread_master_create(const char *);
174 void thread_master_set_name(struct thread_master
*master
, const char *name
);
175 extern void thread_master_free(struct thread_master
*);
176 extern void thread_master_free_unused(struct thread_master
*);
178 extern struct thread
*
179 funcname_thread_add_read_write(int dir
, struct thread_master
*,
180 int (*)(struct thread
*), void *, int,
181 struct thread
**, debugargdef
);
183 extern struct thread
*funcname_thread_add_timer(struct thread_master
*,
184 int (*)(struct thread
*),
185 void *, long, struct thread
**,
188 extern struct thread
*
189 funcname_thread_add_timer_msec(struct thread_master
*, int (*)(struct thread
*),
190 void *, long, struct thread
**, debugargdef
);
192 extern struct thread
*funcname_thread_add_timer_tv(struct thread_master
*,
193 int (*)(struct thread
*),
194 void *, struct timeval
*,
198 extern struct thread
*funcname_thread_add_event(struct thread_master
*,
199 int (*)(struct thread
*),
200 void *, int, struct thread
**,
203 extern void funcname_thread_execute(struct thread_master
*,
204 int (*)(struct thread
*), void *, int,
208 extern void thread_cancel(struct thread
*);
209 extern void thread_cancel_async(struct thread_master
*, struct thread
**,
211 extern void thread_cancel_event(struct thread_master
*, void *);
212 extern struct thread
*thread_fetch(struct thread_master
*, struct thread
*);
213 extern void thread_call(struct thread
*);
214 extern unsigned long thread_timer_remain_second(struct thread
*);
215 extern struct timeval
thread_timer_remain(struct thread
*);
216 extern unsigned long thread_timer_remain_msec(struct thread
*);
217 extern int thread_should_yield(struct thread
*);
218 /* set yield time for thread */
219 extern void thread_set_yield_time(struct thread
*, unsigned long);
221 /* Internal libfrr exports */
222 extern void thread_getrusage(RUSAGE_T
*);
223 extern void thread_cmd_init(void);
225 /* Returns elapsed real (wall clock) time. */
226 extern unsigned long thread_consumed_time(RUSAGE_T
*after
, RUSAGE_T
*before
,
227 unsigned long *cpu_time_elapsed
);
229 /* only for use in logging functions! */
230 extern pthread_key_t thread_current
;
236 #endif /* _ZEBRA_THREAD_H */