mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-09-20 12:25:20 +00:00
836e857b30
Now sk_open() requires an explicit IO loop to open the socket in. Also specific functions for socket RX pause / resume are added to allow for BGP corking. And last but not least, socket reloop is now synchronous to resolve weird cases of the target loop stopping before actually picking up the relooped socket. Now the caller must ensure that both loops are locked while relooping, and this way all sockets always have their respective loop.
90 lines
1.4 KiB
C
90 lines
1.4 KiB
C
/*
|
|
* BIRD -- I/O and event loop
|
|
*
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
*/
|
|
|
|
#ifndef _BIRD_SYSDEP_UNIX_IO_LOOP_H_
|
|
#define _BIRD_SYSDEP_UNIX_IO_LOOP_H_
|
|
|
|
#include "lib/rcu.h"
|
|
|
|
#include <pthread.h>
|
|
|
|
struct pipe
|
|
{
|
|
int fd[2];
|
|
};
|
|
|
|
struct pfd {
|
|
BUFFER(struct pollfd) pfd;
|
|
BUFFER(struct birdloop *) loop;
|
|
};
|
|
|
|
void sockets_prepare(struct birdloop *, struct pfd *);
|
|
void socket_changed(struct birdsock *);
|
|
|
|
void pipe_new(struct pipe *);
|
|
void pipe_pollin(struct pipe *, struct pfd *);
|
|
void pipe_drain(struct pipe *);
|
|
void pipe_kick(struct pipe *);
|
|
|
|
struct birdloop
|
|
{
|
|
node n;
|
|
|
|
event event;
|
|
timer timer;
|
|
|
|
pool *pool;
|
|
|
|
struct timeloop time;
|
|
event_list event_list;
|
|
list sock_list;
|
|
struct birdsock *sock_active;
|
|
int sock_num;
|
|
uint sock_changed;
|
|
|
|
uint ping_pending;
|
|
|
|
_Atomic u32 thread_transition;
|
|
#define LTT_PING 1
|
|
#define LTT_MOVE 2
|
|
_Atomic u32 flags;
|
|
struct birdloop_flag_handler *flag_handler;
|
|
|
|
void (*stopped)(void *data);
|
|
void *stop_data;
|
|
|
|
struct birdloop *prev_loop;
|
|
|
|
struct bird_thread *thread;
|
|
|
|
u64 total_time_spent_ns;
|
|
};
|
|
|
|
struct bird_thread
|
|
{
|
|
node n;
|
|
|
|
struct pipe wakeup;
|
|
event_list priority_events;
|
|
|
|
struct birdloop *meta;
|
|
|
|
pthread_t thread_id;
|
|
pthread_attr_t thread_attr;
|
|
|
|
struct rcu_thread rcu;
|
|
|
|
list loops;
|
|
pool *pool;
|
|
struct pfd *pfd;
|
|
|
|
event cleanup_event;
|
|
|
|
int sock_changed;
|
|
};
|
|
|
|
#endif
|