summaryrefslogtreecommitdiffstats
path: root/tevent/tevent_internal.h
blob: 0d0755f2985b3e3a7a3ee6a33ab44fd774729740 (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
/* 
   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 event_ops {
	/* conntext init */
	int (*context_init)(struct event_context *ev);

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

	/* timed_event functions */
	struct timed_event *(*add_timed)(struct event_context *ev,
					 TALLOC_CTX *mem_ctx,
					 struct timeval next_event,
					 event_timed_handler_t handler,
					 void *private_data);
	/* disk aio event functions */
	struct aio_event *(*add_aio)(struct event_context *ev,
				     TALLOC_CTX *mem_ctx,
				     struct iocb *iocb, 
				     event_aio_handler_t handler, 
				     void *private_data);
	/* signal functions */
	struct signal_event *(*add_signal)(struct event_context *ev, 
					   TALLOC_CTX *mem_ctx,
					   int signum, int sa_flags,
					   event_signal_handler_t handler, 
					   void *private_data);

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

struct fd_event {
	struct fd_event *prev, *next;
	struct event_context *event_ctx;
	int fd;
	uint16_t flags; /* see EVENT_FD_* flags */
	event_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 timed_event {
	struct timed_event *prev, *next;
	struct event_context *event_ctx;
	struct timeval next_event;
	event_timed_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 signal_event {
	struct signal_event *prev, *next;
	struct event_context *event_ctx;
	event_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 event_context *ev,
		 void (*debug)(void *context, enum ev_debug_level level,
				const char *fmt, va_list ap),
		 void *context);
int ev_set_debug_stderr(struct event_context *ev);
void ev_debug(struct event_context *ev, enum ev_debug_level level, const char *fmt, ...);

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

struct event_context {
	/* the specific events implementation */
	const struct event_ops *ops;

	/* list of timed events - used by common code */
	struct timed_event *timed_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 fd_event *pipe_fde;

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


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

bool ev_timeval_is_zero(const struct timeval *tv);
struct timed_event *common_event_add_timed(struct event_context *, TALLOC_CTX *,
					   struct timeval, event_timed_handler_t, void *);
struct timeval common_event_loop_timer_delay(struct event_context *);

struct signal_event *common_event_add_signal(struct event_context *ev, 
					     TALLOC_CTX *mem_ctx,
					     int signum,
					     int sa_flags,
					     event_signal_handler_t handler, 
					     void *private_data);
int common_event_check_signal(struct event_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