diff options
author | Matt Caswell <matt@openssl.org> | 2019-05-24 11:45:48 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2019-06-17 15:32:54 +0100 |
commit | 242f84d06aca7030b2bd52043c39b0cb80c4fec6 (patch) | |
tree | a88b317f8d8d5cd537eb95c12b592383c77604e6 /crypto/async | |
parent | d4c051cef338eecf092affbb479d1f87c1ea31d9 (diff) |
Convert thread stop handling into a publish/subscribe model
In later commits this will allow providers to subscribe to thread stop
events. We will need this in the FIPS module. We also make thread stop
handling OPENSSL_CTX aware (different OPENSSL_CTXs may have different
thread local data that needs cleaning up).
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/9040)
Diffstat (limited to 'crypto/async')
-rw-r--r-- | crypto/async/async.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/crypto/async/async.c b/crypto/async/async.c index 53d288ca62..785ed06906 100644 --- a/crypto/async/async.c +++ b/crypto/async/async.c @@ -30,11 +30,13 @@ static CRYPTO_THREAD_LOCAL ctxkey; static CRYPTO_THREAD_LOCAL poolkey; +static void async_delete_thread_state(OPENSSL_CTX *ctx); + static async_ctx *async_ctx_new(void) { async_ctx *nctx; - if (!ossl_init_thread_start(OPENSSL_INIT_THREAD_ASYNC)) + if (!ossl_init_thread_start(NULL, async_delete_thread_state)) return NULL; nctx = OPENSSL_malloc(sizeof(*nctx)); @@ -326,7 +328,7 @@ int ASYNC_init_thread(size_t max_size, size_t init_size) if (!OPENSSL_init_crypto(OPENSSL_INIT_ASYNC, NULL)) return 0; - if (!ossl_init_thread_start(OPENSSL_INIT_THREAD_ASYNC)) + if (!ossl_init_thread_start(NULL, async_delete_thread_state)) return 0; pool = OPENSSL_zalloc(sizeof(*pool)); @@ -374,7 +376,8 @@ err: return 0; } -void async_delete_thread_state(void) +/* OPENSSL_CTX ignored for now */ +static void async_delete_thread_state(OPENSSL_CTX *ctx) { async_pool *pool = (async_pool *)CRYPTO_THREAD_get_local(&poolkey); @@ -393,7 +396,7 @@ void ASYNC_cleanup_thread(void) if (!OPENSSL_init_crypto(OPENSSL_INIT_ASYNC, NULL)) return; - async_delete_thread_state(); + async_delete_thread_state(NULL); } ASYNC_JOB *ASYNC_get_current_job(void) |