From 8e44c2f96397a4f8cf945bcc810e3a1776d86a08 Mon Sep 17 00:00:00 2001 From: Gregor Beck Date: Thu, 19 Sep 2013 15:14:25 +0200 Subject: tevent: add tevent_queue_wait_send/recv() Pair-Programmed-With: Stefan Metzmacher Signed-off-by: Gregor Beck Signed-off-by: Stefan Metzmacher Reviewed-by: Stefan Metzmacher Reviewed-by: Volker Lendecke --- lib/tevent/tevent.h | 33 ++++++++++++++++++++++++++++++ lib/tevent/tevent_queue.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) (limited to 'lib/tevent') diff --git a/lib/tevent/tevent.h b/lib/tevent/tevent.h index 2bc4e2d7ad7..0705ff30bd4 100644 --- a/lib/tevent/tevent.h +++ b/lib/tevent/tevent.h @@ -1592,6 +1592,39 @@ size_t tevent_queue_length(struct tevent_queue *queue); */ bool tevent_queue_running(struct tevent_queue *queue); +/** + * @brief Create a tevent subrequest that waits in a tevent_queue + * + * The idea is that always the same syntax for tevent requests. + * + * @param[in] mem_ctx The talloc memory context to use. + * + * @param[in] ev The event handle to setup the request. + * + * @param[in] queue The queue to wait in. + * + * @return The new subrequest, NULL on error. + * + * @see tevent_queue_wait_recv() + */ +struct tevent_req *tevent_queue_wait_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct tevent_queue *queue); + +/** + * @brief Check if we no longer need to wait in the queue. + * + * This function needs to be called in the callback function set after calling + * tevent_queue_wait_send(). + * + * @param[in] req The tevent request to check. + * + * @return True on success, false otherwise. + * + * @see tevent_queue_wait_send() + */ +bool tevent_queue_wait_recv(struct tevent_req *req); + typedef int (*tevent_nesting_hook)(struct tevent_context *ev, void *private_data, uint32_t level, diff --git a/lib/tevent/tevent_queue.c b/lib/tevent/tevent_queue.c index 4750675802f..361fc7bc2e3 100644 --- a/lib/tevent/tevent_queue.c +++ b/lib/tevent/tevent_queue.c @@ -298,3 +298,55 @@ bool tevent_queue_running(struct tevent_queue *queue) { return queue->running; } + +struct tevent_queue_wait_state { + uint8_t dummy; +}; + +static void tevent_queue_wait_trigger(struct tevent_req *req, + void *private_data); + +struct tevent_req *tevent_queue_wait_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct tevent_queue *queue) +{ + struct tevent_req *req; + struct tevent_queue_wait_state *state; + bool ok; + + req = tevent_req_create(mem_ctx, &state, + struct tevent_queue_wait_state); + if (req == NULL) { + return NULL; + } + + ok = tevent_queue_add(queue, ev, req, + tevent_queue_wait_trigger, + NULL); + if (!ok) { + tevent_req_nomem(NULL, req); + return tevent_req_post(req, ev); + } + + return req; +} + +static void tevent_queue_wait_trigger(struct tevent_req *req, + void *private_data) +{ + tevent_req_done(req); +} + +bool tevent_queue_wait_recv(struct tevent_req *req) +{ + enum tevent_req_state state; + uint64_t err; + + if (tevent_req_is_error(req, &state, &err)) { + tevent_req_received(req); + return false; + } + + tevent_req_received(req); + return true; +} -- cgit