diff options
Diffstat (limited to 'lib/tevent/tevent_standard.c')
-rw-r--r-- | lib/tevent/tevent_standard.c | 53 |
1 files changed, 19 insertions, 34 deletions
diff --git a/lib/tevent/tevent_standard.c b/lib/tevent/tevent_standard.c index 2d8a2305d9..ee93991def 100644 --- a/lib/tevent/tevent_standard.c +++ b/lib/tevent/tevent_standard.c @@ -38,9 +38,6 @@ struct std_event_context { /* a pointer back to the generic event_context */ struct tevent_context *ev; - /* list of filedescriptor events */ - struct tevent_fd *fd_events; - /* the maximum file descriptor number in fd_events */ int maxfd; @@ -134,7 +131,7 @@ static void epoll_check_reopen(struct std_event_context *std_ev) return; } std_ev->pid = getpid(); - for (fde=std_ev->fd_events;fde;fde=fde->next) { + for (fde=std_ev->ev->fd_events;fde;fde=fde->next) { epoll_add_event(std_ev, fde); } } @@ -358,7 +355,7 @@ static void calc_maxfd(struct std_event_context *std_ev) struct tevent_fd *fde; std_ev->maxfd = 0; - for (fde = std_ev->fd_events; fde; fde = fde->next) { + for (fde = std_ev->ev->fd_events; fde; fde = fde->next) { if (fde->fd > std_ev->maxfd) { std_ev->maxfd = fde->fd; } @@ -377,26 +374,24 @@ static void calc_maxfd(struct std_event_context *std_ev) static int std_event_fd_destructor(struct tevent_fd *fde) { struct tevent_context *ev = fde->event_ctx; - struct std_event_context *std_ev = talloc_get_type(ev->additional_data, - struct std_event_context); + struct std_event_context *std_ev = NULL; - epoll_check_reopen(std_ev); + if (ev) { + std_ev = talloc_get_type(ev->additional_data, + struct std_event_context); - if (std_ev->maxfd == fde->fd) { - std_ev->maxfd = EVENT_INVALID_MAXFD; - } + epoll_check_reopen(std_ev); - DLIST_REMOVE(std_ev->fd_events, fde); - std_ev->destruction_count++; + if (std_ev->maxfd == fde->fd) { + std_ev->maxfd = EVENT_INVALID_MAXFD; + } - epoll_del_event(std_ev, fde); + std_ev->destruction_count++; - if (fde->close_fn) { - fde->close_fn(ev, fde, fde->fd, fde->private_data); - fde->fd = -1; + epoll_del_event(std_ev, fde); } - return 0; + return tevent_common_fd_destructor(fde); } /* @@ -416,21 +411,11 @@ static struct tevent_fd *std_event_add_fd(struct tevent_context *ev, TALLOC_CTX epoll_check_reopen(std_ev); - fde = talloc(mem_ctx?mem_ctx:ev, struct tevent_fd); + 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->close_fn = NULL; - fde->private_data = private_data; - fde->handler_name = handler_name; - fde->location = location; - fde->additional_flags = 0; - fde->additional_data = NULL; - - DLIST_ADD(std_ev->fd_events, fde); if ((std_ev->maxfd != EVENT_INVALID_MAXFD) && (fde->fd > std_ev->maxfd)) { std_ev->maxfd = fde->fd; @@ -481,7 +466,7 @@ static int std_event_loop_select(struct std_event_context *std_ev, struct timeva FD_ZERO(&w_fds); /* setup any fd events */ - for (fde = std_ev->fd_events; fde; fde = fde->next) { + for (fde = std_ev->ev->fd_events; fde; fde = fde->next) { if (fde->flags & TEVENT_FD_READ) { FD_SET(fde->fd, &r_fds); } @@ -525,7 +510,7 @@ static int std_event_loop_select(struct std_event_context *std_ev, struct timeva /* 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 = std_ev->fd_events; fde; fde = fde->next) { + for (fde = std_ev->ev->fd_events; fde; fde = fde->next) { uint16_t flags = 0; if (FD_ISSET(fde->fd, &r_fds)) flags |= TEVENT_FD_READ; @@ -574,7 +559,7 @@ static int std_event_loop_wait(struct tevent_context *ev) struct std_event_context); std_ev->exit_code = 0; - while (std_ev->fd_events && std_ev->exit_code == 0) { + while (ev->fd_events && std_ev->exit_code == 0) { if (std_event_loop_once(ev) != 0) { break; } |