X-Git-Url: http://git.samba.org/samba.git/?a=blobdiff_plain;f=lib%2Ftevent%2Ftevent_select.c;h=0635be50fe191a2c3b6fa0e8c29a647570b6b54d;hb=6211162d3eeebcfde86a039c67119e6388e6dfbc;hp=35c6f78599338a947e6298040cc5ea559c11b3f0;hpb=d14c8604653d39dd25736279d34930ee7a3ae103;p=sfrench%2Fsamba-autobuild%2F.git diff --git a/lib/tevent/tevent_select.c b/lib/tevent/tevent_select.c index 35c6f785993..0635be50fe1 100644 --- a/lib/tevent/tevent_select.c +++ b/lib/tevent/tevent_select.c @@ -2,25 +2,24 @@ Unix SMB/CIFS implementation. main select loop and event handling Copyright (C) Andrew Tridgell 2003-2005 - 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 . -*/ + Copyright (C) Stefan Metzmacher 2005-2009 -/* - This is SAMBA's default event loop code + ** NOTE! The following LGPL license applies to the tevent + ** library. This does NOT imply that all of Samba is released + ** under the LGPL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see . */ #include "replace.h" @@ -32,13 +31,7 @@ struct select_event_context { /* a pointer back to the generic event_context */ - struct event_context *ev; - - /* list of filedescriptor events */ - struct fd_event *fd_events; - - /* list of timed events */ - struct timed_event *timed_events; + struct tevent_context *ev; /* the maximum file descriptor number in fd_events */ int maxfd; @@ -54,7 +47,7 @@ struct select_event_context { /* create a select_event_context structure. */ -static int select_event_context_init(struct event_context *ev) +static int select_event_context_init(struct tevent_context *ev) { struct select_event_context *select_ev; @@ -71,10 +64,10 @@ static int select_event_context_init(struct event_context *ev) */ static void calc_maxfd(struct select_event_context *select_ev) { - struct fd_event *fde; + struct tevent_fd *fde; select_ev->maxfd = 0; - for (fde = select_ev->fd_events; fde; fde = fde->next) { + for (fde = select_ev->ev->fd_events; fde; fde = fde->next) { if (fde->fd > select_ev->maxfd) { select_ev->maxfd = fde->fd; } @@ -90,52 +83,45 @@ static void calc_maxfd(struct select_event_context *select_ev) /* destroy an fd_event */ -static int select_event_fd_destructor(struct fd_event *fde) +static int select_event_fd_destructor(struct tevent_fd *fde) { - struct event_context *ev = fde->event_ctx; - struct select_event_context *select_ev = talloc_get_type(ev->additional_data, - struct select_event_context); + struct tevent_context *ev = fde->event_ctx; + struct select_event_context *select_ev = NULL; - if (select_ev->maxfd == fde->fd) { - select_ev->maxfd = EVENT_INVALID_MAXFD; - } + if (ev) { + select_ev = talloc_get_type(ev->additional_data, + struct select_event_context); - DLIST_REMOVE(select_ev->fd_events, fde); - select_ev->destruction_count++; + if (select_ev->maxfd == fde->fd) { + select_ev->maxfd = EVENT_INVALID_MAXFD; + } - if (fde->flags & EVENT_FD_AUTOCLOSE) { - close(fde->fd); - fde->fd = -1; + select_ev->destruction_count++; } - return 0; + return tevent_common_fd_destructor(fde); } /* add a fd based event return NULL on failure (memory allocation error) */ -static struct fd_event *select_event_add_fd(struct event_context *ev, TALLOC_CTX *mem_ctx, - int fd, uint16_t flags, - event_fd_handler_t handler, - void *private_data) +static struct tevent_fd *select_event_add_fd(struct tevent_context *ev, TALLOC_CTX *mem_ctx, + int fd, uint16_t flags, + tevent_fd_handler_t handler, + void *private_data, + const char *handler_name, + const char *location) { struct select_event_context *select_ev = talloc_get_type(ev->additional_data, struct select_event_context); - struct fd_event *fde; + struct tevent_fd *fde; - fde = talloc(mem_ctx?mem_ctx:ev, struct fd_event); + fde = tevent_common_add_fd(ev, mem_ctx, fd, flags, + handler, private_data, + handler_name, location); if (!fde) return NULL; - fde->event_ctx = ev; - fde->fd = fd; - fde->flags = flags; - fde->handler = handler; - fde->private_data = private_data; - fde->additional_flags = 0; - fde->additional_data = NULL; - - DLIST_ADD(select_ev->fd_events, fde); if (fde->fd > select_ev->maxfd) { select_ev->maxfd = fde->fd; } @@ -144,38 +130,13 @@ static struct fd_event *select_event_add_fd(struct event_context *ev, TALLOC_CTX return fde; } - -/* - return the fd event flags -*/ -static uint16_t select_event_get_fd_flags(struct fd_event *fde) -{ - return fde->flags; -} - -/* - set the fd event flags -*/ -static void select_event_set_fd_flags(struct fd_event *fde, uint16_t flags) -{ - struct event_context *ev; - struct select_event_context *select_ev; - - if (fde->flags == flags) return; - - ev = fde->event_ctx; - select_ev = talloc_get_type(ev->additional_data, struct select_event_context); - - fde->flags = flags; -} - /* event loop handling using select() */ static int select_event_loop_select(struct select_event_context *select_ev, struct timeval *tvalp) { fd_set r_fds, w_fds; - struct fd_event *fde; + struct tevent_fd *fde; int selrtn; uint32_t destruction_count = ++select_ev->destruction_count; @@ -188,25 +149,25 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru FD_ZERO(&w_fds); /* setup any fd events */ - for (fde = select_ev->fd_events; fde; fde = fde->next) { - if (fde->flags & EVENT_FD_READ) { + for (fde = select_ev->ev->fd_events; fde; fde = fde->next) { + if (fde->flags & TEVENT_FD_READ) { FD_SET(fde->fd, &r_fds); } - if (fde->flags & EVENT_FD_WRITE) { + if (fde->flags & TEVENT_FD_WRITE) { FD_SET(fde->fd, &w_fds); } } - if (select_ev->ev->num_signal_handlers && - common_event_check_signal(select_ev->ev)) { + if (select_ev->ev->signal_events && + tevent_common_check_signal(select_ev->ev)) { return 0; } selrtn = select(select_ev->maxfd+1, &r_fds, &w_fds, NULL, tvalp); if (selrtn == -1 && errno == EINTR && - select_ev->ev->num_signal_handlers) { - common_event_check_signal(select_ev->ev); + select_ev->ev->signal_events) { + tevent_common_check_signal(select_ev->ev); return 0; } @@ -216,15 +177,15 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru made readable and that should have removed the event, so this must be a bug. This is a fatal error. */ - ev_debug(select_ev->ev, EV_DEBUG_FATAL, - "ERROR: EBADF on select_event_loop_once\n"); + tevent_debug(select_ev->ev, TEVENT_DEBUG_FATAL, + "ERROR: EBADF on select_event_loop_once\n"); select_ev->exit_code = EBADF; return -1; } if (selrtn == 0 && tvalp) { /* we don't care about a possible delay here */ - common_event_loop_timer_delay(select_ev->ev); + tevent_common_loop_timer_delay(select_ev->ev); return 0; } @@ -232,11 +193,11 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru /* at least one file descriptor is ready - check which ones and call the handler, being careful to allow the handler to remove itself when called */ - for (fde = select_ev->fd_events; fde; fde = fde->next) { + for (fde = select_ev->ev->fd_events; fde; fde = fde->next) { uint16_t flags = 0; - if (FD_ISSET(fde->fd, &r_fds)) flags |= EVENT_FD_READ; - if (FD_ISSET(fde->fd, &w_fds)) flags |= EVENT_FD_WRITE; + if (FD_ISSET(fde->fd, &r_fds)) flags |= TEVENT_FD_READ; + if (FD_ISSET(fde->fd, &w_fds)) flags |= TEVENT_FD_WRITE; if (flags) { fde->handler(select_ev->ev, fde, flags, fde->private_data); if (destruction_count != select_ev->destruction_count) { @@ -252,13 +213,13 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru /* do a single event loop using the events defined in ev */ -static int select_event_loop_once(struct event_context *ev) +static int select_event_loop_once(struct tevent_context *ev) { struct select_event_context *select_ev = talloc_get_type(ev->additional_data, struct select_event_context); struct timeval tval; - tval = common_event_loop_timer_delay(ev); + tval = tevent_common_loop_timer_delay(ev); if (ev_timeval_is_zero(&tval)) { return 0; } @@ -269,13 +230,13 @@ static int select_event_loop_once(struct event_context *ev) /* return on failure or (with 0) if all fd events are removed */ -static int select_event_loop_wait(struct event_context *ev) +static int select_event_loop_wait(struct tevent_context *ev) { struct select_event_context *select_ev = talloc_get_type(ev->additional_data, struct select_event_context); select_ev->exit_code = 0; - while (select_ev->fd_events && select_ev->exit_code == 0) { + while (ev->fd_events && select_ev->exit_code == 0) { if (select_event_loop_once(ev) != 0) { break; } @@ -284,19 +245,19 @@ static int select_event_loop_wait(struct event_context *ev) return select_ev->exit_code; } -static const struct event_ops select_event_ops = { +static const struct tevent_ops select_event_ops = { .context_init = select_event_context_init, .add_fd = select_event_add_fd, - .get_fd_flags = select_event_get_fd_flags, - .set_fd_flags = select_event_set_fd_flags, - .add_timed = common_event_add_timed, - .add_signal = common_event_add_signal, + .set_fd_close_fn= tevent_common_fd_set_close_fn, + .get_fd_flags = tevent_common_fd_get_flags, + .set_fd_flags = tevent_common_fd_set_flags, + .add_timer = tevent_common_add_timer, + .add_signal = tevent_common_add_signal, .loop_once = select_event_loop_once, .loop_wait = select_event_loop_wait, }; -bool events_select_init(void) +bool tevent_select_init(void) { - return event_register_backend("select", &select_event_ops); + return tevent_register_backend("select", &select_event_ops); } -