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
34 #define RUSAGE_T struct rusage_t
36 #define GETRUSAGE(X) thread_getrusage(X)
38 /* Linked list of thread. */
50 /* number of pfd that fit in the allocated space of pfds. This is a constant
51 * and is the same for both pfds and copy. */
54 /* file descriptors to monitor for i/o */
56 /* number of pollfds stored in pfds */
59 /* chunk used for temp copy of pollfds */
61 /* number of pollfds stored in copy */
66 struct thread
*thread
;
68 struct thread
**threadref
;
71 /* Master of the theads. */
75 struct thread
**write
;
77 struct thread_list event
;
78 struct thread_list ready
;
79 struct thread_list unuse
;
80 struct list
*cancel_req
;
82 pthread_cond_t cancel_cond
;
83 struct hash
*cpu_record
;
86 struct fd_handler handler
;
88 long selectpoll_timeout
;
95 typedef unsigned char thread_type
;
100 thread_type type
; /* thread type */
101 thread_type add_type
; /* thread type */
102 struct thread
*next
; /* next pointer of the thread */
103 struct thread
*prev
; /* previous pointer of the thread */
104 struct thread
**ref
; /* external reference (if given) */
105 struct thread_master
*master
; /* pointer to the struct thread_master */
106 int (*func
) (struct thread
*); /* event function */
107 void *arg
; /* event argument */
109 int val
; /* second argument of the event. */
110 int fd
; /* file descriptor in case of r/w */
111 struct timeval sands
; /* rest of time sands value. */
113 int index
; /* queue position for timers */
115 struct cpu_thread_history
*hist
; /* cache pointer to cpu_history */
116 unsigned long yield
; /* yield time in microseconds */
117 const char *funcname
; /* name of thread function */
118 const char *schedfrom
; /* source file thread was scheduled from */
119 int schedfrom_line
; /* line number of source file */
120 pthread_mutex_t mtx
; /* mutex for thread.c functions */
123 struct cpu_thread_history
125 int (*func
)(struct thread
*);
126 unsigned int total_calls
;
127 unsigned int total_active
;
130 unsigned long total
, max
;
132 struct time_stats cpu
;
134 const char *funcname
;
137 /* Struct timeval's tv_usec one second value. */
138 #define TIMER_SECOND_MICRO 1000000L
141 #define THREAD_READ 0
142 #define THREAD_WRITE 1
143 #define THREAD_TIMER 2
144 #define THREAD_EVENT 3
145 #define THREAD_READY 4
146 #define THREAD_UNUSED 5
147 #define THREAD_EXECUTE 6
149 /* Thread yield time. */
150 #define THREAD_YIELD_TIME_SLOT 10 * 1000L /* 10ms */
153 #define THREAD_ARG(X) ((X)->arg)
154 #define THREAD_FD(X) ((X)->u.fd)
155 #define THREAD_VAL(X) ((X)->u.val)
157 #define THREAD_OFF(thread) \
161 thread_cancel (thread); \
166 #define THREAD_READ_OFF(thread) THREAD_OFF(thread)
167 #define THREAD_WRITE_OFF(thread) THREAD_OFF(thread)
168 #define THREAD_TIMER_OFF(thread) THREAD_OFF(thread)
170 #define debugargdef const char *funcname, const char *schedfrom, int fromln
172 #define thread_add_read(m,f,a,v,t) funcname_thread_add_read_write(THREAD_READ,m,f,a,v,t,#f,__FILE__,__LINE__)
173 #define thread_add_write(m,f,a,v,t) funcname_thread_add_read_write(THREAD_WRITE,m,f,a,v,t,#f,__FILE__,__LINE__)
174 #define thread_add_timer(m,f,a,v,t) funcname_thread_add_timer(m,f,a,v,t,#f,__FILE__,__LINE__)
175 #define thread_add_timer_msec(m,f,a,v,t) funcname_thread_add_timer_msec(m,f,a,v,t,#f,__FILE__,__LINE__)
176 #define thread_add_timer_tv(m,f,a,v,t) funcname_thread_add_timer_tv(m,f,a,v,t,#f,__FILE__,__LINE__)
177 #define thread_add_event(m,f,a,v,t) funcname_thread_add_event(m,f,a,v,t,#f,__FILE__,__LINE__)
178 #define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f,__FILE__,__LINE__)
181 extern struct thread_master
*thread_master_create (void);
182 extern void thread_master_free (struct thread_master
*);
183 extern void thread_master_free_unused(struct thread_master
*);
185 extern struct thread
* funcname_thread_add_read_write (int dir
, struct thread_master
*,
186 int (*)(struct thread
*), void *, int, struct thread
**, debugargdef
);
188 extern struct thread
* funcname_thread_add_timer (struct thread_master
*,
189 int (*)(struct thread
*), void *, long, struct thread
**, debugargdef
);
191 extern struct thread
* funcname_thread_add_timer_msec (struct thread_master
*,
192 int (*)(struct thread
*), void *, long, struct thread
**, debugargdef
);
194 extern struct thread
* funcname_thread_add_timer_tv (struct thread_master
*,
195 int (*)(struct thread
*), void *, struct timeval
*, struct thread
**, debugargdef
);
197 extern struct thread
* funcname_thread_add_event (struct thread_master
*,
198 int (*)(struct thread
*), void *, int, struct thread
**, debugargdef
);
200 extern void funcname_thread_execute (struct thread_master
*,
201 int (*)(struct thread
*), void *, int, debugargdef
);
204 extern void thread_cancel (struct thread
*);
205 extern void thread_cancel_async (struct thread_master
*, struct thread
**, void *);
206 extern void thread_cancel_event (struct thread_master
*, void *);
207 extern struct thread
*thread_fetch (struct thread_master
*, struct thread
*);
208 extern void thread_call (struct thread
*);
209 extern unsigned long thread_timer_remain_second (struct thread
*);
210 extern struct timeval
thread_timer_remain(struct thread
*);
211 extern int thread_should_yield (struct thread
*);
212 /* set yield time for thread */
213 extern void thread_set_yield_time (struct thread
*, unsigned long);
215 /* Internal libfrr exports */
216 extern void thread_getrusage (RUSAGE_T
*);
217 extern void thread_cmd_init (void);
219 /* Returns elapsed real (wall clock) time. */
220 extern unsigned long thread_consumed_time(RUSAGE_T
*after
, RUSAGE_T
*before
,
221 unsigned long *cpu_time_elapsed
);
223 /* only for use in logging functions! */
224 extern pthread_key_t thread_current
;
226 #endif /* _ZEBRA_THREAD_H */