diff options
Diffstat (limited to 'ctdb/lib/tevent/tevent_req.c')
-rw-r--r-- | ctdb/lib/tevent/tevent_req.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/ctdb/lib/tevent/tevent_req.c b/ctdb/lib/tevent/tevent_req.c index b0c9c57dde..d8d0c5f564 100644 --- a/ctdb/lib/tevent/tevent_req.c +++ b/ctdb/lib/tevent/tevent_req.c @@ -74,6 +74,7 @@ struct tevent_req *_tevent_req_create(TALLOC_CTX *mem_ctx, talloc_free(req); return NULL; } + req->internal.defer_callback_ev = NULL; data = talloc_zero_size(req, data_size); if (data == NULL) { @@ -91,6 +92,11 @@ struct tevent_req *_tevent_req_create(TALLOC_CTX *mem_ctx, void _tevent_req_notify_callback(struct tevent_req *req, const char *location) { req->internal.finish_location = location; + if (req->internal.defer_callback_ev) { + (void)tevent_req_post(req, req->internal.defer_callback_ev); + req->internal.defer_callback_ev = NULL; + return; + } if (req->async.fn != NULL) { req->async.fn(req); } @@ -123,6 +129,11 @@ bool _tevent_req_error(struct tevent_req *req, return true; } +void _tevent_req_oom(struct tevent_req *req, const char *location) +{ + tevent_req_finish(req, TEVENT_REQ_NO_MEMORY, location); +} + bool _tevent_req_nomem(const void *p, struct tevent_req *req, const char *location) @@ -130,7 +141,7 @@ bool _tevent_req_nomem(const void *p, if (p != NULL) { return false; } - tevent_req_finish(req, TEVENT_REQ_NO_MEMORY, location); + _tevent_req_oom(req, location); return true; } @@ -164,6 +175,12 @@ struct tevent_req *tevent_req_post(struct tevent_req *req, return req; } +void tevent_req_defer_callback(struct tevent_req *req, + struct tevent_context *ev) +{ + req->internal.defer_callback_ev = ev; +} + bool tevent_req_is_in_progress(struct tevent_req *req) { if (req->internal.state == TEVENT_REQ_IN_PROGRESS) { |