diff options
author | Matt Caswell <matt@openssl.org> | 2015-07-24 09:15:31 +0200 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2015-11-21 00:33:46 +0100 |
commit | f4da39d200a8c2068595b8d5bd5efb78af4224e1 (patch) | |
tree | eb329d8d472063fc60ba93c76a83af7d3217b602 /crypto | |
parent | Add ASYNC_JOB pools (diff) | |
download | openssl-f4da39d200a8c2068595b8d5bd5efb78af4224e1.tar.xz openssl-f4da39d200a8c2068595b8d5bd5efb78af4224e1.zip |
Initial Async notify code changes
Initial API implemented for notifying applications that an ASYNC_JOB
has completed. Currently only s_server is using this. The Dummy Async
engine "cheats" in that it notifies that it has completed *before* it
pauses the job. A normal async engine would not do that.
Only the posix version of this has been implemented so far, so it will
probably fail to compile on Windows at the moment.
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/async/arch/async_posix.c | 26 | ||||
-rw-r--r-- | crypto/async/arch/async_posix.h | 5 | ||||
-rw-r--r-- | crypto/async/async.c | 43 | ||||
-rw-r--r-- | crypto/async/async_locl.h | 3 |
4 files changed, 77 insertions, 0 deletions
diff --git a/crypto/async/arch/async_posix.c b/crypto/async/arch/async_posix.c index bb799e54f8..8474ea4ba1 100644 --- a/crypto/async/arch/async_posix.c +++ b/crypto/async/arch/async_posix.c @@ -57,6 +57,7 @@ #ifdef ASYNC_SYSV # include <stddef.h> # include <ucontext.h> +# include <unistd.h> # include <openssl/crypto.h> # include <openssl/async.h> @@ -85,4 +86,29 @@ void ASYNC_FIBRE_free(ASYNC_FIBRE *fibre) if (fibre->fibre.uc_stack.ss_sp) OPENSSL_free(fibre->fibre.uc_stack.ss_sp); } + +int async_pipe(int *pipefds) +{ + if (pipe(pipefds) == 0) + return 1; + + return 0; +} + +int async_write1(int fd, const void *buf) +{ + if (write(fd, buf, 1) > 0) + return 1; + + return 0; +} + +int async_read1(int fd, void *buf) +{ + if (read(fd, buf, 1) > 0) + return 1; + + return 0; +} + #endif diff --git a/crypto/async/arch/async_posix.h b/crypto/async/arch/async_posix.h index 43cea6d9b0..7b8e905bec 100644 --- a/crypto/async/arch/async_posix.h +++ b/crypto/async/arch/async_posix.h @@ -99,5 +99,10 @@ static inline int ASYNC_FIBRE_swapcontext(ASYNC_FIBRE *o, ASYNC_FIBRE *n, int r) int ASYNC_FIBRE_init(ASYNC_FIBRE *fibre); void ASYNC_FIBRE_free(ASYNC_FIBRE *fibre); +int async_pipe(int *pipefds); +int async_write1(int fd, const void *buf); +int async_read1(int fd, void *buf); + + # endif #endif diff --git a/crypto/async/async.c b/crypto/async/async.c index 6fed1979f9..bf026ee9aa 100644 --- a/crypto/async/async.c +++ b/crypto/async/async.c @@ -106,11 +106,21 @@ static int ASYNC_CTX_free(void) static ASYNC_JOB *ASYNC_JOB_new(void) { ASYNC_JOB *job = NULL; + int pipefds[2]; if(!(job = OPENSSL_malloc(sizeof (ASYNC_JOB)))) { return NULL; } + if(!async_pipe(pipefds)) { + OPENSSL_free(job); + return NULL; + } + + job->wake_set = 0; + job->wait_fd = pipefds[0]; + job->wake_fd = pipefds[1]; + job->status = ASYNC_JOB_RUNNING; job->funcargs = NULL; @@ -335,3 +345,36 @@ void ASYNC_free_pool(void) } while (job); sk_ASYNC_JOB_free(pool); } + +ASYNC_JOB *ASYNC_get_current_job(void) +{ + ASYNC_CTX *ctx; + if((ctx = ASYNC_get_ctx()) == NULL) + return NULL; + + return ctx->currjob; +} + +int ASYNC_get_wait_fd(ASYNC_JOB *job) +{ + return job->wait_fd; +} + +void ASYNC_wake(ASYNC_JOB *job) +{ + char dummy = 0; + + if (job->wake_set) + return; + async_write1(job->wake_fd, &dummy); + job->wake_set = 1; +} + +void ASYNC_clear_wake(ASYNC_JOB *job) +{ + char dummy = 0; + if (!job->wake_set) + return; + async_read1(job->wait_fd, &dummy); + job->wake_set = 0; +} diff --git a/crypto/async/async_locl.h b/crypto/async/async_locl.h index 4a6cb3e2c5..56480c8b0e 100644 --- a/crypto/async/async_locl.h +++ b/crypto/async/async_locl.h @@ -70,6 +70,9 @@ struct async_job_st { void *funcargs; int ret; int status; + int wake_set; + int wait_fd; + int wake_fd; }; void ASYNC_start_func(void); |