summaryrefslogtreecommitdiff
path: root/lib/tevent/tevent_internal.h
blob: 2d6909da366dd1e9e6115993e44d9a6f512342bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/* 
   Unix SMB/CIFS implementation.

   generalised event loop handling

   Internal structs

   Copyright (C) Stefan Metzmacher 2005
   
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

struct tevent_ops {
	/* conntext init */
	int (*context_init)(struct tevent_context *ev);

	/* fd_event functions */
	struct tevent_fd *(*add_fd)(struct tevent_context *ev,
				    TALLOC_CTX *mem_ctx,
				    int fd, uint16_t flags,
				    tevent_fd_handler_t handler,
				    void *private_data);
	uint16_t (*get_fd_flags)(struct tevent_fd *fde);
	void (*set_fd_flags)(struct tevent_fd *fde, uint16_t flags);

	/* timed_event functions */
	struct tevent_timer *(*add_timer)(struct tevent_context *ev,
					  TALLOC_CTX *mem_ctx,
					  struct timeval next_event,
					  tevent_timer_handler_t handler,
					  void *private_data);
	/* disk aio event functions */
	struct tevent_aio *(*add_aio)(struct tevent_context *ev,
				      TALLOC_CTX *mem_ctx,
				      struct iocb *iocb,
				      tevent_aio_handler_t handler,
				      void *private_data);
	/* signal functions */
	struct tevent_signal *(*add_signal)(struct tevent_context *ev,
					    TALLOC_CTX *mem_ctx,
					    int signum, int sa_flags,
					    tevent_signal_handler_t handler,
					    void *private_data);

	/* loop functions */
	int (*loop_once)(struct tevent_context *ev);
	int (*loop_wait)(struct tevent_context *ev);
};

struct tevent_fd {
	struct tevent_fd *prev, *next;
	struct tevent_context *event_ctx;
	int fd;
	uint16_t flags; /* see EVENT_FD_* flags */
	tevent_fd_handler_t handler;
	/* this is private for the specific handler */
	void *private_data;
	/* this is private for the events_ops implementation */
	uint16_t additional_flags;
	void *additional_data;
};

struct tevent_timer {
	struct tevent_timer *prev, *next;
	struct tevent_context *event_ctx;
	struct timeval next_event;
	tevent_timer_handler_t handler;
	/* this is private for the specific handler */
	void *private_data;
	/* this is private for the events_ops implementation */
	void *additional_data;
};

struct tevent_signal {
	struct tevent_signal *prev, *next;
	struct tevent_context *event_ctx;
	tevent_signal_handler_t handler;
	void *private_data;
	int signum;
	int sa_flags;
};

/* DEBUG */
enum ev_debug_level {EV_DEBUG_FATAL, EV_DEBUG_ERROR,
		      EV_DEBUG_WARNING, EV_DEBUG_TRACE};

struct ev_debug_ops {
	void (*debug)(void *context, enum ev_debug_level level,
		      const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0);
	void *context;
};

int ev_set_debug(struct tevent_context *ev,
		 void (*debug)(void *context, enum ev_debug_level level,
				const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0),
		 void *context);
int ev_set_debug_stderr(struct tevent_context *ev);
void ev_debug(struct tevent_context *ev, enum ev_debug_level level, const char *fmt, ...);

/* aio event is private to the aio backend */
struct tevent_aio;

struct tevent_context {
	/* the specific events implementation */
	const struct tevent_ops *ops;

	/* list of timed events - used by common code */
	struct tevent_timer *timer_events;

	/* this is private for the events_ops implementation */
	void *additional_data;

	/* number of signal event handlers */
	int num_signal_handlers;

	/* pipe hack used with signal handlers */
	struct tevent_fd *pipe_fde;

	/* debugging operations */
	struct ev_debug_ops debug_ops;
};


bool event_register_backend(const char *name, const struct tevent_ops *ops);

bool ev_timeval_is_zero(const struct timeval *tv);
struct tevent_timer *common_event_add_timed(struct tevent_context *,
					    TALLOC_CTX *,
					    struct timeval,
					    tevent_timer_handler_t,
					    void *);
struct timeval common_event_loop_timer_delay(struct tevent_context *);

struct tevent_signal *common_event_add_signal(struct tevent_context *ev,
					      TALLOC_CTX *mem_ctx,
					      int signum,
					      int sa_flags,
					      tevent_signal_handler_t handler,
					      void *private_data);
int common_event_check_signal(struct tevent_context *ev);


bool events_standard_init(void);
bool events_select_init(void);
#if HAVE_EVENTS_EPOLL
bool events_epoll_init(void);
#endif
#if HAVE_LINUX_AIO
bool events_aio_init(void);
#endif