mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
tevent: add tevent_queue_wait_send/recv()
Pair-Programmed-With: Stefan Metzmacher <metze@samba.org> Signed-off-by: Gregor Beck <gbeck@sernet.de> Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Volker Lendecke <vl@samba.org>
This commit is contained in:
parent
7a97d4c4c3
commit
8e44c2f963
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user