# include <stddef.h>
# include <unistd.h>
# include <openssl/err.h>
+# include <openssl/crypto.h>
#define STACKSIZE 32768
+static CRYPTO_RWLOCK *async_mem_lock;
+
static void *async_stack_alloc(size_t *num);
static void async_stack_free(void *addr);
+int async_local_init(void)
+{
+ async_mem_lock = CRYPTO_THREAD_lock_new();
+ return async_mem_lock != NULL;
+}
+
+void async_local_deinit(void)
+{
+ CRYPTO_THREAD_lock_free(async_mem_lock);
+}
+
static int allow_customize = 1;
static ASYNC_stack_alloc_fn stack_alloc_impl = async_stack_alloc;
static ASYNC_stack_free_fn stack_free_impl = async_stack_free;
int ASYNC_set_mem_functions(ASYNC_stack_alloc_fn alloc_fn,
ASYNC_stack_free_fn free_fn)
{
- if (!allow_customize)
+ OPENSSL_init_crypto(OPENSSL_INIT_ASYNC, NULL);
+
+ if (!CRYPTO_THREAD_write_lock(async_mem_lock))
+ return 0;
+ if (!allow_customize) {
+ CRYPTO_THREAD_unlock(async_mem_lock);
return 0;
+ }
+ CRYPTO_THREAD_unlock(async_mem_lock);
+
if (alloc_fn != NULL)
stack_alloc_impl = alloc_fn;
if (free_fn != NULL)
* Disallow customisation after the first
* stack is allocated.
*/
- if (allow_customize)
+ if (allow_customize) {
+ if (!CRYPTO_THREAD_write_lock(async_mem_lock))
+ return 0;
allow_customize = 0;
+ CRYPTO_THREAD_unlock(async_mem_lock);
+ }
fibre->fibre.uc_stack.ss_sp = stack_alloc_impl(&num);
if (fibre->fibre.uc_stack.ss_sp != NULL) {
# endif
# define async_fibre_free(f) (DeleteFiber((f)->fibre))
+# define async_local_init() 1
+# define async_local_deinit()
int async_fibre_init_dispatcher(async_fibre *fibre);
VOID CALLBACK async_start_func_win(PVOID unused);
return 0;
}
- return 1;
+ return async_local_init();
}
void async_deinit(void)
{
CRYPTO_THREAD_cleanup_local(&ctxkey);
CRYPTO_THREAD_cleanup_local(&poolkey);
+ async_local_deinit();
}
int ASYNC_init_thread(size_t max_size, size_t init_size)