summaryrefslogtreecommitdiff
path: root/source4/include/events.h
diff options
context:
space:
mode:
Diffstat (limited to 'source4/include/events.h')
-rw-r--r--source4/include/events.h96
1 files changed, 35 insertions, 61 deletions
diff --git a/source4/include/events.h b/source4/include/events.h
index 51a78306bb..ec6493232e 100644
--- a/source4/include/events.h
+++ b/source4/include/events.h
@@ -1,7 +1,9 @@
/*
Unix SMB/CIFS implementation.
- main select loop and event handling
- Copyright (C) Andrew Tridgell 2003
+
+ generalised event loop handling
+
+ Copyright (C) Andrew Tridgell 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
@@ -18,72 +20,44 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/*
- please read the comments in events.c before modifying
-*/
+struct event_context;
+struct fd_event;
+struct timed_event;
-struct event_context {
- /* list of filedescriptor events */
- struct fd_event {
- struct event_context *event_ctx;
- struct fd_event *next, *prev;
- int fd;
- uint16_t flags; /* see EVENT_FD_* flags */
- void (*handler)(struct event_context *ev, struct fd_event *fde,
- struct timeval t, uint16_t flags);
- void *private;
- } *fd_events;
+/* event handler types */
+typedef void (*event_fd_handler_t)(struct event_context *, struct fd_event *,
+ struct timeval , uint16_t , void *);
+typedef void (*event_timed_handler_t)(struct event_context *, struct timed_event *,
+ struct timeval , void *);
- /* list of timed events */
- struct timed_event {
- struct event_context *event_ctx;
- struct timed_event *next, *prev;
- struct timeval next_event;
- void (*handler)(struct event_context *ev, struct timed_event *te,
- struct timeval t);
- void *private;
- } *timed_events;
+struct event_context *event_context_init(TALLOC_CTX *mem_ctx);
- /* list of loop events - called on each select() */
- struct loop_event {
- struct event_context *event_ctx;
- struct loop_event *next, *prev;
- void (*handler)(struct event_context *ev, struct loop_event *le,
- struct timeval t);
- void *private;
- } *loop_events;
+struct fd_event *event_add_fd(struct event_context *ev, TALLOC_CTX *mem_ctx,
+ int fd, uint16_t flags, event_fd_handler_t handler,
+ void *private);
- /* list of signal events */
- struct signal_event {
- struct event_context *event_ctx;
- struct signal_event *next, *prev;
- int signum;
- void (*handler)(struct event_context *ev, struct signal_event *se, int signum, void *sigarg);
- void *private;
- } *signal_events;
+struct timed_event *event_add_timed(struct event_context *ev, TALLOC_CTX *mem_ctx,
+ struct timeval next_event,
+ event_timed_handler_t handler,
+ void *private);
- /* the maximum file descriptor number in fd_events */
- int maxfd;
+int event_loop_once(struct event_context *ev);
+int event_loop_wait(struct event_context *ev);
- /* information for exiting from the event loop */
- struct {
- BOOL exit_now;
- int code;
- } exit;
+uint16_t event_fd_flags(struct fd_event *fde);
+void event_fd_setflags(struct fd_event *fde, uint16_t flags);
- /* This is the talloc parent for all concrete event structures in this
- * event context. This makes merging easy. */
- void *events;
+/* bits for file descriptor event flags */
+#define EVENT_FD_READ 1
+#define EVENT_FD_WRITE 2
- /* this is changed by the destructors for any event type. It
- is used to detect event destruction by event handlers,
- which means the code that is calling all event handles
- needs to assume that the linked list is no longer valid
- */
- uint32_t destruction_count;
-};
+#define EVENT_FD_WRITEABLE(fde) \
+ event_fd_setflags(fde, event_fd_flags(fde) | EVENT_FD_WRITE)
+#define EVENT_FD_READABLE(fde) \
+ event_fd_setflags(fde, event_fd_flags(fde) | EVENT_FD_READ)
+#define EVENT_FD_NOT_WRITEABLE(fde) \
+ event_fd_setflags(fde, event_fd_flags(fde) & ~EVENT_FD_WRITE)
+#define EVENT_FD_NOT_READABLE(fde) \
+ event_fd_setflags(fde, event_fd_flags(fde) & ~EVENT_FD_WRITE)
-/* bits for fd_event.flags */
-#define EVENT_FD_READ 1
-#define EVENT_FD_WRITE 2