diff options
Diffstat (limited to 'crypto/async')
-rw-r--r-- | crypto/async/arch/async_null.c | 5 | ||||
-rw-r--r-- | crypto/async/arch/async_null.h | 2 | ||||
-rw-r--r-- | crypto/async/arch/async_posix.c | 8 | ||||
-rw-r--r-- | crypto/async/arch/async_posix.h | 2 | ||||
-rw-r--r-- | crypto/async/arch/async_win.c | 42 | ||||
-rw-r--r-- | crypto/async/arch/async_win.h | 2 | ||||
-rw-r--r-- | crypto/async/async.c | 119 | ||||
-rw-r--r-- | crypto/async/async_locl.h | 3 |
8 files changed, 75 insertions, 108 deletions
diff --git a/crypto/async/arch/async_null.c b/crypto/async/arch/async_null.c index d3f686f..2b1d28e 100644 --- a/crypto/async/arch/async_null.c +++ b/crypto/async/arch/async_null.c @@ -80,11 +80,6 @@ int async_global_init(void) return 0; } -int async_local_init(void) -{ - return 0; -} - void async_local_cleanup(void) { } diff --git a/crypto/async/arch/async_null.h b/crypto/async/arch/async_null.h index 93887ae..4cd0a8b 100644 --- a/crypto/async/arch/async_null.h +++ b/crypto/async/arch/async_null.h @@ -66,7 +66,7 @@ typedef struct async_fibre_st { # define async_set_ctx(nctx) 0 -# define async_get_ctx() ((async_ctx *)NULL) +# define async_arch_get_ctx() ((async_ctx *)NULL) # define async_fibre_swapcontext(o,n,r) 0 # define async_fibre_makecontext(c) 0 # define async_fibre_free(f) diff --git a/crypto/async/arch/async_posix.c b/crypto/async/arch/async_posix.c index 1df77cc..57cce7b 100644 --- a/crypto/async/arch/async_posix.c +++ b/crypto/async/arch/async_posix.c @@ -72,14 +72,6 @@ int async_global_init(void) return 1; } -int async_local_init(void) -{ - if (!async_set_ctx(NULL) || ! async_set_pool(NULL)) - return 0; - - return 1; -} - void async_local_cleanup(void) { } diff --git a/crypto/async/arch/async_posix.h b/crypto/async/arch/async_posix.h index 85d033f..7f1bdd1 100644 --- a/crypto/async/arch/async_posix.h +++ b/crypto/async/arch/async_posix.h @@ -78,7 +78,7 @@ typedef struct async_fibre_st { } async_fibre; # define async_set_ctx(nctx) (pthread_setspecific(posixctx , (nctx)) == 0) -# define async_get_ctx() ((async_ctx *)pthread_getspecific(posixctx)) +# define async_arch_get_ctx() ((async_ctx *)pthread_getspecific(posixctx)) # define async_set_pool(p) (pthread_setspecific(posixpool , (p)) == 0) # define async_get_pool() ((async_pool *)pthread_getspecific(posixpool)) diff --git a/crypto/async/arch/async_win.c b/crypto/async/arch/async_win.c index f3de79a..3f3a005 100644 --- a/crypto/async/arch/async_win.c +++ b/crypto/async/arch/async_win.c @@ -66,7 +66,6 @@ struct winpool { static DWORD asyncwinpool = 0; static DWORD asyncwinctx = 0; -static DWORD asyncwindispatch = 0; void async_start_func(void); @@ -75,33 +74,22 @@ int async_global_init(void) { asyncwinpool = TlsAlloc(); asyncwinctx = TlsAlloc(); - asyncwindispatch = TlsAlloc(); - if (asyncwinpool == TLS_OUT_OF_INDEXES || asyncwinctx == TLS_OUT_OF_INDEXES - || asyncwindispatch == TLS_OUT_OF_INDEXES) { + if (asyncwinpool == TLS_OUT_OF_INDEXES + || asyncwinctx == TLS_OUT_OF_INDEXES) { if (asyncwinpool != TLS_OUT_OF_INDEXES) { TlsFree(asyncwinpool); } if (asyncwinctx != TLS_OUT_OF_INDEXES) { TlsFree(asyncwinctx); } - if (asyncwindispatch != TLS_OUT_OF_INDEXES) { - TlsFree(asyncwindispatch); - } return 0; } return 1; } -int async_local_init(void) -{ - return (TlsSetValue(asyncwinpool, NULL) != 0) - && (TlsSetValue(asyncwinctx, NULL) != 0) - && (TlsSetValue(asyncwindispatch, NULL) != 0); -} - void async_local_cleanup(void) { - async_ctx *ctx = async_get_ctx(); + async_ctx *ctx = async_arch_get_ctx(); if (ctx != NULL) { async_fibre *fibre = &ctx->dispatcher; if(fibre != NULL && fibre->fibre != NULL && fibre->converted) { @@ -115,32 +103,24 @@ void async_global_cleanup(void) { TlsFree(asyncwinpool); TlsFree(asyncwinctx); - TlsFree(asyncwindispatch); asyncwinpool = 0; asyncwinctx = 0; - asyncwindispatch = 0; } int async_fibre_init_dispatcher(async_fibre *fibre) { LPVOID dispatcher; - dispatcher = (LPVOID)TlsGetValue(asyncwindispatch); - if (dispatcher == NULL) { - fibre->fibre = ConvertThreadToFiber(NULL); - if (fibre->fibre == NULL) { - fibre->converted = 0; - fibre->fibre = GetCurrentFiber(); - if (fibre->fibre == NULL) - return 0; - } else { - fibre->converted = 1; - } - if (TlsSetValue(asyncwindispatch, (LPVOID)fibre->fibre) == 0) + fibre->fibre = ConvertThreadToFiber(NULL); + if (fibre->fibre == NULL) { + fibre->converted = 0; + fibre->fibre = GetCurrentFiber(); + if (fibre->fibre == NULL) return 0; } else { - fibre->fibre = dispatcher; + fibre->converted = 1; } + return 1; } @@ -196,7 +176,7 @@ int async_set_pool(async_pool *pool) return TlsSetValue(asyncwinpool, (LPVOID)pool) != 0; } -async_ctx *async_get_ctx(void) +async_ctx *async_arch_get_ctx(void) { return (async_ctx *)TlsGetValue(asyncwinctx); } diff --git a/crypto/async/arch/async_win.h b/crypto/async/arch/async_win.h index fa345cb..87e30a4 100644 --- a/crypto/async/arch/async_win.h +++ b/crypto/async/arch/async_win.h @@ -73,7 +73,7 @@ typedef struct async_fibre_st { ((c)->fibre = CreateFiber(0, async_start_func_win, 0)) # define async_fibre_free(f) (DeleteFiber((f)->fibre)) -async_ctx *async_get_ctx(void); +async_ctx *async_arch_get_ctx(void); int async_set_ctx(async_ctx *ctx); int async_fibre_init_dispatcher(async_fibre *fibre); diff --git a/crypto/async/async.c b/crypto/async/async.c index 9d68a7c..024aaf6 100644 --- a/crypto/async/async.c +++ b/crypto/async/async.c @@ -62,6 +62,7 @@ #include "async_locl.h" #include <openssl/err.h> +#include <internal/cryptlib_int.h> #include <string.h> #define ASYNC_JOB_RUNNING 0 @@ -94,6 +95,12 @@ err: return NULL; } +static async_ctx *async_get_ctx(void) +{ + OPENSSL_INIT_crypto_library_start(OPENSSL_INIT_ASYNC, NULL); + return async_arch_get_ctx(); +} + static int async_ctx_free(void) { async_ctx *ctx; @@ -191,16 +198,17 @@ static void async_release_job(ASYNC_JOB *job) { void async_start_func(void) { ASYNC_JOB *job; + async_ctx *ctx = async_get_ctx(); while (1) { /* Run the job */ - job = async_get_ctx()->currjob; + job = ctx->currjob; job->ret = job->func(job->funcargs); /* Stop the job */ job->status = ASYNC_JOB_STOPPING; if (!async_fibre_swapcontext(&job->fibrectx, - &async_get_ctx()->dispatcher, 1)) { + &ctx->dispatcher, 1)) { /* * Should not happen. Getting here will close the thread...can't do * much about it @@ -213,36 +221,39 @@ void async_start_func(void) int ASYNC_start_job(ASYNC_JOB **job, int *ret, int (*func)(void *), void *args, size_t size) { - if (async_get_ctx() == NULL && async_ctx_new() == NULL) { + async_ctx *ctx = async_get_ctx(); + if (ctx == NULL) + ctx = async_ctx_new(); + if (ctx == NULL) { return ASYNC_ERR; } if (*job) { - async_get_ctx()->currjob = *job; + ctx->currjob = *job; } for (;;) { - if (async_get_ctx()->currjob != NULL) { - if (async_get_ctx()->currjob->status == ASYNC_JOB_STOPPING) { - *ret = async_get_ctx()->currjob->ret; - async_release_job(async_get_ctx()->currjob); - async_get_ctx()->currjob = NULL; + if (ctx->currjob != NULL) { + if (ctx->currjob->status == ASYNC_JOB_STOPPING) { + *ret = ctx->currjob->ret; + async_release_job(ctx->currjob); + ctx->currjob = NULL; *job = NULL; return ASYNC_FINISH; } - if (async_get_ctx()->currjob->status == ASYNC_JOB_PAUSING) { - *job = async_get_ctx()->currjob; - async_get_ctx()->currjob->status = ASYNC_JOB_PAUSED; - async_get_ctx()->currjob = NULL; + if (ctx->currjob->status == ASYNC_JOB_PAUSING) { + *job = ctx->currjob; + ctx->currjob->status = ASYNC_JOB_PAUSED; + ctx->currjob = NULL; return ASYNC_PAUSE; } - if (async_get_ctx()->currjob->status == ASYNC_JOB_PAUSED) { - async_get_ctx()->currjob = *job; + if (ctx->currjob->status == ASYNC_JOB_PAUSED) { + ctx->currjob = *job; /* Resume previous job */ - if (!async_fibre_swapcontext(&async_get_ctx()->dispatcher, - &async_get_ctx()->currjob->fibrectx, 1)) { + if (!async_fibre_swapcontext(&ctx->dispatcher, + &ctx->currjob->fibrectx, 1)) { ASYNCerr(ASYNC_F_ASYNC_START_JOB, ASYNC_R_FAILED_TO_SWAP_CONTEXT); goto err; @@ -252,41 +263,41 @@ int ASYNC_start_job(ASYNC_JOB **job, int *ret, int (*func)(void *), /* Should not happen */ ASYNCerr(ASYNC_F_ASYNC_START_JOB, ERR_R_INTERNAL_ERROR); - async_release_job(async_get_ctx()->currjob); - async_get_ctx()->currjob = NULL; + async_release_job(ctx->currjob); + ctx->currjob = NULL; *job = NULL; return ASYNC_ERR; } /* Start a new job */ - if ((async_get_ctx()->currjob = async_get_pool_job()) == NULL) { + if ((ctx->currjob = async_get_pool_job()) == NULL) { return ASYNC_NO_JOBS; } if (args != NULL) { - async_get_ctx()->currjob->funcargs = OPENSSL_malloc(size); - if (async_get_ctx()->currjob->funcargs == NULL) { + ctx->currjob->funcargs = OPENSSL_malloc(size); + if (ctx->currjob->funcargs == NULL) { ASYNCerr(ASYNC_F_ASYNC_START_JOB, ERR_R_MALLOC_FAILURE); - async_release_job(async_get_ctx()->currjob); - async_get_ctx()->currjob = NULL; + async_release_job(ctx->currjob); + ctx->currjob = NULL; return ASYNC_ERR; } - memcpy(async_get_ctx()->currjob->funcargs, args, size); + memcpy(ctx->currjob->funcargs, args, size); } else { - async_get_ctx()->currjob->funcargs = NULL; + ctx->currjob->funcargs = NULL; } - async_get_ctx()->currjob->func = func; - if (!async_fibre_swapcontext(&async_get_ctx()->dispatcher, - &async_get_ctx()->currjob->fibrectx, 1)) { + ctx->currjob->func = func; + if (!async_fibre_swapcontext(&ctx->dispatcher, + &ctx->currjob->fibrectx, 1)) { ASYNCerr(ASYNC_F_ASYNC_START_JOB, ASYNC_R_FAILED_TO_SWAP_CONTEXT); goto err; } } err: - async_release_job(async_get_ctx()->currjob); - async_get_ctx()->currjob = NULL; + async_release_job(ctx->currjob); + ctx->currjob = NULL; *job = NULL; return ASYNC_ERR; } @@ -295,10 +306,11 @@ err: int ASYNC_pause_job(void) { ASYNC_JOB *job; + async_ctx *ctx = async_get_ctx(); - if (async_get_ctx() == NULL - || async_get_ctx()->currjob == NULL - || async_get_ctx()->blocked) { + if (ctx == NULL + || ctx->currjob == NULL + || ctx->blocked) { /* * Could be we've deliberately not been started within a job so this is * counted as success. @@ -306,11 +318,11 @@ int ASYNC_pause_job(void) return 1; } - job = async_get_ctx()->currjob; + job = ctx->currjob; job->status = ASYNC_JOB_PAUSING; if (!async_fibre_swapcontext(&job->fibrectx, - &async_get_ctx()->dispatcher, 1)) { + &ctx->dispatcher, 1)) { ASYNCerr(ASYNC_F_ASYNC_PAUSE_JOB, ASYNC_R_FAILED_TO_SWAP_CONTEXT); return 0; } @@ -331,14 +343,11 @@ static void async_empty_pool(async_pool *pool) } while (job); } -int ASYNC_init(int init_thread, size_t max_size, size_t init_size) +int async_init(void) { if (!async_global_init()) return 0; - if (init_thread) - return ASYNC_init_thread(max_size, init_size); - return 1; } @@ -352,10 +361,12 @@ int ASYNC_init_thread(size_t max_size, size_t init_size) return 0; } - if (!async_local_init()) { - ASYNCerr(ASYNC_F_ASYNC_INIT_THREAD, ASYNC_R_INIT_FAILED); + OPENSSL_INIT_crypto_library_start(OPENSSL_INIT_ASYNC, NULL); + if (!ossl_init_thread_start(OPENSSL_INIT_THREAD_ASYNC)) { + ASYNCerr(ASYNC_F_ASYNC_INIT_THREAD, ERR_R_MALLOC_FAILURE); return 0; } + pool = OPENSSL_zalloc(sizeof *pool); if (pool == NULL) { ASYNCerr(ASYNC_F_ASYNC_INIT_THREAD, ERR_R_MALLOC_FAILURE); @@ -417,16 +428,6 @@ void ASYNC_cleanup_thread(void) async_free_pool_internal(async_get_pool()); } -void ASYNC_cleanup(int cleanupthread) -{ - /* - * We don't actually have any global cleanup at the moment so just cleanup - * the thread - */ - if (cleanupthread) - ASYNC_cleanup_thread(); -} - ASYNC_JOB *ASYNC_get_current_job(void) { async_ctx *ctx; @@ -464,25 +465,25 @@ void ASYNC_clear_wake(ASYNC_JOB *job) void ASYNC_block_pause(void) { - if (async_get_ctx() == NULL - || async_get_ctx()->currjob == NULL) { + async_ctx *ctx = async_get_ctx(); + if (ctx == NULL || ctx->currjob == NULL) { /* * We're not in a job anyway so ignore this */ return; } - async_get_ctx()->blocked++; + ctx->blocked++; } void ASYNC_unblock_pause(void) { - if (async_get_ctx() == NULL - || async_get_ctx()->currjob == NULL) { + async_ctx *ctx = async_get_ctx(); + if (ctx == NULL || ctx->currjob == NULL) { /* * We're not in a job anyway so ignore this */ return; } - if(async_get_ctx()->blocked > 0) - async_get_ctx()->blocked--; + if(ctx->blocked > 0) + ctx->blocked--; } diff --git a/crypto/async/async_locl.h b/crypto/async/async_locl.h index 0710f9e..53a192b 100644 --- a/crypto/async/async_locl.h +++ b/crypto/async/async_locl.h @@ -59,7 +59,7 @@ # pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif -#include <openssl/async.h> +#include <internal/async.h> #include <openssl/crypto.h> typedef struct async_ctx_st async_ctx; @@ -95,7 +95,6 @@ struct async_pool_st { }; int async_global_init(void); -int async_local_init(void); void async_local_cleanup(void); void async_global_cleanup(void); void async_start_func(void); |