From 0af1500fc0bafe61019f1b2ab1d9e1d369221240 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 3 Feb 2006 22:19:41 +0000 Subject: r13316: Let the carnage begin.... Sync with trunk as off r13315 (This used to be commit 17e63ac4ed8325c0d44fe62b2442449f3298559f) --- source3/lib/events.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 source3/lib/events.c (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c new file mode 100644 index 0000000000..314f074979 --- /dev/null +++ b/source3/lib/events.c @@ -0,0 +1,125 @@ +/* + Unix SMB/CIFS implementation. + Timed event library. + Copyright (C) Andrew Tridgell 1992-1998 + Copyright (C) Volker Lendecke 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. +*/ + +#include "includes.h" + +static struct timed_event *timed_events; + +static int timed_event_destructor(void *p) +{ + struct timed_event *te = talloc_get_type_abort(p, struct timed_event); + DEBUG(10, ("Destroying timed event %lx \"%s\"\n", (unsigned long)te, + te->event_name)); + DLIST_REMOVE(timed_events, te); + return 0; +} + +/**************************************************************************** + Schedule a function for future calling, cancel with talloc_free(). + It's the responsibility of the handler to call talloc_free() on the event + handed to it. +****************************************************************************/ + +struct timed_event *add_timed_event(TALLOC_CTX *mem_ctx, + struct timeval when, + const char *event_name, + void (*handler)(struct timed_event *te, + const struct timeval *now, + void *private_data), + void *private_data) +{ + struct timed_event *te, *last_te, *cur_te; + + te = TALLOC_P(mem_ctx, struct timed_event); + if (te == NULL) { + DEBUG(0, ("talloc failed\n")); + return NULL; + } + + te->when = when; + te->event_name = event_name; + te->handler = handler; + te->private_data = private_data; + + /* keep the list ordered */ + last_te = NULL; + for (cur_te = timed_events; cur_te; cur_te = cur_te->next) { + /* if the new event comes before the current one break */ + if (!timeval_is_zero(&cur_te->when) && + timeval_compare(&te->when, &cur_te->when) < 0) { + break; + } + last_te = cur_te; + } + + DLIST_ADD_AFTER(timed_events, te, last_te); + talloc_set_destructor(te, timed_event_destructor); + + DEBUG(10, ("Added timed event \"%s\": %lx\n", event_name, + (unsigned long)te)); + return te; +} + +void run_events(void) +{ + struct timeval now; + + if (timed_events == NULL) { + /* No syscall if there are no events */ + DEBUG(10, ("run_events: No events\n")); + return; + } + + GetTimeOfDay(&now); + + if (timeval_compare(&now, &timed_events->when) < 0) { + /* Nothing to do yet */ + DEBUG(10, ("run_events: Nothing to do\n")); + return; + } + + DEBUG(10, ("Running event \"%s\" %lx\n", timed_events->event_name, + (unsigned long)timed_events)); + + timed_events->handler(timed_events, &now, timed_events->private_data); + return; +} + +struct timeval *get_timed_events_timeout(struct timeval *to_ret, time_t default_to) +{ + struct timeval now; + + if (timed_events == NULL) { + if (default_to == (time_t)-1) { + return NULL; + } + *to_ret = timeval_set(default_to, 0); + return to_ret; + } + + now = timeval_current(); + *to_ret = timeval_until(&now, &timed_events->when); + + DEBUG(10, ("timed_events_timeout: %d/%d\n", (int)to_ret->tv_sec, + (int)to_ret->tv_usec)); + + return to_ret; +} -- cgit From 2d743ac8f15977fd936c78574c54227fc9fed3b9 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 9 Feb 2006 10:17:38 +0000 Subject: r13409: No functional changes, just some DEBUG cleanup. Guenther (This used to be commit 286f6fc2339cf4ef232c16466b8dffdcddbe343f) --- source3/lib/events.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 314f074979..3670d960aa 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -84,7 +84,7 @@ void run_events(void) if (timed_events == NULL) { /* No syscall if there are no events */ - DEBUG(10, ("run_events: No events\n")); + DEBUG(11, ("run_events: No events\n")); return; } @@ -92,7 +92,7 @@ void run_events(void) if (timeval_compare(&now, &timed_events->when) < 0) { /* Nothing to do yet */ - DEBUG(10, ("run_events: Nothing to do\n")); + DEBUG(11, ("run_events: Nothing to do\n")); return; } -- cgit From fb5362c069b5b6548478b2217a0519c56d856705 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Mon, 20 Feb 2006 17:59:58 +0000 Subject: r13571: Replace all calls to talloc_free() with thye TALLOC_FREE() macro which sets the freed pointer to NULL. (This used to be commit b65be8874a2efe5a4b167448960a4fcf6bd995e2) --- source3/lib/events.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 3670d960aa..133752c78e 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -33,8 +33,8 @@ static int timed_event_destructor(void *p) } /**************************************************************************** - Schedule a function for future calling, cancel with talloc_free(). - It's the responsibility of the handler to call talloc_free() on the event + Schedule a function for future calling, cancel with TALLOC_FREE(). + It's the responsibility of the handler to call TALLOC_FREE() on the event handed to it. ****************************************************************************/ -- cgit From cc203f3e59840b75fbb42a53d36b717a57268c2f Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 14 Apr 2006 03:55:42 +0000 Subject: r15084: Try and squeeze more out of the non-read/write code path. Jeremy. (This used to be commit 23dcff4d50d1d35b7ddee0d0cb79c16a312f179c) --- source3/lib/events.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 133752c78e..242c198511 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -103,16 +103,12 @@ void run_events(void) return; } -struct timeval *get_timed_events_timeout(struct timeval *to_ret, time_t default_to) +struct timeval *get_timed_events_timeout(struct timeval *to_ret) { struct timeval now; if (timed_events == NULL) { - if (default_to == (time_t)-1) { - return NULL; - } - *to_ret = timeval_set(default_to, 0); - return to_ret; + return NULL; } now = timeval_current(); -- cgit From 3bc4fd1bb9bfbd0e0efd89d47c50bf798e5a1481 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 29 Aug 2006 19:14:25 +0000 Subject: r17924: Get rid of warnings now that talloc is merged. Destructors now take a pointer to the "real" destroyed object as an argument. Volker (This used to be commit 70edd716ef0ccb218fe18d1233bd30abe46b62bf) --- source3/lib/events.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 242c198511..6db9930c30 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -23,9 +23,8 @@ static struct timed_event *timed_events; -static int timed_event_destructor(void *p) +static int timed_event_destructor(struct timed_event *te) { - struct timed_event *te = talloc_get_type_abort(p, struct timed_event); DEBUG(10, ("Destroying timed event %lx \"%s\"\n", (unsigned long)te, te->event_name)); DLIST_REMOVE(timed_events, te); -- cgit From ccdd921e61c95e8e2d1764a74603c863ca2867ba Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 6 Sep 2006 21:43:31 +0000 Subject: r18191: Fix the online/offline state handling of winbindd. Instead of trying to do this in the winbindd_cache entries, add a timed even handler to probe every 5 mins when disconnected. Fix events to run all pending events, rather than only one. Jeremy. (This used to be commit 7bfbe1b4fb9a91c6678035f220bbf0b4f5afdcac) --- source3/lib/events.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 6db9930c30..7da44c3466 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -79,27 +79,24 @@ struct timed_event *add_timed_event(TALLOC_CTX *mem_ctx, void run_events(void) { - struct timeval now; - - if (timed_events == NULL) { - /* No syscall if there are no events */ - DEBUG(11, ("run_events: No events\n")); - return; - } + /* Run all events that are pending, not just one (as we + did previously. */ - GetTimeOfDay(&now); + while (timed_events) { + struct timeval now; + GetTimeOfDay(&now); - if (timeval_compare(&now, &timed_events->when) < 0) { - /* Nothing to do yet */ - DEBUG(11, ("run_events: Nothing to do\n")); - return; - } + if (timeval_compare(&now, &timed_events->when) < 0) { + /* Nothing to do yet */ + DEBUG(11, ("run_events: Nothing to do\n")); + return; + } - DEBUG(10, ("Running event \"%s\" %lx\n", timed_events->event_name, - (unsigned long)timed_events)); + DEBUG(10, ("Running event \"%s\" %lx\n", timed_events->event_name, + (unsigned long)timed_events)); - timed_events->handler(timed_events, &now, timed_events->private_data); - return; + timed_events->handler(timed_events, &now, timed_events->private_data); + } } struct timeval *get_timed_events_timeout(struct timeval *to_ret) -- cgit From c9f9917e77ac780594c3dff476c33f521bbef2bd Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 13 Sep 2006 13:55:19 +0000 Subject: r18473: Once we go online, trigger a "get krb5 ticket event" immediately if we were waiting on one. Jeremy. (This used to be commit 6dc8f9042f057e1f9aff46042a0fe697cb8a912c) --- source3/lib/events.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 7da44c3466..d6f3c32828 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -58,7 +58,8 @@ struct timed_event *add_timed_event(TALLOC_CTX *mem_ctx, te->handler = handler; te->private_data = private_data; - /* keep the list ordered */ + /* keep the list ordered - this is NOT guarenteed as event times + may be changed after insertion */ last_te = NULL; for (cur_te = timed_events; cur_te; cur_te = cur_te->next) { /* if the new event comes before the current one break */ @@ -115,3 +116,17 @@ struct timeval *get_timed_events_timeout(struct timeval *to_ret) return to_ret; } + +int set_event_dispatch_time(const char *event_name, struct timeval when) +{ + int num_events = 0; + struct timed_event *te; + + for (te = timed_events; te; te = te->next) { + if (strcmp(event_name, te->event_name) == 0) { + te->when = when; + num_events++; + } + } + return num_events; +} -- cgit From 5ce139751bb77879f127dfa876cf1999717b69fc Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 8 Dec 2006 18:40:13 +0000 Subject: r20087: Ensure we clean up any random pending events we may have inherited from our parent in the winbindd forked child. Jeremy. (This used to be commit 0a1352f440a9d9b974ad8d571b2e48a43a15b6cc) --- source3/lib/events.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index d6f3c32828..66aefa3b52 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -130,3 +130,18 @@ int set_event_dispatch_time(const char *event_name, struct timeval when) } return num_events; } + +/* Returns 1 if event was found and cancelled, 0 otherwise. */ + +int cancel_named_event(const char *event_name) +{ + struct timed_event *te; + + for (te = timed_events; te; te = te->next) { + if (strcmp(event_name, te->event_name) == 0) { + TALLOC_FREE(te); + return 1; + } + } + return 0; +} -- cgit From bf219447a35d86913c1a643b66d993986a651360 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 17 Jan 2007 12:59:14 +0000 Subject: r20846: Before this gets out of control... This add a struct event_context and infrastructure for fd events to smbd. This is step zero to import lib/events. Jeremy, I rely on you to watch the change in receive_message_or_smb() closely. For the normal code path this should be the only relevant change. The rest is either not yet used or is cosmetic. Volker (This used to be commit cd07f93a8aecb24c056e33b1ad3447a41959810f) --- source3/lib/events.c | 219 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 197 insertions(+), 22 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 66aefa3b52..ef52faef01 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -21,13 +21,50 @@ #include "includes.h" -static struct timed_event *timed_events; +struct timed_event { + struct timed_event *next, *prev; + struct event_context *event_ctx; + struct timeval when; + const char *event_name; + void (*handler)(struct event_context *event_ctx, + struct timed_event *te, + const struct timeval *now, + void *private_data); + void *private_data; +}; + +struct fd_event { + struct fd_event *prev, *next; + struct event_context *event_ctx; + int fd; + uint16_t flags; /* see EVENT_FD_* flags */ + void (*handler)(struct event_context *event_ctx, + struct fd_event *event, + uint16 flags, + void *private_data); + void *private_data; +}; + +#define EVENT_FD_WRITEABLE(fde) \ + event_set_fd_flags(fde, event_get_fd_flags(fde) | EVENT_FD_WRITE) +#define EVENT_FD_READABLE(fde) \ + event_set_fd_flags(fde, event_get_fd_flags(fde) | EVENT_FD_READ) + +#define EVENT_FD_NOT_WRITEABLE(fde) \ + event_set_fd_flags(fde, event_get_fd_flags(fde) & ~EVENT_FD_WRITE) +#define EVENT_FD_NOT_READABLE(fde) \ + event_set_fd_flags(fde, event_get_fd_flags(fde) & ~EVENT_FD_READ) + +struct event_context { + struct timed_event *timed_events; + struct fd_event *fd_events; +}; static int timed_event_destructor(struct timed_event *te) { DEBUG(10, ("Destroying timed event %lx \"%s\"\n", (unsigned long)te, te->event_name)); - DLIST_REMOVE(timed_events, te); + DLIST_REMOVE(te->event_ctx->timed_events, te); return 0; } @@ -37,10 +74,12 @@ static int timed_event_destructor(struct timed_event *te) handed to it. ****************************************************************************/ -struct timed_event *add_timed_event(TALLOC_CTX *mem_ctx, +struct timed_event *event_add_timed(struct event_context *event_ctx, + TALLOC_CTX *mem_ctx, struct timeval when, const char *event_name, - void (*handler)(struct timed_event *te, + void (*handler)(struct event_context *event_ctx, + struct timed_event *te, const struct timeval *now, void *private_data), void *private_data) @@ -53,6 +92,7 @@ struct timed_event *add_timed_event(TALLOC_CTX *mem_ctx, return NULL; } + te->event_ctx = event_ctx; te->when = when; te->event_name = event_name; te->handler = handler; @@ -61,16 +101,16 @@ struct timed_event *add_timed_event(TALLOC_CTX *mem_ctx, /* keep the list ordered - this is NOT guarenteed as event times may be changed after insertion */ last_te = NULL; - for (cur_te = timed_events; cur_te; cur_te = cur_te->next) { + for (cur_te = event_ctx->timed_events; cur_te; cur_te = cur_te->next) { /* if the new event comes before the current one break */ - if (!timeval_is_zero(&cur_te->when) && - timeval_compare(&te->when, &cur_te->when) < 0) { + if (!timeval_is_zero(&cur_te->when) + && timeval_compare(&te->when, &cur_te->when) < 0) { break; } last_te = cur_te; } - DLIST_ADD_AFTER(timed_events, te, last_te); + DLIST_ADD_AFTER(event_ctx->timed_events, te, last_te); talloc_set_destructor(te, timed_event_destructor); DEBUG(10, ("Added timed event \"%s\": %lx\n", event_name, @@ -78,38 +118,166 @@ struct timed_event *add_timed_event(TALLOC_CTX *mem_ctx, return te; } -void run_events(void) +static int fd_event_destructor(struct fd_event *fde) +{ + struct event_context *event_ctx = fde->event_ctx; + + DLIST_REMOVE(event_ctx->fd_events, fde); + return 0; +} + +struct fd_event *event_add_fd(struct event_context *event_ctx, + TALLOC_CTX *mem_ctx, + int fd, uint16_t flags, + void (*handler)(struct event_context *event_ctx, + struct fd_event *event, + uint16 flags, + void *private_data), + void *private_data) +{ + struct fd_event *fde; + + if (!(fde = TALLOC_P(mem_ctx, struct fd_event))) { + return NULL; + } + + fde->event_ctx = event_ctx; + fde->fd = fd; + fde->flags = flags; + fde->handler = handler; + fde->private_data = private_data; + + DLIST_ADD(event_ctx->fd_events, fde); + + talloc_set_destructor(fde, fd_event_destructor); + return fde; +} + +void event_fd_set_writeable(struct fd_event *fde) +{ + fde->flags |= EVENT_FD_WRITE; +} + +void event_fd_set_not_writeable(struct fd_event *fde) +{ + fde->flags &= ~EVENT_FD_WRITE; +} + +void event_fd_set_readable(struct fd_event *fde) +{ + fde->flags |= EVENT_FD_READ; +} + +void event_fd_set_not_readable(struct fd_event *fde) +{ + fde->flags &= ~EVENT_FD_READ; +} + +void event_add_to_select_args(struct event_context *event_ctx, + const struct timeval *now, + fd_set *read_fds, fd_set *write_fds, + struct timeval *timeout, int *maxfd) { + struct fd_event *fde; + struct timeval diff; + + for (fde = event_ctx->fd_events; fde; fde = fde->next) { + if (fde->flags & EVENT_FD_READ) { + FD_SET(fde->fd, read_fds); + } + if (fde->flags & EVENT_FD_WRITE) { + FD_SET(fde->fd, write_fds); + } + + if ((fde->flags & (EVENT_FD_READ|EVENT_FD_WRITE)) + && (fde->fd > *maxfd)) { + *maxfd = fde->fd; + } + } + + if (event_ctx->timed_events == NULL) { + return; + } + + diff = timeval_until(now, &event_ctx->timed_events->when); + *timeout = timeval_min(timeout, &diff); +} + +BOOL run_events(struct event_context *event_ctx, + int selrtn, fd_set *read_fds, fd_set *write_fds) +{ + BOOL fired = False; + struct fd_event *fde, *next; + /* Run all events that are pending, not just one (as we did previously. */ - while (timed_events) { + while (event_ctx->timed_events) { struct timeval now; GetTimeOfDay(&now); - if (timeval_compare(&now, &timed_events->when) < 0) { + if (timeval_compare( + &now, &event_ctx->timed_events->when) < 0) { /* Nothing to do yet */ DEBUG(11, ("run_events: Nothing to do\n")); - return; + break; } - DEBUG(10, ("Running event \"%s\" %lx\n", timed_events->event_name, - (unsigned long)timed_events)); + DEBUG(10, ("Running event \"%s\" %lx\n", + event_ctx->timed_events->event_name, + (unsigned long)event_ctx->timed_events)); + + event_ctx->timed_events->handler( + event_ctx, + event_ctx->timed_events, &now, + event_ctx->timed_events->private_data); - timed_events->handler(timed_events, &now, timed_events->private_data); + fired = True; } + + if (fired) { + /* + * We might have changed the socket status during the timed + * events, return to run select again. + */ + return True; + } + + if (selrtn == 0) { + /* + * No fd ready + */ + return fired; + } + + for (fde = event_ctx->fd_events; fde; fde = next) { + uint16 flags = 0; + + next = fde->next; + if (FD_ISSET(fde->fd, read_fds)) flags |= EVENT_FD_READ; + if (FD_ISSET(fde->fd, write_fds)) flags |= EVENT_FD_WRITE; + + if (flags) { + fde->handler(event_ctx, fde, flags, fde->private_data); + fired = True; + } + } + + return fired; } -struct timeval *get_timed_events_timeout(struct timeval *to_ret) + +struct timeval *get_timed_events_timeout(struct event_context *event_ctx, + struct timeval *to_ret) { struct timeval now; - if (timed_events == NULL) { + if (event_ctx->timed_events == NULL) { return NULL; } now = timeval_current(); - *to_ret = timeval_until(&now, &timed_events->when); + *to_ret = timeval_until(&now, &event_ctx->timed_events->when); DEBUG(10, ("timed_events_timeout: %d/%d\n", (int)to_ret->tv_sec, (int)to_ret->tv_usec)); @@ -117,12 +285,18 @@ struct timeval *get_timed_events_timeout(struct timeval *to_ret) return to_ret; } -int set_event_dispatch_time(const char *event_name, struct timeval when) +struct event_context *event_context_init(TALLOC_CTX *mem_ctx) +{ + return TALLOC_ZERO_P(NULL, struct event_context); +} + +int set_event_dispatch_time(struct event_context *event_ctx, + const char *event_name, struct timeval when) { int num_events = 0; struct timed_event *te; - for (te = timed_events; te; te = te->next) { + for (te = event_ctx->timed_events; te; te = te->next) { if (strcmp(event_name, te->event_name) == 0) { te->when = when; num_events++; @@ -133,11 +307,12 @@ int set_event_dispatch_time(const char *event_name, struct timeval when) /* Returns 1 if event was found and cancelled, 0 otherwise. */ -int cancel_named_event(const char *event_name) +int cancel_named_event(struct event_context *event_ctx, + const char *event_name) { struct timed_event *te; - for (te = timed_events; te; te = te->next) { + for (te = event_ctx->timed_events; te; te = te->next) { if (strcmp(event_name, te->event_name) == 0) { TALLOC_FREE(te); return 1; -- cgit From 14889901e24eec3a60d338465397306fecf0bedf Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 19 Jan 2007 19:41:34 +0000 Subject: r20912: Ensure the list always remains sorted even when moving events around. Jeremy. (This used to be commit 6fee874ab420b4c406e38b5e189a6d6ea8594fc9) --- source3/lib/events.c | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index ef52faef01..ab38a85a53 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -68,6 +68,28 @@ static int timed_event_destructor(struct timed_event *te) return 0; } +/**************************************************************************** + Add te by time. +****************************************************************************/ + +static void add_event_by_time(struct timed_event *te) +{ + struct timed_event *last_te, *cur_te; + + /* Keep the list ordered by time. We must preserve this. */ + last_te = NULL; + for (cur_te = timed_events; cur_te; cur_te = cur_te->next) { + /* if the new event comes before the current one break */ + if (!timeval_is_zero(&cur_te->when) && + timeval_compare(&te->when, &cur_te->when) < 0) { + break; + } + last_te = cur_te; + } + + DLIST_ADD_AFTER(timed_events, te, last_te); +} + /**************************************************************************** Schedule a function for future calling, cancel with TALLOC_FREE(). It's the responsibility of the handler to call TALLOC_FREE() on the event @@ -75,7 +97,7 @@ static int timed_event_destructor(struct timed_event *te) ****************************************************************************/ struct timed_event *event_add_timed(struct event_context *event_ctx, - TALLOC_CTX *mem_ctx, + TALLOC_CTX *mem_ctx, struct timeval when, const char *event_name, void (*handler)(struct event_context *event_ctx, @@ -84,7 +106,7 @@ struct timed_event *event_add_timed(struct event_context *event_ctx, void *private_data), void *private_data) { - struct timed_event *te, *last_te, *cur_te; + struct timed_event *te; te = TALLOC_P(mem_ctx, struct timed_event); if (te == NULL) { @@ -98,19 +120,8 @@ struct timed_event *event_add_timed(struct event_context *event_ctx, te->handler = handler; te->private_data = private_data; - /* keep the list ordered - this is NOT guarenteed as event times - may be changed after insertion */ - last_te = NULL; - for (cur_te = event_ctx->timed_events; cur_te; cur_te = cur_te->next) { - /* if the new event comes before the current one break */ - if (!timeval_is_zero(&cur_te->when) - && timeval_compare(&te->when, &cur_te->when) < 0) { - break; - } - last_te = cur_te; - } + add_event_by_time(te); - DLIST_ADD_AFTER(event_ctx->timed_events, te, last_te); talloc_set_destructor(te, timed_event_destructor); DEBUG(10, ("Added timed event \"%s\": %lx\n", event_name, @@ -293,16 +304,17 @@ struct event_context *event_context_init(TALLOC_CTX *mem_ctx) int set_event_dispatch_time(struct event_context *event_ctx, const char *event_name, struct timeval when) { - int num_events = 0; struct timed_event *te; for (te = event_ctx->timed_events; te; te = te->next) { if (strcmp(event_name, te->event_name) == 0) { + DLIST_REMOVE(timed_events, te); te->when = when; - num_events++; + add_event_by_time(te); + return 1; } } - return num_events; + return 0; } /* Returns 1 if event was found and cancelled, 0 otherwise. */ -- cgit From e5fbc269de86cec328c2ea0e748d6bbf3a5f5133 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 19 Jan 2007 20:00:44 +0000 Subject: r20913: Fix the build. Jeremy. (This used to be commit dce98dae2d18126d8380f92595f315b96d48a7df) --- source3/lib/events.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index ab38a85a53..a00db77b6b 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -74,11 +74,12 @@ static int timed_event_destructor(struct timed_event *te) static void add_event_by_time(struct timed_event *te) { + struct event_context *ctx = te->event_ctx; struct timed_event *last_te, *cur_te; /* Keep the list ordered by time. We must preserve this. */ last_te = NULL; - for (cur_te = timed_events; cur_te; cur_te = cur_te->next) { + for (cur_te = ctx->timed_events; cur_te; cur_te = cur_te->next) { /* if the new event comes before the current one break */ if (!timeval_is_zero(&cur_te->when) && timeval_compare(&te->when, &cur_te->when) < 0) { @@ -87,7 +88,7 @@ static void add_event_by_time(struct timed_event *te) last_te = cur_te; } - DLIST_ADD_AFTER(timed_events, te, last_te); + DLIST_ADD_AFTER(ctx->timed_events, te, last_te); } /**************************************************************************** @@ -308,7 +309,7 @@ int set_event_dispatch_time(struct event_context *event_ctx, for (te = event_ctx->timed_events; te; te = te->next) { if (strcmp(event_name, te->event_name) == 0) { - DLIST_REMOVE(timed_events, te); + DLIST_REMOVE(event_ctx->timed_events, te); te->when = when; add_event_by_time(te); return 1; -- cgit From 56e6e5b8ca9c42f53425ebc48157e4041e52a878 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 16 May 2007 13:02:53 +0000 Subject: r22934: Change smbcontrol to use messaging_register instead of message_register (This used to be commit e3d985c581ffc597aea932858d27c421643d2868) --- source3/lib/events.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index a00db77b6b..77d18ec13d 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -185,20 +185,27 @@ void event_fd_set_not_readable(struct fd_event *fde) fde->flags &= ~EVENT_FD_READ; } -void event_add_to_select_args(struct event_context *event_ctx, +/* + * Return if there's something in the queue + */ + +BOOL event_add_to_select_args(struct event_context *event_ctx, const struct timeval *now, fd_set *read_fds, fd_set *write_fds, struct timeval *timeout, int *maxfd) { struct fd_event *fde; struct timeval diff; + BOOL ret = False; for (fde = event_ctx->fd_events; fde; fde = fde->next) { if (fde->flags & EVENT_FD_READ) { FD_SET(fde->fd, read_fds); + ret = True; } if (fde->flags & EVENT_FD_WRITE) { FD_SET(fde->fd, write_fds); + ret = True; } if ((fde->flags & (EVENT_FD_READ|EVENT_FD_WRITE)) @@ -208,11 +215,13 @@ void event_add_to_select_args(struct event_context *event_ctx, } if (event_ctx->timed_events == NULL) { - return; + return ret; } diff = timeval_until(now, &event_ctx->timed_events->when); *timeout = timeval_min(timeout, &diff); + + return True; } BOOL run_events(struct event_context *event_ctx, @@ -297,6 +306,40 @@ struct timeval *get_timed_events_timeout(struct event_context *event_ctx, return to_ret; } +int event_loop_once(struct event_context *ev) +{ + struct timeval now, to; + fd_set r_fds, w_fds; + int maxfd = 0; + int ret; + + FD_ZERO(&r_fds); + FD_ZERO(&w_fds); + + to.tv_sec = 9999; /* Max timeout */ + to.tv_usec = 0; + + GetTimeOfDay(&now); + + if (!event_add_to_select_args(ev, &now, &r_fds, &w_fds, &to, &maxfd)) { + return -1; + } + + if (timeval_is_zero(&to)) { + run_events(ev, 0, NULL, NULL); + return 0; + } + + ret = sys_select(maxfd, &r_fds, &w_fds, NULL, &to); + + if (ret == -1 && errno != EINTR) { + return -1; + } + + run_events(ev, ret, &r_fds, &w_fds); + return 0; +} + struct event_context *event_context_init(TALLOC_CTX *mem_ctx) { return TALLOC_ZERO_P(NULL, struct event_context); -- cgit From 4d5f58c2b945e7a2263ba42749f73c7ba72ab3c7 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 19 May 2007 21:53:28 +0000 Subject: r23015: Make message_(de)register static to messages.c (This used to be commit a8082a3c7c3d1e68c27fc3bf42f3d44402cc6f9f) --- source3/lib/events.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 77d18ec13d..9b0a2b6712 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -224,6 +224,21 @@ BOOL event_add_to_select_args(struct event_context *event_ctx, return True; } +BOOL events_pending(struct event_context *event_ctx) +{ + struct fd_event *fde; + + if (event_ctx->timed_events != NULL) { + return True; + } + for (fde = event_ctx->fd_events; fde; fde = fde->next) { + if (fde->flags & (EVENT_FD_READ|EVENT_FD_WRITE)) { + return True; + } + } + return False; +} + BOOL run_events(struct event_context *event_ctx, int selrtn, fd_set *read_fds, fd_set *write_fds) { -- cgit From 90773ab0be6030f249ac8b8cf65ad3e8141cbb42 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 21 Jun 2007 13:03:27 +0000 Subject: r23562: Add dump_event_list() for debugging the event list. Guenther (This used to be commit 4e1e697ac48513719bd3a2152f17871bc00df796) --- source3/lib/events.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 9b0a2b6712..09915a2dcd 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -391,3 +391,27 @@ int cancel_named_event(struct event_context *event_ctx, } return 0; } + +void dump_event_list(struct event_context *event_ctx) +{ + struct timed_event *te; + struct timeval evt, now; + + if (!event_ctx) { + return; + } + + now = timeval_current(); + + DEBUG(10,("dump_event_list:\n")); + + for (te = event_ctx->timed_events; te; te = te->next) { + + evt = timeval_until(&now, &te->when); + + DEBUGADD(10,("Event \"%s\" %lx handled in %d seconds\n", + te->event_name, + (unsigned long)te, + (int)evt.tv_sec)); + } +} -- cgit From 851224a92463f5a556864a2a7ed648a8019e84e8 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 21 Jun 2007 15:12:51 +0000 Subject: r23569: Also dump fd_event in dump_event_list(). Guenther (This used to be commit 27fdf995d13611ebc9e57895f886c184e9027c4d) --- source3/lib/events.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 09915a2dcd..314fa2d538 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -395,6 +395,7 @@ int cancel_named_event(struct event_context *event_ctx, void dump_event_list(struct event_context *event_ctx) { struct timed_event *te; + struct fd_event *fe; struct timeval evt, now; if (!event_ctx) { @@ -409,9 +410,17 @@ void dump_event_list(struct event_context *event_ctx) evt = timeval_until(&now, &te->when); - DEBUGADD(10,("Event \"%s\" %lx handled in %d seconds\n", + DEBUGADD(10,("Timed Event \"%s\" %lx handled in %d seconds\n", te->event_name, (unsigned long)te, (int)evt.tv_sec)); } + + for (fe = event_ctx->fd_events; fe; fe = fe->next) { + + DEBUGADD(10,("FD Event %d %lx, flags: 0x%04x\n", + fe->fd, + (unsigned long)fe, + fe->flags)); + } } -- cgit From d824b98f80ba186030cbb70b3a1e5daf80469ecd Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 9 Jul 2007 19:25:36 +0000 Subject: r23779: Change from v2 or later to v3 or later. Jeremy. (This used to be commit 407e6e695b8366369b7c76af1ff76869b45347b3) --- source3/lib/events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 314fa2d538..79b02fe7df 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -6,7 +6,7 @@ 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 + 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, -- cgit From 5e54558c6dea67b56bbfaba5698f3a434d3dffb6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 00:52:41 +0000 Subject: r23784: use the GPLv3 boilerplate as recommended by the FSF and the license text (This used to be commit b0132e94fc5fef936aa766fb99a306b3628e9f07) --- source3/lib/events.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 79b02fe7df..e915777217 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -15,8 +15,7 @@ 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. + along with this program. If not, see . */ #include "includes.h" -- cgit From c6fab069024dee15502a2b527c45a10a689eaedf Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 20 Sep 2007 11:02:27 +0000 Subject: r25257: When dumping eventlist, display full timestring. Guenther (This used to be commit 38eca60913f513accb24b31dcb6d1d7e92b0ba66) --- source3/lib/events.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index e915777217..befab3f5c0 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -409,10 +409,11 @@ void dump_event_list(struct event_context *event_ctx) evt = timeval_until(&now, &te->when); - DEBUGADD(10,("Timed Event \"%s\" %lx handled in %d seconds\n", + DEBUGADD(10,("Timed Event \"%s\" %lx handled in %d seconds (at %s)\n", te->event_name, (unsigned long)te, - (int)evt.tv_sec)); + (int)evt.tv_sec, + http_timestring(te->when.tv_sec))); } for (fe = event_ctx->fd_events; fe; fe = fe->next) { -- cgit From 30191d1a5704ad2b158386b511558972d539ce47 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 18 Oct 2007 17:40:25 -0700 Subject: RIP BOOL. Convert BOOL -> bool. I found a few interesting bugs in various places whilst doing this (places that assumed BOOL == int). I also need to fix the Samba4 pidl generation (next checkin). Jeremy. (This used to be commit f35a266b3cbb3e5fa6a86be60f34fe340a3ca71f) --- source3/lib/events.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index befab3f5c0..f7bad9bcad 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -188,14 +188,14 @@ void event_fd_set_not_readable(struct fd_event *fde) * Return if there's something in the queue */ -BOOL event_add_to_select_args(struct event_context *event_ctx, +bool event_add_to_select_args(struct event_context *event_ctx, const struct timeval *now, fd_set *read_fds, fd_set *write_fds, struct timeval *timeout, int *maxfd) { struct fd_event *fde; struct timeval diff; - BOOL ret = False; + bool ret = False; for (fde = event_ctx->fd_events; fde; fde = fde->next) { if (fde->flags & EVENT_FD_READ) { @@ -223,7 +223,7 @@ BOOL event_add_to_select_args(struct event_context *event_ctx, return True; } -BOOL events_pending(struct event_context *event_ctx) +bool events_pending(struct event_context *event_ctx) { struct fd_event *fde; @@ -238,10 +238,10 @@ BOOL events_pending(struct event_context *event_ctx) return False; } -BOOL run_events(struct event_context *event_ctx, +bool run_events(struct event_context *event_ctx, int selrtn, fd_set *read_fds, fd_set *write_fds) { - BOOL fired = False; + bool fired = False; struct fd_event *fde, *next; /* Run all events that are pending, not just one (as we -- cgit From fe4930b7fae084b664eef2342cf1e4b6a3daf698 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 1 Apr 2008 15:29:59 +0200 Subject: Enable multiple fd events on a single file descriptor Now we can have multiple events listen on a single fd. The order in which they are called is naturally not defined, meaning that it is only deterministic if exactly one event is readable or writeable. (This used to be commit 61503f822b60f98dd1f7549707ec89b48e32caeb) --- source3/lib/events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index f7bad9bcad..9decf213b4 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -292,7 +292,7 @@ bool run_events(struct event_context *event_ctx, if (FD_ISSET(fde->fd, read_fds)) flags |= EVENT_FD_READ; if (FD_ISSET(fde->fd, write_fds)) flags |= EVENT_FD_WRITE; - if (flags) { + if (flags & fde->flags) { fde->handler(event_ctx, fde, flags, fde->private_data); fired = True; } -- cgit From 87c15f5a57c4c7e35ac87fa1c90faeeac7c86250 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 28 May 2008 00:59:14 +0200 Subject: lib/events: use mem_context given to event_context_init(). Michael (This used to be commit f872a1f4428ed64bcfd832d981eea6446f05339e) --- source3/lib/events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 9decf213b4..8134a7ac1c 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -356,7 +356,7 @@ int event_loop_once(struct event_context *ev) struct event_context *event_context_init(TALLOC_CTX *mem_ctx) { - return TALLOC_ZERO_P(NULL, struct event_context); + return TALLOC_ZERO_P(mem_ctx, struct event_context); } int set_event_dispatch_time(struct event_context *event_ctx, -- cgit From 5b8259c11240417913cd4140f90ad70ee88316ed Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 11 Jun 2008 18:56:20 +0200 Subject: Fix max_fd calculation in event_loop_once For some bugs I really wonder how they can go undetected for so long. Fix a bug reported by Mathias Dietz. No samba bugzilla entry, but still 100% needed for 3-2-stable. Volker (cherry picked from commit 82c994dabc47bb4755c883a1f3651bb5d65cf2c5) (This used to be commit 91c73e093a03b10426b671cb3e1dffb8a2455d47) --- source3/lib/events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 8134a7ac1c..7750176d8e 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -344,7 +344,7 @@ int event_loop_once(struct event_context *ev) return 0; } - ret = sys_select(maxfd, &r_fds, &w_fds, NULL, &to); + ret = sys_select(maxfd+1, &r_fds, &w_fds, NULL, &to); if (ret == -1 && errno != EINTR) { return -1; -- cgit From 12ee6b832c7ff09010fc67122aaefcfce1cb712f Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 9 Aug 2008 21:39:18 +0200 Subject: Make events robust against their event_context being freed (This used to be commit 3d4e7b29c235e329aaea4fa2c2078df0ce3e59eb) --- source3/lib/events.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'source3/lib/events.c') diff --git a/source3/lib/events.c b/source3/lib/events.c index 7750176d8e..f03138708b 100644 --- a/source3/lib/events.c +++ b/source3/lib/events.c @@ -63,7 +63,9 @@ static int timed_event_destructor(struct timed_event *te) { DEBUG(10, ("Destroying timed event %lx \"%s\"\n", (unsigned long)te, te->event_name)); - DLIST_REMOVE(te->event_ctx->timed_events, te); + if (te->event_ctx != NULL) { + DLIST_REMOVE(te->event_ctx->timed_events, te); + } return 0; } @@ -131,9 +133,9 @@ struct timed_event *event_add_timed(struct event_context *event_ctx, static int fd_event_destructor(struct fd_event *fde) { - struct event_context *event_ctx = fde->event_ctx; - - DLIST_REMOVE(event_ctx->fd_events, fde); + if (fde->event_ctx != NULL) { + DLIST_REMOVE(fde->event_ctx->fd_events, fde); + } return 0; } @@ -354,9 +356,30 @@ int event_loop_once(struct event_context *ev) return 0; } +static int event_context_destructor(struct event_context *ev) +{ + while (ev->fd_events != NULL) { + ev->fd_events->event_ctx = NULL; + DLIST_REMOVE(ev->fd_events, ev->fd_events); + } + while (ev->timed_events != NULL) { + ev->timed_events->event_ctx = NULL; + DLIST_REMOVE(ev->timed_events, ev->timed_events); + } + return 0; +} + struct event_context *event_context_init(TALLOC_CTX *mem_ctx) { - return TALLOC_ZERO_P(mem_ctx, struct event_context); + struct event_context *result; + + result = TALLOC_ZERO_P(mem_ctx, struct event_context); + if (result == NULL) { + return NULL; + } + + talloc_set_destructor(result, event_context_destructor); + return result; } int set_event_dispatch_time(struct event_context *event_ctx, -- cgit