diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-02-03 02:35:52 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:09:29 -0500 |
commit | 66170ef8b36b499aa5b44ef10c1bd362a50f2636 (patch) | |
tree | 5bfb3d759ad397a6a42588b97802e237781c35e8 /source4/include | |
parent | 1774b36c1464e1f04f982b83577e62fa31cbeef9 (diff) | |
download | samba-66170ef8b36b499aa5b44ef10c1bd362a50f2636.tar.gz samba-66170ef8b36b499aa5b44ef10c1bd362a50f2636.tar.bz2 samba-66170ef8b36b499aa5b44ef10c1bd362a50f2636.zip |
r5185: make all the events data structures private to events.c. This will
make it possible to add optimisations to the events code such as
keeping the next timed event in a sorted list, and using epoll for
file descriptor events.
I also removed the loop events code, as it wasn't being used anywhere,
and changed timed events to always be one-shot (as adding a new timed
event in the event handler is so easy to do if needed)
(This used to be commit d7b4b6de51342a65bf46fce772d313f92f8d73d3)
Diffstat (limited to 'source4/include')
-rw-r--r-- | source4/include/events.h | 96 |
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 |