From 45e4be0d96abdc729252df1e97bb9a56302e5a4a Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 15 Aug 2009 09:46:23 +0200 Subject: tevent: add tevent_req_cancel() infrastructure This offers a generic way for callers to cancel an async request. metze --- lib/tevent/tevent_req.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'lib/tevent/tevent_req.c') diff --git a/lib/tevent/tevent_req.c b/lib/tevent/tevent_req.c index c6b11601dc..345a2fdcd1 100644 --- a/lib/tevent/tevent_req.c +++ b/lib/tevent/tevent_req.c @@ -398,3 +398,46 @@ void tevent_req_set_print_fn(struct tevent_req *req, tevent_req_print_fn fn) { req->private_print = fn; } + +/** + * @brief This function sets a cancel function for the given request + * @param[in] req The given request + * @param[in] fn A pointer to the cancel function + * + * This function can be used to setup a cancel function for the given request. + * This will be triggered if the tevent_req_cancel() function was + * called on the given request. + * + */ +void tevent_req_set_cancel_fn(struct tevent_req *req, tevent_req_cancel_fn fn) +{ + req->private_cancel = fn; +} + +/** + * @brief This function tries to cancel the given request + * @param[in] req The given request + * @param[in] location Automaticly filled with the __location__ macro + * via the tevent_req_cancel() macro. This is for debugging + * only! + * @retval This function returns true is the request is cancelable. + * Otherwise false is returned. + * + * This function can be used to cancel the given request. + * + * It is only possible to cancel a request when the implementation + * has registered a cancel function via the tevent_req_set_cancel_fn(). + * + * Note: Even if the function returns true, the caller need to wait + * for the function to complete normally. + * Only the _recv() function of the given request indicates + * if the request was really canceled. + */ +bool _tevent_req_cancel(struct tevent_req *req, const char *location) +{ + if (req->private_cancel == NULL) { + return false; + } + + return req->private_cancel(req); +} -- cgit