From 9f5a87fd665cb597fa1c1f4eef882d2d2f833e61 Mon Sep 17 00:00:00 2001 From: Ping Yu Date: Mon, 5 Nov 2018 15:41:01 -0500 Subject: add an additional async notification communication method based on callback Reviewed-by: Matt Caswell Reviewed-by: Paul Yang Signed-off-by: Ping Yu Signed-off-by: Steven Linsell (Merged from https://github.com/openssl/openssl/pull/7573) --- engines/e_dasync.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'engines') diff --git a/engines/e_dasync.c b/engines/e_dasync.c index 2e124114f9..3d80610b67 100644 --- a/engines/e_dasync.c +++ b/engines/e_dasync.c @@ -403,6 +403,8 @@ static void wait_cleanup(ASYNC_WAIT_CTX *ctx, const void *key, static void dummy_pause_job(void) { ASYNC_JOB *job; ASYNC_WAIT_CTX *waitctx; + ASYNC_callback_fn callback; + void * callback_arg; OSSL_ASYNC_FD pipefds[2] = {0, 0}; OSSL_ASYNC_FD *writefd; #if defined(ASYNC_WIN) @@ -417,6 +419,18 @@ static void dummy_pause_job(void) { waitctx = ASYNC_get_wait_ctx(job); + if (ASYNC_WAIT_CTX_get_callback(waitctx, &callback, &callback_arg) && callback != NULL) { + /* + * In the Dummy async engine we are cheating. We call the callback that the job + * is complete before the call to ASYNC_pause_job(). A real + * async engine would only call the callback when the job was actually complete + */ + (*callback)(callback_arg); + ASYNC_pause_job(); + return; + } + + if (ASYNC_WAIT_CTX_get_fd(waitctx, engine_dasync_id, &pipefds[0], (void **)&writefd)) { pipefds[1] = *writefd; -- cgit v1.2.3