The branch, master has been updated
via 570a4b3 tevent_poll: add poll_event_loop_wait()
via e79ad7c tevent_poll: fix the usage of tevent_re_initialise()
via dd9f0c9 tevent_poll: call tevent_common_fd_destructor() from
poll_fresh_fde_destructor()
via 1cfc76f tevent_poll: Avoid a crash in poll_event_set_fd_flags
via 611fcca tevent_poll: Avoid a crash in poll_fresh_fde_destructor
via 0cf62a9 tevent_poll: NULL out fde->event_ctx for "fresh" poll fdes
via 3ce58cb tevent_poll: Use the poll_event_context_destructor always
via e330985 tevent_poll: Re-order routines
via d944e2c tevent_poll: Fix a crash in the poll backend
from 4990080 krb5pac: make sure to correctly store the highest relative
pointer offset.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 570a4b3e22dbddb3f1dc095cc1fe1b6a1f3af069
Author: Stefan Metzmacher <[email protected]>
Date: Fri Feb 1 15:50:08 2013 +0100
tevent_poll: add poll_event_loop_wait()
We can't use tevent_common_loop_wait() because new fd events
will be added to the poll_ev->fresh list instead of
ev->fd_events.
Signed-off-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Volker Lendecke <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
Autobuild-User(master): Jeremy Allison <[email protected]>
Autobuild-Date(master): Sun Feb 3 06:40:09 CET 2013 on sn-devel-104
commit e79ad7cff196fd6d9250420d83551fd3ac665b19
Author: Stefan Metzmacher <[email protected]>
Date: Fri Feb 1 15:27:10 2013 +0100
tevent_poll: fix the usage of tevent_re_initialise()
Signed-off-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Volker Lendecke <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit dd9f0c9b6d4141bc3f40cec1567bfb28b572207c
Author: Stefan Metzmacher <[email protected]>
Date: Fri Feb 1 15:56:34 2013 +0100
tevent_poll: call tevent_common_fd_destructor() from
poll_fresh_fde_destructor()
We need to trigger the fde->close_fn().
Signed-off-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Volker Lendecke <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit 1cfc76f72ae454b13dbaeca22df06cb6f78f078f
Author: Volker Lendecke <[email protected]>
Date: Thu Jan 31 16:34:41 2013 +0100
tevent_poll: Avoid a crash in poll_event_set_fd_flags
The event context might have been freed before the fde
Signed-off-by: Volker Lendecke <[email protected]>
Reviewed-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit 611fcca641a22a2a23b26752105af99cf338d6a1
Author: Volker Lendecke <[email protected]>
Date: Thu Jan 31 16:34:41 2013 +0100
tevent_poll: Avoid a crash in poll_fresh_fde_destructor
The event context might have been freed before the fde
Signed-off-by: Volker Lendecke <[email protected]>
Reviewed-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit 0cf62a92f26ef9c7d3c5a5d256adc72d66335319
Author: Volker Lendecke <[email protected]>
Date: Thu Jan 31 16:31:45 2013 +0100
tevent_poll: NULL out fde->event_ctx for "fresh" poll fdes
This is done in tevent_common_context_destructor for the non-fresh
fdes already
Signed-off-by: Volker Lendecke <[email protected]>
Reviewed-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit 3ce58cbcf3d9653ee6b0002f52a29ab922beab4e
Author: Volker Lendecke <[email protected]>
Date: Thu Jan 31 16:28:08 2013 +0100
tevent_poll: Use the poll_event_context_destructor always
This is in preparation for the next patch to NULL out the event_ctx
pointers in the poll_ev->fresh list
Signed-off-by: Volker Lendecke <[email protected]>
Reviewed-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit e3309852f717e716181df584716aa17945326565
Author: Volker Lendecke <[email protected]>
Date: Thu Jan 31 16:25:23 2013 +0100
tevent_poll: Re-order routines
Signed-off-by: Volker Lendecke <[email protected]>
Reviewed-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
commit d944e2cae15cf1fc2e7601fecd213dec17e5132a
Author: Volker Lendecke <[email protected]>
Date: Thu Jan 31 14:33:15 2013 +0100
tevent_poll: Fix a crash in the poll backend
If tevent_add_fd is immediately followed by tevent_fd_set_flags, the poll
backend crashes. This was introduced when the poll backend was prepared
for the multi-threaded python extension.
Signed-off-by: Volker Lendecke <[email protected]>
Reviewed-by: Stefan Metzmacher <[email protected]>
Reviewed-by: Jeremy Allison <[email protected]>
-----------------------------------------------------------------------
Summary of changes:
lib/tevent/tevent_poll.c | 133 ++++++++++++++++++++++++++++++++++++----------
1 files changed, 105 insertions(+), 28 deletions(-)
Changeset truncated at 500 lines:
diff --git a/lib/tevent/tevent_poll.c b/lib/tevent/tevent_poll.c
index 44e108f..5479f2f 100644
--- a/lib/tevent/tevent_poll.c
+++ b/lib/tevent/tevent_poll.c
@@ -55,6 +55,36 @@ struct poll_event_context {
int exit_code;
};
+static int poll_event_context_destructor(struct poll_event_context *poll_ev)
+{
+ struct tevent_fd *fd, *fn;
+
+ for (fd = poll_ev->fresh; fd; fd = fn) {
+ fn = fd->next;
+ fd->event_ctx = NULL;
+ DLIST_REMOVE(poll_ev->fresh, fd);
+ }
+
+ if (poll_ev->signal_fd == -1) {
+ /*
+ * Non-threaded, no signal pipe
+ */
+ return 0;
+ }
+
+ close(poll_ev->signal_fd);
+ poll_ev->signal_fd = -1;
+
+ if (poll_ev->num_fds == 0) {
+ return 0;
+ }
+ if (poll_ev->fds[0].fd != -1) {
+ close(poll_ev->fds[0].fd);
+ poll_ev->fds[0].fd = -1;
+ }
+ return 0;
+}
+
/*
create a poll_event_context structure.
*/
@@ -62,6 +92,14 @@ static int poll_event_context_init(struct tevent_context *ev)
{
struct poll_event_context *poll_ev;
+ /*
+ * we might be called during tevent_re_initialise()
+ * which means we need to free our old additional_data
+ * in order to detach old fd events from the
+ * poll_ev->fresh list
+ */
+ TALLOC_FREE(ev->additional_data);
+
poll_ev = talloc_zero(ev, struct poll_event_context);
if (poll_ev == NULL) {
return -1;
@@ -69,22 +107,7 @@ static int poll_event_context_init(struct tevent_context
*ev)
poll_ev->ev = ev;
poll_ev->signal_fd = -1;
ev->additional_data = poll_ev;
- return 0;
-}
-
-static int poll_event_mt_destructor(struct poll_event_context *poll_ev)
-{
- if (poll_ev->signal_fd != -1) {
- close(poll_ev->signal_fd);
- poll_ev->signal_fd = -1;
- }
- if (poll_ev->num_fds == 0) {
- return 0;
- }
- if (poll_ev->fds[0].fd != -1) {
- close(poll_ev->fds[0].fd);
- poll_ev->fds[0].fd = -1;
- }
+ talloc_set_destructor(poll_ev, poll_event_context_destructor);
return 0;
}
@@ -140,7 +163,7 @@ static int poll_event_context_init_mt(struct tevent_context
*ev)
poll_ev->num_fds = 1;
- talloc_set_destructor(poll_ev, poll_event_mt_destructor);
+ talloc_set_destructor(poll_ev, poll_event_context_destructor);
return 0;
}
@@ -203,10 +226,18 @@ done:
static int poll_fresh_fde_destructor(struct tevent_fd *fde)
{
- struct poll_event_context *poll_ev = talloc_get_type_abort(
- fde->event_ctx->additional_data, struct poll_event_context);
+ struct tevent_context *ev = fde->event_ctx;
+ struct poll_event_context *poll_ev;
+
+ if (ev == NULL) {
+ goto done;
+ }
+ poll_ev = talloc_get_type_abort(
+ ev->additional_data, struct poll_event_context);
+
DLIST_REMOVE(poll_ev->fresh, fde);
- return 0;
+done:
+ return tevent_common_fd_destructor(fde);
}
static void poll_event_schedule_immediate(struct tevent_immediate *im,
@@ -256,7 +287,7 @@ static struct tevent_fd *poll_event_add_fd(struct
tevent_context *ev,
fde->private_data = private_data;
fde->handler_name = handler_name;
fde->location = location;
- fde->additional_flags = 0;
+ fde->additional_flags = UINT64_MAX;
fde->additional_data = NULL;
DLIST_ADD(poll_ev->fresh, fde);
@@ -275,10 +306,29 @@ static struct tevent_fd *poll_event_add_fd(struct
tevent_context *ev,
*/
static void poll_event_set_fd_flags(struct tevent_fd *fde, uint16_t flags)
{
- struct poll_event_context *poll_ev = talloc_get_type_abort(
- fde->event_ctx->additional_data, struct poll_event_context);
+ struct tevent_context *ev = fde->event_ctx;
+ struct poll_event_context *poll_ev;
uint64_t idx = fde->additional_flags;
- uint16_t pollflags = 0;
+ uint16_t pollflags;
+
+ if (ev == NULL) {
+ return;
+ }
+ poll_ev = talloc_get_type_abort(
+ ev->additional_data, struct poll_event_context);
+
+ fde->flags = flags;
+
+ if (idx == UINT64_MAX) {
+ /*
+ * poll_event_setup_fresh not yet called after this fde was
+ * added. We don't have to do anything to transfer the changed
+ * flags to the array passed to poll(2)
+ */
+ return;
+ }
+
+ pollflags = 0;
if (flags & TEVENT_FD_READ) {
pollflags |= (POLLIN|POLLHUP);
@@ -286,10 +336,8 @@ static void poll_event_set_fd_flags(struct tevent_fd *fde,
uint16_t flags)
if (flags & TEVENT_FD_WRITE) {
pollflags |= (POLLOUT);
}
-
poll_ev->fds[idx].events = pollflags;
- fde->flags = flags;
poll_event_wake_pollthread(poll_ev);
}
@@ -499,6 +547,35 @@ static int poll_event_loop_once(struct tevent_context *ev,
return poll_event_loop_poll(ev, &tval);
}
+static int poll_event_loop_wait(struct tevent_context *ev,
+ const char *location)
+{
+ struct poll_event_context *poll_ev = talloc_get_type_abort(
+ ev->additional_data, struct poll_event_context);
+
+ /*
+ * loop as long as we have events pending
+ */
+ while (ev->fd_events ||
+ ev->timer_events ||
+ ev->immediate_events ||
+ ev->signal_events ||
+ poll_ev->fresh) {
+ int ret;
+ ret = _tevent_loop_once(ev, location);
+ if (ret != 0) {
+ tevent_debug(ev, TEVENT_DEBUG_FATAL,
+ "_tevent_loop_once() failed: %d - %s\n",
+ ret, strerror(errno));
+ return ret;
+ }
+ }
+
+ tevent_debug(ev, TEVENT_DEBUG_WARNING,
+ "poll_event_loop_wait() out of events\n");
+ return 0;
+}
+
static const struct tevent_ops poll_event_ops = {
.context_init = poll_event_context_init,
.add_fd = poll_event_add_fd,
@@ -509,7 +586,7 @@ static const struct tevent_ops poll_event_ops = {
.schedule_immediate = tevent_common_schedule_immediate,
.add_signal = tevent_common_add_signal,
.loop_once = poll_event_loop_once,
- .loop_wait = tevent_common_loop_wait,
+ .loop_wait = poll_event_loop_wait,
};
_PRIVATE_ bool tevent_poll_init(void)
@@ -527,7 +604,7 @@ static const struct tevent_ops poll_event_mt_ops = {
.schedule_immediate = poll_event_schedule_immediate,
.add_signal = tevent_common_add_signal,
.loop_once = poll_event_loop_once,
- .loop_wait = tevent_common_loop_wait,
+ .loop_wait = poll_event_loop_wait,
};
_PRIVATE_ bool tevent_poll_mt_init(void)
--
Samba Shared Repository