diff options
Diffstat (limited to 'lib/frrevent.h')
| -rw-r--r-- | lib/frrevent.h | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/frrevent.h b/lib/frrevent.h index 2b0c52bb51..94640a76b7 100644 --- a/lib/frrevent.h +++ b/lib/frrevent.h @@ -6,6 +6,7 @@ #ifndef _ZEBRA_THREAD_H #define _ZEBRA_THREAD_H +#include <signal.h> #include <zebra.h> #include <pthread.h> #include <poll.h> @@ -18,6 +19,8 @@ extern "C" { #endif +#define CONSUMED_TIME_CHECK 5000000 + extern bool cputime_enabled; extern unsigned long cputime_threshold; /* capturing wallclock time is always enabled since it is fast (reading @@ -65,6 +68,8 @@ struct xref_eventsched { uint32_t event_type; }; +PREDECL_HASH(cpu_records); + /* Master of the theads. */ struct event_loop { char *name; @@ -76,7 +81,7 @@ struct event_loop { struct list *cancel_req; bool canceled; pthread_cond_t cancel_cond; - struct hash *cpu_record; + struct cpu_records_head cpu_records[1]; int io_pipe[2]; int fd_limit; struct fd_handler handler; @@ -87,6 +92,8 @@ struct event_loop { pthread_mutex_t mtx; pthread_t owner; + nfds_t last_read; + bool ready_run_loop; RUSAGE_T last_getrusage; }; @@ -130,6 +137,8 @@ struct event { #endif struct cpu_event_history { + struct cpu_records_item item; + void (*func)(struct event *e); atomic_size_t total_cpu_warn; atomic_size_t total_wall_warn; @@ -147,6 +156,12 @@ struct cpu_event_history { /* Struct timeval's tv_usec one second value. */ #define TIMER_SECOND_MICRO 1000000L +static inline unsigned long timeval_elapsed(struct timeval a, struct timeval b) +{ + return (((a.tv_sec - b.tv_sec) * TIMER_SECOND_MICRO) + + (a.tv_usec - b.tv_usec)); +} + /* Event yield time. */ #define EVENT_YIELD_TIME_SLOT 10 * 1000L /* 10ms */ @@ -195,7 +210,7 @@ struct cpu_event_history { _xref_t_a(timer_tv, TIMER, m, f, a, v, t) #define event_add_event(m, f, a, v, t) _xref_t_a(event, EVENT, m, f, a, v, t) -#define event_execute(m, f, a, v) \ +#define event_execute(m, f, a, v, p) \ ({ \ static const struct xref_eventsched _xref __attribute__( \ (used)) = { \ @@ -205,7 +220,7 @@ struct cpu_event_history { .event_type = EVENT_EXECUTE, \ }; \ XREF_LINK(_xref.xref); \ - _event_execute(&_xref, m, f, a, v); \ + _event_execute(&_xref, m, f, a, v, p); \ }) /* end */ /* Prototypes. */ @@ -241,7 +256,8 @@ extern void _event_add_event(const struct xref_eventsched *xref, extern void _event_execute(const struct xref_eventsched *xref, struct event_loop *master, - void (*fn)(struct event *), void *arg, int val); + void (*fn)(struct event *), void *arg, int val, + struct event **eref); extern void event_cancel(struct event **event); extern void event_cancel_async(struct event_loop *m, struct event **eptr, |
