1#ifndef TAMER_XDRIVER_HH
2#define TAMER_XDRIVER_HH 1
24extern struct timeval recent;
25extern bool need_recent;
46class driver :
public tamerpriv::simple_driver {
51 enum { capacity = (unsigned) 256 };
52 static inline driver* by_index(
unsigned index);
53 inline unsigned index()
const;
56 virtual void at_fd(
int fd,
int action, event<int> e) = 0;
57 virtual void at_time(
const timeval& expiry, event<> e,
bool bg) = 0;
58 virtual void at_asap(event<> e) = 0;
59 virtual void at_preblock(event<> e) = 0;
60 virtual void kill_fd(
int fd) = 0;
62 inline void at_fd(
int fd,
int action, event<> e);
63 inline void at_time(
const timeval& expiry, event<> e);
64 inline void at_time(
double expiry, event<> e,
bool bg =
false);
65 inline void at_delay(timeval delay, event<> e,
bool bg =
false);
66 void at_delay(
double delay, event<> e,
bool bg =
false);
67 inline void at_delay_sec(
int delay, event<> e,
bool bg =
false);
68 inline void at_delay_msec(
int delay, event<> e,
bool bg =
false);
69 inline void at_delay_usec(
int delay, event<> e,
bool bg =
false);
71 static void at_signal(
int signo, event<> e,
72 signal_flags flags = signal_default);
74 typedef void (*error_handler_type)(
int fd,
int err, std::string msg);
75 virtual void set_error_handler(error_handler_type errh);
77 virtual void loop(loop_flags flag) = 0;
79 virtual timeval next_wake()
const;
83 void blocked_locations(std::vector<std::string>& x);
85 static driver* make_tamer(
int flags);
86 static driver* make_libevent();
87 static driver* make_libev();
91 static volatile sig_atomic_t sig_any_active;
92 static int sig_pipe[2];
93 static unsigned sig_nforeground;
94 static unsigned sig_ntotal;
95 void dispatch_signals();
99 std::tuple<int> int_placeholder_;
101 static driver* indexed[capacity];
102 static int next_index;
106inline const timeval&
recent();
108inline driver* driver::by_index(
unsigned index) {
109 return index < capacity ? indexed[index] : 0;
112inline unsigned driver::index()
const {
116inline void driver::at_fd(
int fd,
int action,
event<> e) {
117 at_fd(fd, action, event<int>(e, int_placeholder_));
120inline void driver::at_time(
const timeval& expiry,
event<> e) {
121 at_time(expiry, e,
false);
124inline void driver::at_time(
double expiry,
event<> e,
bool bg) {
126 tv.tv_sec = (long) expiry;
127 tv.tv_usec = (long) ((expiry - tv.tv_sec) * 1000000);
131inline void driver::at_delay(timeval delay,
event<> e,
bool bg) {
132 timeradd(&delay, &
recent(), &delay);
133 at_time(delay, e, bg);
136inline void driver::at_delay_sec(
int delay,
event<> e,
bool bg) {
146inline void driver::at_delay_msec(
int delay,
event<> e,
bool bg) {
151 tv.tv_sec = delay / 1000;
152 tv.tv_usec = (delay % 1000) * 1000;
157inline void driver::at_delay_usec(
int delay,
event<> e,
bool bg) {
162 tv.tv_sec = delay / 1000000;
163 tv.tv_usec = delay % 1000000;
169inline void blocking_rendezvous::block(closure& c,
unsigned position) {
170 block(tamer::driver::main, c, position);
The event template classes and helper functions.
Namespace containing public Tamer classes and functions for the Tamer core.
Definition adapter.hh:17
const timeval & recent()
Return a recent snapshot of the current time.
Definition driver.hh:62
void break_loop()
Exit the current driver loop.
Definition driver.hh:107
void loop()
Run driver loop indefinitely.
Definition driver.hh:97