static void ossl_init_thread_stop(struct thread_local_inits_st *locals);
-/* Implement "once" functionality */
-#if !defined(OPENSSL_THREADS)
-
-static int ossl_init_setup_thread_stop(void)
-{
- /*
- * There are no threads to stop. Do nothing.
- */
- return 1;
-}
-
-static void ossl_init_thread_stop_cleanup(void)
-{
-}
-
-static struct thread_local_inits_st *local = NULL;
-static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc)
-{
- struct thread_local_inits_st *tmp;
-
- tmp = local;
-
- if (local == NULL && alloc)
- tmp = local = OPENSSL_zalloc(sizeof(*local));
-
- if (!alloc)
- local = NULL;
-
- return tmp;
-}
-
-#elif defined(OPENSSL_SYS_WINDOWS)
-
-# include <windows.h>
-
-static DWORD threadstopkey = TLS_OUT_OF_INDEXES;
-
-static int ossl_init_setup_thread_stop(void)
-{
- /*
- * We use a dummy thread local key here. We use the destructor to detect
- * when the thread is going to stop
- */
- threadstopkey = TlsAlloc();
- if (threadstopkey == TLS_OUT_OF_INDEXES)
- return 0;
-
- return 1;
-}
-
-static void ossl_init_thread_stop_cleanup(void)
-{
- if (threadstopkey != TLS_OUT_OF_INDEXES) {
- TlsFree(threadstopkey);
- }
-}
-
-static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc)
-{
- struct thread_local_inits_st *local = TlsGetValue(threadstopkey);
-
- if (local == NULL && alloc) {
- local = OPENSSL_zalloc(sizeof *local);
- TlsSetValue(threadstopkey, local);
- }
- if (!alloc) {
- TlsSetValue(threadstopkey, NULL);
- }
-
- return local;
-}
-
-#else /* pthreads */
-# include <pthread.h>
-
-static pthread_key_t threadstopkey;
+static CRYPTO_THREAD_LOCAL threadstopkey;
static void ossl_init_thread_stop_wrap(void *local)
{
ossl_init_thread_stop((struct thread_local_inits_st *)local);
}
-static int ossl_init_setup_thread_stop(void)
-{
- /*
- * We use a dummy thread local key here. We use the destructor to detect
- * when the thread is going to stop
- */
- return (pthread_key_create(&threadstopkey,
- ossl_init_thread_stop_wrap) == 0);
-}
-
-static void ossl_init_thread_stop_cleanup(void)
-{
-}
-
static struct thread_local_inits_st *ossl_init_get_thread_local(int alloc)
{
- struct thread_local_inits_st *local = pthread_getspecific(threadstopkey);
+ struct thread_local_inits_st *local =
+ CRYPTO_THREAD_get_local(&threadstopkey);
if (local == NULL && alloc) {
local = OPENSSL_zalloc(sizeof *local);
- pthread_setspecific(threadstopkey, local);
+ CRYPTO_THREAD_set_local(&threadstopkey, local);
}
if (!alloc) {
- pthread_setspecific(threadstopkey, NULL);
+ CRYPTO_THREAD_set_local(&threadstopkey, NULL);
}
return local;
}
-#endif
-
typedef struct ossl_init_stop_st OPENSSL_INIT_STOP;
struct ossl_init_stop_st {
void (*handler)(void);
};
static OPENSSL_INIT_STOP *stop_handlers = NULL;
+static CRYPTO_RWLOCK *init_lock = NULL;
static CRYPTO_ONCE base = CRYPTO_ONCE_STATIC_INIT;
static int base_inited = 0;
#ifdef OPENSSL_INIT_DEBUG
fprintf(stderr, "OPENSSL_INIT: ossl_init_base: Setting up stop handlers\n");
#endif
- ossl_init_setup_thread_stop();
+ /*
+ * We use a dummy thread local key here. We use the destructor to detect
+ * when the thread is going to stop (where that feature is available)
+ */
+ CRYPTO_THREAD_init_local(&threadstopkey, ossl_init_thread_stop_wrap);
#ifndef OPENSSL_SYS_UEFI
atexit(OPENSSL_cleanup);
#endif
+ init_lock = CRYPTO_THREAD_lock_new();
OPENSSL_cpuid_setup();
base_inited = 1;
}
#endif
#ifndef OPENSSL_NO_ENGINE
-static int engine_inited = 0;
static CRYPTO_ONCE engine_openssl = CRYPTO_ONCE_STATIC_INIT;
static void ossl_init_engine_openssl(void)
{
"engine_load_openssl_internal()\n");
# endif
engine_load_openssl_internal();
- engine_inited = 1;
}
# if !defined(OPENSSL_NO_HW) && \
(defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV))
"engine_load_cryptodev_internal()\n");
# endif
engine_load_cryptodev_internal();
- engine_inited = 1;
}
# endif
"engine_load_rdrand_internal()\n");
# endif
engine_load_rdrand_internal();
- engine_inited = 1;
}
# endif
static CRYPTO_ONCE engine_dynamic = CRYPTO_ONCE_STATIC_INIT;
"engine_load_dynamic_internal()\n");
# endif
engine_load_dynamic_internal();
- engine_inited = 1;
}
# ifndef OPENSSL_NO_STATIC_ENGINE
# if !defined(OPENSSL_NO_HW) && !defined(OPENSSL_NO_HW_PADLOCK)
"engine_load_padlock_internal()\n");
# endif
engine_load_padlock_internal();
- engine_inited = 1;
}
# endif
# if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG)
"engine_load_capi_internal()\n");
# endif
engine_load_capi_internal();
- engine_inited = 1;
}
# endif
static CRYPTO_ONCE engine_dasync = CRYPTO_ONCE_STATIC_INIT;
"engine_load_dasync_internal()\n");
# endif
engine_load_dasync_internal();
- engine_inited = 1;
}
# if !defined(OPENSSL_NO_AFALGENG)
static OPENSSL_INIT_ONCE engine_afalg = OPENSSL_INIT_ONCE_STATIC_INIT;
"engine_load_afalg_internal()\n");
# endif
engine_load_afalg_internal();
- engine_inited = 1;
}
# endif
# endif
if (locals->err_state) {
#ifdef OPENSSL_INIT_DEBUG
fprintf(stderr, "OPENSSL_INIT: ossl_init_thread_stop: "
- "ERR_remove_thread_state(NULL)\n");
+ "ERR_remove_thread_state()\n");
#endif
- ERR_remove_thread_state(NULL);
+ ERR_remove_thread_state();
}
OPENSSL_free(locals);
OPENSSL_free(lasthandler);
}
stop_handlers = NULL;
+
+ CRYPTO_THREAD_lock_free(init_lock);
+
/*
* We assume we are single-threaded for this function, i.e. no race
* conditions for the various "*_inited" vars below.
}
#endif
-#ifndef OPENSSL_NO_ENGINE
- if (engine_inited) {
-# ifdef OPENSSL_INIT_DEBUG
- fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
- "ENGINE_cleanup()\n");
-# endif
- ENGINE_cleanup();
- }
-#endif
-
if (load_crypto_strings_inited) {
#ifdef OPENSSL_INIT_DEBUG
fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
ERR_free_strings();
}
- ossl_init_thread_stop_cleanup();
+ CRYPTO_THREAD_cleanup_local(&threadstopkey);
#ifdef OPENSSL_INIT_DEBUG
+#ifndef OPENSSL_NO_ENGINE
+ fprintf(stderr, "OPENSSL_INIT: OPENSSL_cleanup: "
+ "ENGINE_cleanup()\n");
+#endif
fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: "
"CRYPTO_cleanup_all_ex_data()\n");
fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: "
"CONF_modules_free()\n");
fprintf(stderr, "OPENSSL_INIT: OPENSSL_INIT_library_stop: "
"RAND_cleanup()\n");
+
+#endif
+#ifndef OPENSSL_NO_ENGINE
+ ENGINE_cleanup();
#endif
CRYPTO_cleanup_all_ex_data();
EVP_cleanup();
if (opts & OPENSSL_INIT_LOAD_CONFIG) {
int ret;
- CRYPTO_w_lock(CRYPTO_LOCK_INIT);
+ CRYPTO_THREAD_write_lock(init_lock);
config_filename = (settings == NULL) ? NULL : settings->config_name;
ret = CRYPTO_THREAD_run_once(&config, ossl_init_config);
- CRYPTO_w_unlock(CRYPTO_LOCK_INIT);
+ CRYPTO_THREAD_unlock(init_lock);
if (!ret)
return 0;
}