summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2009-01-28 10:35:35 +0100
committerKarolin Seeger <kseeger@samba.org>2009-01-29 08:41:17 +0100
commit2eacd0343b0f18e481a3f8ab49388ca73dbc24a1 (patch)
tree2ed4c0bc388adddf4264e868bb8429f0c9661755 /source
parent8ec4938668bc710427179cb898aa49c5f699a38c (diff)
downloadsamba-2eacd0343b0f18e481a3f8ab49388ca73dbc24a1.tar.gz
Avoid valgrind errors
In event handlers, we might destroy other events that are pending in the lists. We can only run one event safely per select call. Yes, I've seen these valgrind errors :-) Jeremy, with ccdd921e61 you had checked in the change to run multiple events. Do you remember why it was necessary and could not be solved in a different way? Volker (cherry picked from commit 077e0ed31315242c571ccd9e9579f53aac0dbbc7)
Diffstat (limited to 'source')
-rw-r--r--source/lib/events.c38
1 files changed, 10 insertions, 28 deletions
diff --git a/source/lib/events.c b/source/lib/events.c
index 229e7e259b4..9d809fbbe0a 100644
--- a/source/lib/events.c
+++ b/source/lib/events.c
@@ -245,22 +245,13 @@ bool events_pending(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;
- struct fd_event *fde, *next;
-
- /* Run all events that are pending, not just one (as we
- did previously. */
+ struct fd_event *fde;
+ struct timeval now;
- while (event_ctx->timed_events) {
- struct timeval now;
- GetTimeOfDay(&now);
+ GetTimeOfDay(&now);
- if (timeval_compare(
- &now, &event_ctx->timed_events->when) < 0) {
- /* Nothing to do yet */
- DEBUG(11, ("run_events: Nothing to do\n"));
- break;
- }
+ if ((event_ctx->timed_events != NULL)
+ && (timeval_compare(&now, &event_ctx->timed_events->when) >= 0)) {
DEBUG(10, ("Running event \"%s\" %lx\n",
event_ctx->timed_events->event_name,
@@ -271,38 +262,29 @@ bool run_events(struct event_context *event_ctx,
event_ctx->timed_events, &now,
event_ctx->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;
+ return true;
}
if (selrtn == 0) {
/*
* No fd ready
*/
- return fired;
+ return false;
}
- for (fde = event_ctx->fd_events; fde; fde = next) {
+ for (fde = event_ctx->fd_events; fde; 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 true;
}
}
- return fired;
+ return false;
}