]> git.proxmox.com Git - mirror_frr.git/blame - lib/thread.h
Merge pull request #678 from chiragshah6/pim_dev
[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"
5734509c 28
8b70d0b0 29struct rusage_t
30{
8b70d0b0 31 struct rusage cpu;
8b70d0b0 32 struct timeval real;
33};
34#define RUSAGE_T struct rusage_t
35
db9c0df9 36#define GETRUSAGE(X) thread_getrusage(X)
718e3744 37
38/* Linked list of thread. */
39struct thread_list
40{
41 struct thread *head;
42 struct thread *tail;
43 int count;
44};
45
4becea72
CF
46struct pqueue;
47
0a95a0d0
DS
48struct fd_handler
49{
50 /* number of pfd stored in pfds */
51 nfds_t pfdcount;
52 /* number of pfd stored in pfds + number of snmp pfd */
53 nfds_t pfdcountsnmp;
54 /* number of pfd that fit in the allocated space of pfds */
55 nfds_t pfdsize;
95db01eb 56 /* file descriptors to monitor for i/o */
0a95a0d0 57 struct pollfd *pfds;
95db01eb
QY
58 /* chunk used for temp copy of pollfds */
59 struct pollfd *copy;
0a95a0d0 60};
0a95a0d0 61
718e3744 62/* Master of the theads. */
63struct thread_master
64{
308d14ae
DV
65 struct thread **read;
66 struct thread **write;
4becea72 67 struct pqueue *timer;
718e3744 68 struct thread_list event;
69 struct thread_list ready;
70 struct thread_list unuse;
4becea72 71 struct pqueue *background;
3bf2673b 72 int io_pipe[2];
308d14ae 73 int fd_limit;
0a95a0d0 74 struct fd_handler handler;
718e3744 75 unsigned long alloc;
705f2179
QY
76 long selectpoll_timeout;
77 bool spin;
78 bool handle_signals;
1189d95f 79 pthread_mutex_t mtx;
48cdf1a9 80 pthread_t owner;
718e3744 81};
82
41b2373c
PJ
83typedef unsigned char thread_type;
84
718e3744 85/* Thread itself. */
86struct thread
87{
32d86f8b
QY
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 **ref; /* external reference (if given) */
93 struct thread_master *master; /* pointer to the struct thread_master */
94 int (*func) (struct thread *); /* event function */
95 void *arg; /* event argument */
718e3744 96 union {
32d86f8b
QY
97 int val; /* second argument of the event. */
98 int fd; /* file descriptor in case of r/w */
99 struct timeval sands; /* rest of time sands value. */
718e3744 100 } u;
32d86f8b 101 int index; /* queue position for timers */
41af338e 102 struct timeval real;
32d86f8b
QY
103 struct cpu_thread_history *hist; /* cache pointer to cpu_history */
104 unsigned long yield; /* yield time in microseconds */
105 const char *funcname; /* name of thread function */
106 const char *schedfrom; /* source file thread was scheduled from */
107 int schedfrom_line; /* line number of source file */
108 pthread_mutex_t mtx; /* mutex for thread.c functions */
e04ab74d 109};
110
8b70d0b0 111struct cpu_thread_history
112{
e04ab74d 113 int (*func)(struct thread *);
e04ab74d 114 unsigned int total_calls;
f7c62e11 115 unsigned int total_active;
8b70d0b0 116 struct time_stats
117 {
118 unsigned long total, max;
119 } real;
8b70d0b0 120 struct time_stats cpu;
41b2373c 121 thread_type types;
9c7753e4 122 const char *funcname;
718e3744 123};
124
ca1f4309
DS
125/* Struct timeval's tv_usec one second value. */
126#define TIMER_SECOND_MICRO 1000000L
127
718e3744 128/* Thread types. */
129#define THREAD_READ 0
130#define THREAD_WRITE 1
131#define THREAD_TIMER 2
132#define THREAD_EVENT 3
133#define THREAD_READY 4
a48b4e6d 134#define THREAD_BACKGROUND 5
135#define THREAD_UNUSED 6
136#define THREAD_EXECUTE 7
718e3744 137
138/* Thread yield time. */
17fc128d 139#define THREAD_YIELD_TIME_SLOT 10 * 1000L /* 10ms */
718e3744 140
141/* Macros. */
142#define THREAD_ARG(X) ((X)->arg)
143#define THREAD_FD(X) ((X)->u.fd)
144#define THREAD_VAL(X) ((X)->u.val)
145
718e3744 146#define THREAD_OFF(thread) \
147 do { \
148 if (thread) \
149 { \
150 thread_cancel (thread); \
151 thread = NULL; \
152 } \
153 } while (0)
154
155#define THREAD_READ_OFF(thread) THREAD_OFF(thread)
156#define THREAD_WRITE_OFF(thread) THREAD_OFF(thread)
157#define THREAD_TIMER_OFF(thread) THREAD_OFF(thread)
158
9c7753e4
DL
159#define debugargdef const char *funcname, const char *schedfrom, int fromln
160
ffa2c898
QY
161#define thread_add_read(m,f,a,v,t) funcname_thread_add_read_write(THREAD_READ,m,f,a,v,t,#f,__FILE__,__LINE__)
162#define thread_add_write(m,f,a,v,t) funcname_thread_add_read_write(THREAD_WRITE,m,f,a,v,t,#f,__FILE__,__LINE__)
163#define thread_add_timer(m,f,a,v,t) funcname_thread_add_timer(m,f,a,v,t,#f,__FILE__,__LINE__)
164#define thread_add_timer_msec(m,f,a,v,t) funcname_thread_add_timer_msec(m,f,a,v,t,#f,__FILE__,__LINE__)
165#define thread_add_timer_tv(m,f,a,v,t) funcname_thread_add_timer_tv(m,f,a,v,t,#f,__FILE__,__LINE__)
166#define thread_add_event(m,f,a,v,t) funcname_thread_add_event(m,f,a,v,t,#f,__FILE__,__LINE__)
9c7753e4 167#define thread_execute(m,f,a,v) funcname_thread_execute(m,f,a,v,#f,__FILE__,__LINE__)
fb9e46bb 168
169/* The 4th arg to thread_add_background is the # of milliseconds to delay. */
ffa2c898 170#define thread_add_background(m,f,a,v,t) funcname_thread_add_background(m,f,a,v,t,#f,__FILE__,__LINE__)
e04ab74d 171
718e3744 172/* Prototypes. */
8cc4198f 173extern struct thread_master *thread_master_create (void);
174extern void thread_master_free (struct thread_master *);
495f0b13 175extern void thread_master_free_unused(struct thread_master *);
8cc4198f 176
56a94b36 177extern struct thread * funcname_thread_add_read_write (int dir, struct thread_master *,
ffa2c898
QY
178 int (*)(struct thread *), void *, int, struct thread **, debugargdef);
179
56a94b36 180extern struct thread * funcname_thread_add_timer (struct thread_master *,
ffa2c898
QY
181 int (*)(struct thread *), void *, long, struct thread **, debugargdef);
182
56a94b36 183extern struct thread * funcname_thread_add_timer_msec (struct thread_master *,
ffa2c898
QY
184 int (*)(struct thread *), void *, long, struct thread **, debugargdef);
185
56a94b36 186extern struct thread * funcname_thread_add_timer_tv (struct thread_master *,
ffa2c898
QY
187 int (*)(struct thread *), void *, struct timeval *, struct thread **, debugargdef);
188
56a94b36 189extern struct thread * funcname_thread_add_event (struct thread_master *,
ffa2c898
QY
190 int (*)(struct thread *), void *, int, struct thread **, debugargdef);
191
56a94b36 192extern struct thread * funcname_thread_add_background (struct thread_master *,
32d86f8b 193 int (*)(struct thread *), void *, long, struct thread **, debugargdef);
ffa2c898 194
32d86f8b 195extern void funcname_thread_execute (struct thread_master *,
ffa2c898 196 int (*)(struct thread *), void *, int, debugargdef);
9c7753e4
DL
197#undef debugargdef
198
8cc4198f 199extern void thread_cancel (struct thread *);
dc81807a 200extern unsigned int thread_cancel_event (struct thread_master *, void *);
8cc4198f 201extern struct thread *thread_fetch (struct thread_master *, struct thread *);
202extern void thread_call (struct thread *);
203extern unsigned long thread_timer_remain_second (struct thread *);
6ac44687 204extern struct timeval thread_timer_remain(struct thread*);
8cc4198f 205extern int thread_should_yield (struct thread *);
50596be0
DS
206/* set yield time for thread */
207extern void thread_set_yield_time (struct thread *, unsigned long);
718e3744 208
55c72803 209/* Internal libfrr exports */
db9c0df9 210extern void thread_getrusage (RUSAGE_T *);
0b84f294 211extern void thread_cmd_init (void);
e04ab74d 212
8b70d0b0 213/* Returns elapsed real (wall clock) time. */
214extern unsigned long thread_consumed_time(RUSAGE_T *after, RUSAGE_T *before,
215 unsigned long *cpu_time_elapsed);
216
d1265948
DL
217/* only for use in logging functions! */
218extern struct thread *thread_current;
219
718e3744 220#endif /* _ZEBRA_THREAD_H */