[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Sat Aug 20 11:39:06 UTC 2016


The branch, master has been updated
       via  6910d3a lib: Implement poll_timeout
       via  d9dd026 lib: Remove "num_contexts" from poll_funcs_state
       via  e987e62 lib: Remove "num_watches" from poll_funcs_state
       via  dccd968 lib: Change poll_funcs to take direct timevals
       via  552c7de lib: Fix poll_func_timeout prototypes
      from  a2086e9 lib: Cleanup includes in messages_dgm

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6910d3a4d416ce8631440b8b3023f526bdfb4eb8
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Oct 20 11:39:09 2015 +0200

    lib: Implement poll_timeout
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Sat Aug 20 13:38:37 CEST 2016 on sn-devel-144

commit d9dd026815e96b7def5c8a1097550ca40ba48193
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Oct 20 11:15:38 2015 +0200

    lib: Remove "num_contexts" from poll_funcs_state
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit e987e6212a1b57da2c0ca137dea1f188c55d1b39
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Oct 20 10:43:06 2015 +0200

    lib: Remove "num_watches" from poll_funcs_state
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit dccd96867708e419c9e596a2fc518bd0041ca5c6
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Oct 20 11:40:38 2015 +0200

    lib: Change poll_funcs to take direct timevals
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

commit 552c7de94d6701df565d69cd68d96dfe1e6f4f98
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Oct 19 21:23:13 2015 +0200

    lib: Fix poll_func_timeout prototypes
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Ralph Boehme <slow at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 lib/poll_funcs/poll_funcs.h        |   8 +-
 lib/poll_funcs/poll_funcs_tevent.c | 280 +++++++++++++++++++++++++++++++------
 2 files changed, 245 insertions(+), 43 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/poll_funcs/poll_funcs.h b/lib/poll_funcs/poll_funcs.h
index 6072eb5..b16f07f 100644
--- a/lib/poll_funcs/poll_funcs.h
+++ b/lib/poll_funcs/poll_funcs.h
@@ -92,14 +92,14 @@ struct poll_funcs {
 	 *
 	 * @param[in] funcs The callback array
 	 * @param[in] tv The time when the timeout should trigger
-	 * @param[in] callback Function to call at time "ts"
+	 * @param[in] callback Function to call at time "tv"
 	 * @param[in] private_data Pointer to give back to callback
 	 *
 	 * @return A new poll_timeout struct
 	 */
 
 	struct poll_timeout *(*timeout_new)(
-		const struct poll_funcs *funcs, const struct timeval *tv,
+		const struct poll_funcs *funcs, const struct timeval tv,
 		void (*callback)(struct poll_timeout *t, void *private_data),
 		void *private_data);
 
@@ -107,11 +107,11 @@ struct poll_funcs {
 	 * @brief Change the timeout of a watch
 	 *
 	 * @param[in] t The timeout watch to change
-	 * @param[in] ts The new trigger time
+	 * @param[in] tv The new trigger time
 	 */
 
 	void (*timeout_update)(struct poll_timeout *t,
-			       const struct timespec *ts);
+			       const struct timeval tv);
 
 	/**
 	 * @brief Free a poll_timeout
diff --git a/lib/poll_funcs/poll_funcs_tevent.c b/lib/poll_funcs/poll_funcs_tevent.c
index 8fdf080..3059ebc 100644
--- a/lib/poll_funcs/poll_funcs_tevent.c
+++ b/lib/poll_funcs/poll_funcs_tevent.c
@@ -29,7 +29,7 @@
 
 struct poll_watch {
 	struct poll_funcs_state *state;
-	unsigned slot; 		/* index into state->watches[] */
+	size_t slot; 		/* index into state->watches[] */
 	int fd;
 	int events;
 	void (*callback)(struct poll_watch *w, int fd, short events,
@@ -37,19 +37,30 @@ struct poll_watch {
 	void *private_data;
 };
 
+struct poll_timeout {
+	struct poll_funcs_state *state;
+	size_t slot;		/* index into state->timeouts[] */
+	struct timeval tv;
+	void (*callback)(struct poll_timeout *t, void *private_data);
+	void *private_data;
+};
+
 struct poll_funcs_state {
 	/*
 	 * "watches" is the array of all watches that we have handed out via
 	 * funcs->watch_new(). The "watches" array can contain NULL pointers.
 	 */
-	unsigned num_watches;
 	struct poll_watch **watches;
 
 	/*
+	 * Like "watches" for timeouts;
+	 */
+	struct poll_timeout **timeouts;
+
+	/*
 	 * "contexts is the array of tevent_contexts that serve
 	 * "watches". "contexts" can contain NULL pointers.
 	 */
-	unsigned num_contexts;
 	struct poll_funcs_tevent_context **contexts;
 };
 
@@ -59,6 +70,7 @@ struct poll_funcs_tevent_context {
 	unsigned slot;		/* index into state->contexts[] */
 	struct tevent_context *ev;
 	struct tevent_fd **fdes; /* same indexes as state->watches[] */
+	struct tevent_timer **timers;  /* same indexes as state->timeouts[] */
 };
 
 /*
@@ -102,12 +114,14 @@ static short tevent_to_poll_events(uint16_t flags)
  * Find or create a free slot in state->watches[]
  */
 static bool poll_funcs_watch_find_slot(struct poll_funcs_state *state,
-				       unsigned *slot)
+				       size_t *slot)
 {
 	struct poll_watch **watches;
-	unsigned i;
+	size_t i, num_watches, num_contexts;
 
-	for (i=0; i<state->num_watches; i++) {
+	num_watches = talloc_array_length(state->watches);
+
+	for (i=0; i<num_watches; i++) {
 		if (state->watches[i] == NULL) {
 			*slot = i;
 			return true;
@@ -115,31 +129,35 @@ static bool poll_funcs_watch_find_slot(struct poll_funcs_state *state,
 	}
 
 	watches = talloc_realloc(state, state->watches, struct poll_watch *,
-				 state->num_watches + 1);
+				 num_watches + 1);
 	if (watches == NULL) {
 		return false;
 	}
-	watches[state->num_watches] = NULL;
+	watches[num_watches] = NULL;
 	state->watches = watches;
 
-	for (i=0; i<state->num_contexts; i++) {
+	num_contexts = talloc_array_length(state->contexts);
+
+	for (i=0; i<num_contexts; i++) {
 		struct tevent_fd **fdes;
 		struct poll_funcs_tevent_context *c = state->contexts[i];
 		if (c == NULL) {
 			continue;
 		}
 		fdes = talloc_realloc(c, c->fdes, struct tevent_fd *,
-				      state->num_watches + 1);
+				      num_watches + 1);
 		if (fdes == NULL) {
+			state->watches = talloc_realloc(
+				state, state->watches, struct poll_watch *,
+				num_watches);
 			return false;
 		}
 		c->fdes = fdes;
 
-		fdes[state->num_watches] = NULL;
+		fdes[num_watches] = NULL;
 	}
 
-	*slot = state->num_watches;
-	state->num_watches += 1;
+	*slot = num_watches;
 
 	return true;
 }
@@ -158,7 +176,7 @@ static struct poll_watch *tevent_watch_new(
 	struct poll_funcs_state *state = talloc_get_type_abort(
 		funcs->private_data, struct poll_funcs_state);
 	struct poll_watch *w;
-	unsigned i, slot;
+	size_t i, slot, num_contexts;
 
 	if (!poll_funcs_watch_find_slot(state, &slot)) {
 		return NULL;
@@ -179,7 +197,9 @@ static struct poll_watch *tevent_watch_new(
 
 	talloc_set_destructor(w, poll_watch_destructor);
 
-	for (i=0; i<state->num_contexts; i++) {
+	num_contexts = talloc_array_length(state->contexts);
+
+	for (i=0; i<num_contexts; i++) {
 		struct poll_funcs_tevent_context *c = state->contexts[i];
 		if (c == NULL) {
 			continue;
@@ -200,12 +220,13 @@ fail:
 static int poll_watch_destructor(struct poll_watch *w)
 {
 	struct poll_funcs_state *state = w->state;
-	unsigned slot = w->slot;
-	unsigned i;
+	size_t num_contexts = talloc_array_length(state->contexts);
+	size_t slot = w->slot;
+	size_t i;
 
 	TALLOC_FREE(state->watches[slot]);
 
-	for (i=0; i<state->num_contexts; i++) {
+	for (i=0; i<num_contexts; i++) {
 		struct poll_funcs_tevent_context *c = state->contexts[i];
 		if (c == NULL) {
 			continue;
@@ -219,12 +240,13 @@ static int poll_watch_destructor(struct poll_watch *w)
 static void tevent_watch_update(struct poll_watch *w, short events)
 {
 	struct poll_funcs_state *state = w->state;
-	unsigned slot = w->slot;
-	unsigned i;
+	size_t num_contexts = talloc_array_length(state->contexts);
+	size_t slot = w->slot;
+	size_t i;
 
 	w->events = poll_events_to_tevent(events);
 
-	for (i=0; i<state->num_contexts; i++) {
+	for (i=0; i<num_contexts; i++) {
 		struct poll_funcs_tevent_context *c = state->contexts[i];
 		if (c == NULL) {
 			continue;
@@ -243,24 +265,181 @@ static void tevent_watch_free(struct poll_watch *w)
 	TALLOC_FREE(w);
 }
 
+static bool poll_funcs_timeout_find_slot(struct poll_funcs_state *state,
+					 size_t *slot)
+{
+	struct poll_timeout **timeouts;
+	size_t i, num_timeouts, num_contexts;
+
+	num_timeouts = talloc_array_length(state->timeouts);
+
+	for (i=0; i<num_timeouts; i++) {
+		if (state->timeouts[i] == NULL) {
+			*slot = i;
+			return true;
+		}
+	}
+
+	timeouts = talloc_realloc(state, state->timeouts,
+				  struct poll_timeout *,
+				  num_timeouts + 1);
+	if (timeouts == NULL) {
+		return false;
+	}
+	timeouts[num_timeouts] = NULL;
+	state->timeouts = timeouts;
+
+	num_contexts = talloc_array_length(state->contexts);
+
+	for (i=0; i<num_contexts; i++) {
+		struct tevent_timer **timers;
+		struct poll_funcs_tevent_context *c = state->contexts[i];
+		if (c == NULL) {
+			continue;
+		}
+		timers = talloc_realloc(c, c->timers, struct tevent_timer *,
+					num_timeouts + 1);
+		if (timers == NULL) {
+			state->timeouts = talloc_realloc(
+				state, state->timeouts, struct poll_timeout *,
+				num_timeouts);
+			return false;
+		}
+		c->timers = timers;
+
+		timers[num_timeouts] = NULL;
+	}
+
+	*slot = num_timeouts;
+
+	return true;
+}
+
+static void poll_funcs_timer_handler(struct tevent_context *ev,
+				     struct tevent_timer *te,
+				     struct timeval current_time,
+				     void *private_data);
+static int poll_timeout_destructor(struct poll_timeout *t);
+
 static struct poll_timeout *tevent_timeout_new(
-	const struct poll_funcs *funcs, const struct timeval *tv,
+	const struct poll_funcs *funcs, const struct timeval tv,
 	void (*callback)(struct poll_timeout *t, void *private_data),
 	void *private_data)
 {
-	/* not implemented yet */
+	struct poll_funcs_state *state = talloc_get_type_abort(
+		funcs->private_data, struct poll_funcs_state);
+	struct poll_timeout *t;
+	size_t i, slot, num_contexts;
+
+	if (!poll_funcs_timeout_find_slot(state, &slot)) {
+		return NULL;
+	}
+
+	t = talloc(state->timeouts, struct poll_timeout);
+	if (t == NULL) {
+		return NULL;
+	}
+	t->state = state;
+	t->slot = slot;
+	t->tv = tv;
+	t->callback = callback;
+	t->private_data = private_data;
+
+	talloc_set_destructor(t, poll_timeout_destructor);
+
+	num_contexts = talloc_array_length(state->contexts);
+
+	for (i=0; i<num_contexts; i++) {
+		struct poll_funcs_tevent_context *c = state->contexts[i];
+		if (c == NULL) {
+			continue;
+		}
+		c->timers[slot] = tevent_add_timer(
+			c->ev, c->timers, tv, poll_funcs_timer_handler, t);
+		if (c->timers[slot] == NULL) {
+			goto fail;
+		}
+	}
+	return t;
+
+fail:
+	TALLOC_FREE(t);
 	return NULL;
 }
 
+static int poll_timeout_destructor(struct poll_timeout *t)
+{
+	struct poll_funcs_state *state = t->state;
+	size_t num_contexts = talloc_array_length(state->contexts);
+	size_t slot = t->slot;
+	size_t i;
+
+	TALLOC_FREE(state->timeouts[slot]);
+
+	for (i=0; i<num_contexts; i++) {
+		struct poll_funcs_tevent_context *c = state->contexts[i];
+		if (c == NULL) {
+			continue;
+		}
+		TALLOC_FREE(c->timers[slot]);
+	}
+
+	return 0;
+}
+
+static void poll_funcs_timer_handler(struct tevent_context *ev,
+				     struct tevent_timer *te,
+				     struct timeval current_time,
+				     void *private_data)
+{
+	struct poll_timeout *t = talloc_get_type_abort(
+		private_data, struct poll_timeout);
+	struct poll_funcs_state *state = t->state;
+	size_t slot = t->slot;
+	size_t i, num_contexts;
+
+	num_contexts = talloc_array_length(state->contexts);
+
+	for (i=0; i<num_contexts; i++) {
+		struct poll_funcs_tevent_context *c = state->contexts[i];
+		if (c == NULL) {
+			continue;
+		}
+		TALLOC_FREE(c->timers[slot]);
+	}
+
+	t->callback(t, t->private_data);
+}
+
 static void tevent_timeout_update(struct poll_timeout *t,
-				  const struct timespec *ts)
+				  const struct timeval tv)
 {
-	return;
+	struct poll_funcs_state *state = t->state;
+	size_t num_contexts = talloc_array_length(state->contexts);
+	size_t slot = t->slot;
+	size_t i;
+
+	for (i=0; i<num_contexts; i++) {
+		struct poll_funcs_tevent_context *c = state->contexts[i];
+		if (c == NULL) {
+			continue;
+		}
+		TALLOC_FREE(c->timers[slot]);
+
+		c->timers[slot] = tevent_add_timer(
+			c->ev, c->timers, tv, poll_funcs_timer_handler, t);
+		if (c->timers[slot] == NULL) {
+			/*
+			 * We just free'ed the space, why did this fail??
+			 */
+			abort();
+		}
+	}
 }
 
 static void tevent_timeout_free(struct poll_timeout *t)
 {
-	return;
+	TALLOC_FREE(t);
 }
 
 static int poll_funcs_state_destructor(struct poll_funcs_state *state);
@@ -294,12 +473,13 @@ struct poll_funcs *poll_funcs_init_tevent(TALLOC_CTX *mem_ctx)
 
 static int poll_funcs_state_destructor(struct poll_funcs_state *state)
 {
-	unsigned i;
+	size_t num_watches = talloc_array_length(state->watches);
+	size_t i;
 	/*
 	 * Make sure the watches are cleared before the contexts. The watches
 	 * have destructors attached to them that clean up the fde's
 	 */
-	for (i=0; i<state->num_watches; i++) {
+	for (i=0; i<num_watches; i++) {
 		TALLOC_FREE(state->watches[i]);
 	}
 	return 0;
@@ -310,12 +490,13 @@ static int poll_funcs_state_destructor(struct poll_funcs_state *state)
  */
 static bool poll_funcs_context_slot_find(struct poll_funcs_state *state,
 					 struct tevent_context *ev,
-					 unsigned *slot)
+					 size_t *slot)
 {
 	struct poll_funcs_tevent_context **contexts;
-	unsigned i;
+	size_t num_contexts = talloc_array_length(state->contexts);
+	size_t i;
 
-	for (i=0; i<state->num_contexts; i++) {
+	for (i=0; i<num_contexts; i++) {
 		struct poll_funcs_tevent_context *ctx = state->contexts[i];
 
 		if ((ctx == NULL) || (ctx->ev == ev)) {
@@ -326,15 +507,14 @@ static bool poll_funcs_context_slot_find(struct poll_funcs_state *state,
 
 	contexts = talloc_realloc(state, state->contexts,
 				  struct poll_funcs_tevent_context *,
-				  state->num_contexts + 1);
+				  num_contexts + 1);
 	if (contexts == NULL) {
 		return false;
 	}
 	state->contexts = contexts;
-	state->contexts[state->num_contexts] = NULL;
+	state->contexts[num_contexts] = NULL;
 
-	*slot = state->num_contexts;
-	state->num_contexts += 1;
+	*slot = num_contexts;
 
 	return true;
 }
@@ -347,7 +527,9 @@ static struct poll_funcs_tevent_context *poll_funcs_tevent_context_new(
 	struct tevent_context *ev, unsigned slot)
 {
 	struct poll_funcs_tevent_context *ctx;
-	unsigned i;
+	size_t num_watches = talloc_array_length(state->watches);
+	size_t num_timeouts = talloc_array_length(state->timeouts);
+	size_t i;
 
 	ctx = talloc(mem_ctx, struct poll_funcs_tevent_context);
 	if (ctx == NULL) {
@@ -359,12 +541,12 @@ static struct poll_funcs_tevent_context *poll_funcs_tevent_context_new(
 	ctx->ev = ev;
 	ctx->slot = slot;
 
-	ctx->fdes = talloc_array(ctx, struct tevent_fd *, state->num_watches);
+	ctx->fdes = talloc_array(ctx, struct tevent_fd *, num_watches);
 	if (ctx->fdes == NULL) {
 		goto fail;
 	}
 
-	for (i=0; i<state->num_watches; i++) {
+	for (i=0; i<num_watches; i++) {
 		struct poll_watch *w = state->watches[i];
 
 		if (w == NULL) {
@@ -377,6 +559,26 @@ static struct poll_funcs_tevent_context *poll_funcs_tevent_context_new(
 			goto fail;
 		}
 	}
+
+	ctx->timers = talloc_array(ctx, struct tevent_timer *, num_timeouts);
+	if (ctx->timers == NULL) {
+		goto fail;
+	}
+
+	for (i=0; i<num_timeouts; i++) {
+		struct poll_timeout *t = state->timeouts[i];
+
+		if (t == NULL) {
+			ctx->timers[i] = NULL;
+			continue;
+		}
+		ctx->timers[i] = tevent_add_timer(ctx->ev, ctx->timers, t->tv,
+						  poll_funcs_timer_handler, t);
+		if (ctx->timers[i] == 0) {
+			goto fail;
+		}
+	}
+
 	talloc_set_destructor(ctx, poll_funcs_tevent_context_destructor);
 	return ctx;
 fail:
@@ -417,7 +619,7 @@ void *poll_funcs_tevent_register(TALLOC_CTX *mem_ctx, struct poll_funcs *f,
 	struct poll_funcs_state *state = talloc_get_type_abort(
 		f->private_data, struct poll_funcs_state);
 	struct poll_funcs_tevent_handle *handle;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list