summaryrefslogtreecommitdiff
path: root/source4/lib/events/events_internal.h
blob: 39fade2fdbaa5225e916ed14280b8cedf2f9244d (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
/* 
   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 2 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, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

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;
};

/* 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;
};


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

struct timed_event *common_event_add_timed(struct event_context *, TALLOC_CTX *,
					   struct timeval, event_timed_handler_t, void *);
void common_event_loop_timer(struct event_context *);
struct timeval common_event_loop_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);