]> git.proxmox.com Git - mirror_frr.git/blame - lib/thread.h
Merge pull request #7220 from idryzhov/fix-clear-isis
[mirror_frr.git] / lib / thread.h
CommitLineData
718e3744 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 *
896014f4
DL
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
718e3744 19 */
20
21#ifndef _ZEBRA_THREAD_H
22#define _ZEBRA_THREAD_H
23
5734509c 24#include <zebra.h>
1189d95f 25#include <pthread.h>
75bcb355
QY
26#include <poll.h>
27#include "monotime.h"
fbcac826 28#include "frratomic.h"
c284542b 29#include "typesafe.h"
5734509c 30
5e244469
RW
31#ifdef __cplusplus
32extern "C" {
33#endif
34
d62a17ae 35struct rusage_t {
36 struct rusage cpu;
37 struct timeval real;
8b70d0b0 38};
39#define RUSAGE_T struct rusage_t
40
db9c0df9 41#define GETRUSAGE(X) thread_getrusage(X)
718e3744 42
c284542b 43PREDECL_LIST(thread_list)
27d29ced 44PREDECL_HEAP(thread_timer_list)
4becea72 45
d62a17ae 46struct fd_handler {
47 /* number of pfd that fit in the allocated space of pfds. This is a
48 * constant
49 * and is the same for both pfds and copy. */
50 nfds_t pfdsize;
51
52 /* file descriptors to monitor for i/o */
53 struct pollfd *pfds;
54 /* number of pollfds stored in pfds */
55 nfds_t pfdcount;
56
57 /* chunk used for temp copy of pollfds */
58 struct pollfd *copy;
59 /* number of pollfds stored in copy */
60 nfds_t copycount;
0a95a0d0 61};
0a95a0d0 62
63ccb9cb 63struct cancel_req {
d62a17ae 64 struct thread *thread;
65 void *eventobj;
66 struct thread **threadref;
63ccb9cb
QY
67};
68
718e3744 69/* Master of the theads. */
d62a17ae 70struct thread_master {
71 char *name;
72
73 struct thread **read;
74 struct thread **write;
27d29ced 75 struct thread_timer_list_head timer;
c284542b 76 struct thread_list_head event, ready, unuse;
d62a17ae 77 struct list *cancel_req;
78 bool canceled;
79 pthread_cond_t cancel_cond;
80 struct hash *cpu_record;
81 int io_pipe[2];
82 int fd_limit;
83 struct fd_handler handler;
84 unsigned long alloc;
85 long selectpoll_timeout;
86 bool spin;
87 bool handle_signals;
88 pthread_mutex_t mtx;
89 pthread_t owner;
718e3744 90};
91
92/* Thread itself. */
d62a17ae 93struct thread {
fbcac826
QY
94 uint8_t type; /* thread type */
95 uint8_t add_type; /* thread type */
c284542b 96 struct thread_list_item threaditem;
27d29ced 97 struct thread_timer_list_item timeritem;
d62a17ae 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 */
102 union {
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. */
106 } u;
d62a17ae 107 struct timeval real;
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 */
e04ab74d 114};
115
d62a17ae 116struct cpu_thread_history {
117 int (*func)(struct thread *);
c8a65463
DL
118 atomic_uint_fast32_t total_calls;
119 atomic_uint_fast32_t total_active;
d62a17ae 120 struct time_stats {
c8a65463 121 atomic_size_t total, max;
d62a17ae 122 } real;
123 struct time_stats cpu;
c8a65463 124 atomic_uint_fast32_t types;
d62a17ae 125 const char *funcname;
718e3744 126};
127
ca1f4309
DS
128/* Struct timeval's tv_usec one second value. */
129#define TIMER_SECOND_MICRO 1000000L
130
718e3744 131/* Thread types. */
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
a587d00b
QY
137#define THREAD_UNUSED 5
138#define THREAD_EXECUTE 6
718e3744 139
140/* Thread yield time. */
17fc128d 141#define THREAD_YIELD_TIME_SLOT 10 * 1000L /* 10ms */
718e3744 142
0447957e
AK
143#define THREAD_TIMER_STRLEN 12
144
718e3744 145/* Macros. */
146#define THREAD_ARG(X) ((X)->arg)
147#define THREAD_FD(X) ((X)->u.fd)
148#define THREAD_VAL(X) ((X)->u.val)
149
d62a17ae 150#define THREAD_OFF(thread) \
151 do { \
152 if (thread) { \
153 thread_cancel(thread); \
154 thread = NULL; \
155 } \
156 } while (0)
718e3744 157
158#define THREAD_READ_OFF(thread) THREAD_OFF(thread)
159#define THREAD_WRITE_OFF(thread) THREAD_OFF(thread)
160#define THREAD_TIMER_OFF(thread) THREAD_OFF(thread)
161
9c7753e4
DL
162#define debugargdef const char *funcname, const char *schedfrom, int fromln
163
ffa2c898
QY
164#define thread_add_read(m,f,a,v,t) funcname_thread_add_read_write(THREAD_READ,m,f,a,v,t,#f,__FILE__,__LINE__)
165#define thread_add_write(m,f,a,v,t) funcname_thread_add_read_write(THREAD_WRITE,m,f,a,v,t,#f,__FILE__,__LINE__)
166#define thread_add_timer(m,f,a,v,t) funcname_thread_add_timer(m,f,a,v,t,#f,__FILE__,__LINE__)
167#define thread_add_timer_msec(m,f,a,v,t) funcname_thread_add_timer_msec(m,f,a,v,t,#f,__FILE__,__LINE__)
168#define thread_add_timer_tv(m,f,a,v,t) funcname_thread_add_timer_tv(m,f,a,v,t,#f,__FILE__,__LINE__)
169#define thread_add_event(m,f,a,v,t) funcname_thread_add_event(m,f,a,v,t,#f,__FILE__,__LINE__)
9c7753e4 170#define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f,__FILE__,__LINE__)
b7fb24ce
DS
171#define thread_execute_name(m, f, a, v, n) \
172 funcname_thread_execute(m, f, a, v, n, __FILE__, __LINE__)
fb9e46bb 173
718e3744 174/* Prototypes. */
d62a17ae 175extern struct thread_master *thread_master_create(const char *);
d8a8a8de 176void thread_master_set_name(struct thread_master *master, const char *name);
d62a17ae 177extern void thread_master_free(struct thread_master *);
495f0b13 178extern void thread_master_free_unused(struct thread_master *);
8cc4198f 179
d62a17ae 180extern struct thread *
181funcname_thread_add_read_write(int dir, struct thread_master *,
182 int (*)(struct thread *), void *, int,
183 struct thread **, debugargdef);
184
185extern struct thread *funcname_thread_add_timer(struct thread_master *,
186 int (*)(struct thread *),
187 void *, long, struct thread **,
188 debugargdef);
189
190extern struct thread *
191funcname_thread_add_timer_msec(struct thread_master *, int (*)(struct thread *),
192 void *, long, struct thread **, debugargdef);
193
194extern struct thread *funcname_thread_add_timer_tv(struct thread_master *,
195 int (*)(struct thread *),
196 void *, struct timeval *,
197 struct thread **,
198 debugargdef);
199
200extern struct thread *funcname_thread_add_event(struct thread_master *,
201 int (*)(struct thread *),
202 void *, int, struct thread **,
203 debugargdef);
204
205extern void funcname_thread_execute(struct thread_master *,
206 int (*)(struct thread *), void *, int,
207 debugargdef);
9c7753e4
DL
208#undef debugargdef
209
d62a17ae 210extern void thread_cancel(struct thread *);
211extern void thread_cancel_async(struct thread_master *, struct thread **,
212 void *);
213extern void thread_cancel_event(struct thread_master *, void *);
214extern struct thread *thread_fetch(struct thread_master *, struct thread *);
215extern void thread_call(struct thread *);
216extern unsigned long thread_timer_remain_second(struct thread *);
217extern struct timeval thread_timer_remain(struct thread *);
78ca0342 218extern unsigned long thread_timer_remain_msec(struct thread *);
d62a17ae 219extern int thread_should_yield(struct thread *);
50596be0 220/* set yield time for thread */
d62a17ae 221extern void thread_set_yield_time(struct thread *, unsigned long);
718e3744 222
55c72803 223/* Internal libfrr exports */
d62a17ae 224extern void thread_getrusage(RUSAGE_T *);
225extern void thread_cmd_init(void);
e04ab74d 226
8b70d0b0 227/* Returns elapsed real (wall clock) time. */
228extern unsigned long thread_consumed_time(RUSAGE_T *after, RUSAGE_T *before,
229 unsigned long *cpu_time_elapsed);
230
d1265948 231/* only for use in logging functions! */
e0bebc7c 232extern pthread_key_t thread_current;
0447957e
AK
233extern char *thread_timer_to_hhmmss(char *buf, int buf_size,
234 struct thread *t_timer);
d1265948 235
5e244469
RW
236#ifdef __cplusplus
237}
238#endif
239
718e3744 240#endif /* _ZEBRA_THREAD_H */