]> git.proxmox.com Git - mirror_frr.git/blame - lib/thread.h
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[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"
5734509c 29
d62a17ae 30struct rusage_t {
31 struct rusage cpu;
32 struct timeval real;
8b70d0b0 33};
34#define RUSAGE_T struct rusage_t
35
db9c0df9 36#define GETRUSAGE(X) thread_getrusage(X)
718e3744 37
38/* Linked list of thread. */
d62a17ae 39struct thread_list {
40 struct thread *head;
41 struct thread *tail;
42 int count;
718e3744 43};
44
4becea72
CF
45struct pqueue;
46
d62a17ae 47struct fd_handler {
48 /* number of pfd that fit in the allocated space of pfds. This is a
49 * constant
50 * and is the same for both pfds and copy. */
51 nfds_t pfdsize;
52
53 /* file descriptors to monitor for i/o */
54 struct pollfd *pfds;
55 /* number of pollfds stored in pfds */
56 nfds_t pfdcount;
57
58 /* chunk used for temp copy of pollfds */
59 struct pollfd *copy;
60 /* number of pollfds stored in copy */
61 nfds_t copycount;
0a95a0d0 62};
0a95a0d0 63
63ccb9cb 64struct cancel_req {
d62a17ae 65 struct thread *thread;
66 void *eventobj;
67 struct thread **threadref;
63ccb9cb
QY
68};
69
718e3744 70/* Master of the theads. */
d62a17ae 71struct thread_master {
72 char *name;
73
74 struct thread **read;
75 struct thread **write;
76 struct pqueue *timer;
77 struct thread_list event;
78 struct thread_list ready;
79 struct thread_list unuse;
80 struct list *cancel_req;
81 bool canceled;
82 pthread_cond_t cancel_cond;
83 struct hash *cpu_record;
84 int io_pipe[2];
85 int fd_limit;
86 struct fd_handler handler;
87 unsigned long alloc;
88 long selectpoll_timeout;
89 bool spin;
90 bool handle_signals;
91 pthread_mutex_t mtx;
92 pthread_t owner;
718e3744 93};
94
95/* Thread itself. */
d62a17ae 96struct thread {
fbcac826
QY
97 uint8_t type; /* thread type */
98 uint8_t add_type; /* thread type */
d62a17ae 99 struct thread *next; /* next pointer of the thread */
100 struct thread *prev; /* previous pointer of the thread */
101 struct thread **ref; /* external reference (if given) */
102 struct thread_master *master; /* pointer to the struct thread_master */
103 int (*func)(struct thread *); /* event function */
104 void *arg; /* event argument */
105 union {
106 int val; /* second argument of the event. */
107 int fd; /* file descriptor in case of r/w */
108 struct timeval sands; /* rest of time sands value. */
109 } u;
110 int index; /* queue position for timers */
111 struct timeval real;
112 struct cpu_thread_history *hist; /* cache pointer to cpu_history */
113 unsigned long yield; /* yield time in microseconds */
114 const char *funcname; /* name of thread function */
115 const char *schedfrom; /* source file thread was scheduled from */
116 int schedfrom_line; /* line number of source file */
117 pthread_mutex_t mtx; /* mutex for thread.c functions */
e04ab74d 118};
119
d62a17ae 120struct cpu_thread_history {
121 int (*func)(struct thread *);
fbcac826
QY
122 _Atomic unsigned int total_calls;
123 _Atomic unsigned int total_active;
d62a17ae 124 struct time_stats {
fbcac826 125 _Atomic unsigned long total, max;
d62a17ae 126 } real;
127 struct time_stats cpu;
0545c373 128 _Atomic uint32_t types;
d62a17ae 129 const char *funcname;
718e3744 130};
131
ca1f4309
DS
132/* Struct timeval's tv_usec one second value. */
133#define TIMER_SECOND_MICRO 1000000L
134
718e3744 135/* Thread types. */
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
a587d00b
QY
141#define THREAD_UNUSED 5
142#define THREAD_EXECUTE 6
718e3744 143
144/* Thread yield time. */
17fc128d 145#define THREAD_YIELD_TIME_SLOT 10 * 1000L /* 10ms */
718e3744 146
147/* Macros. */
148#define THREAD_ARG(X) ((X)->arg)
149#define THREAD_FD(X) ((X)->u.fd)
150#define THREAD_VAL(X) ((X)->u.val)
151
d62a17ae 152#define THREAD_OFF(thread) \
153 do { \
154 if (thread) { \
155 thread_cancel(thread); \
156 thread = NULL; \
157 } \
158 } while (0)
718e3744 159
160#define THREAD_READ_OFF(thread) THREAD_OFF(thread)
161#define THREAD_WRITE_OFF(thread) THREAD_OFF(thread)
162#define THREAD_TIMER_OFF(thread) THREAD_OFF(thread)
163
9c7753e4
DL
164#define debugargdef const char *funcname, const char *schedfrom, int fromln
165
ffa2c898
QY
166#define thread_add_read(m,f,a,v,t) funcname_thread_add_read_write(THREAD_READ,m,f,a,v,t,#f,__FILE__,__LINE__)
167#define thread_add_write(m,f,a,v,t) funcname_thread_add_read_write(THREAD_WRITE,m,f,a,v,t,#f,__FILE__,__LINE__)
168#define thread_add_timer(m,f,a,v,t) funcname_thread_add_timer(m,f,a,v,t,#f,__FILE__,__LINE__)
169#define thread_add_timer_msec(m,f,a,v,t) funcname_thread_add_timer_msec(m,f,a,v,t,#f,__FILE__,__LINE__)
170#define thread_add_timer_tv(m,f,a,v,t) funcname_thread_add_timer_tv(m,f,a,v,t,#f,__FILE__,__LINE__)
171#define thread_add_event(m,f,a,v,t) funcname_thread_add_event(m,f,a,v,t,#f,__FILE__,__LINE__)
9c7753e4 172#define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f,__FILE__,__LINE__)
b7fb24ce
DS
173#define thread_execute_name(m, f, a, v, n) \
174 funcname_thread_execute(m, f, a, v, n, __FILE__, __LINE__)
fb9e46bb 175
718e3744 176/* Prototypes. */
d62a17ae 177extern struct thread_master *thread_master_create(const char *);
d8a8a8de 178void thread_master_set_name(struct thread_master *master, const char *name);
d62a17ae 179extern void thread_master_free(struct thread_master *);
495f0b13 180extern void thread_master_free_unused(struct thread_master *);
8cc4198f 181
d62a17ae 182extern struct thread *
183funcname_thread_add_read_write(int dir, struct thread_master *,
184 int (*)(struct thread *), void *, int,
185 struct thread **, debugargdef);
186
187extern struct thread *funcname_thread_add_timer(struct thread_master *,
188 int (*)(struct thread *),
189 void *, long, struct thread **,
190 debugargdef);
191
192extern struct thread *
193funcname_thread_add_timer_msec(struct thread_master *, int (*)(struct thread *),
194 void *, long, struct thread **, debugargdef);
195
196extern struct thread *funcname_thread_add_timer_tv(struct thread_master *,
197 int (*)(struct thread *),
198 void *, struct timeval *,
199 struct thread **,
200 debugargdef);
201
202extern struct thread *funcname_thread_add_event(struct thread_master *,
203 int (*)(struct thread *),
204 void *, int, struct thread **,
205 debugargdef);
206
207extern void funcname_thread_execute(struct thread_master *,
208 int (*)(struct thread *), void *, int,
209 debugargdef);
9c7753e4
DL
210#undef debugargdef
211
d62a17ae 212extern void thread_cancel(struct thread *);
213extern void thread_cancel_async(struct thread_master *, struct thread **,
214 void *);
215extern void thread_cancel_event(struct thread_master *, void *);
216extern struct thread *thread_fetch(struct thread_master *, struct thread *);
217extern void thread_call(struct thread *);
218extern unsigned long thread_timer_remain_second(struct thread *);
219extern struct timeval thread_timer_remain(struct thread *);
78ca0342 220extern unsigned long thread_timer_remain_msec(struct thread *);
d62a17ae 221extern int thread_should_yield(struct thread *);
50596be0 222/* set yield time for thread */
d62a17ae 223extern void thread_set_yield_time(struct thread *, unsigned long);
718e3744 224
55c72803 225/* Internal libfrr exports */
d62a17ae 226extern void thread_getrusage(RUSAGE_T *);
227extern void thread_cmd_init(void);
e04ab74d 228
8b70d0b0 229/* Returns elapsed real (wall clock) time. */
230extern unsigned long thread_consumed_time(RUSAGE_T *after, RUSAGE_T *before,
231 unsigned long *cpu_time_elapsed);
232
d1265948 233/* only for use in logging functions! */
e0bebc7c 234extern pthread_key_t thread_current;
d1265948 235
718e3744 236#endif /* _ZEBRA_THREAD_H */