X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fthreads_win.c;h=1e5cf82073e0787dddb88956882a9a62747dec12;hp=5347c9e46bbdd24a817619d63bbde972c3e0c04a;hb=7fcdbd839c629f5419a49bf8da28c968c8140c3d;hpb=349d1cfddcfa33d352240582a3803f2eba39d9a0 diff --git a/crypto/threads_win.c b/crypto/threads_win.c index 5347c9e46b..1e5cf82073 100644 --- a/crypto/threads_win.c +++ b/crypto/threads_win.c @@ -1,5 +1,5 @@ /* - * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the OpenSSL license (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -17,9 +17,12 @@ CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void) { - CRYPTO_RWLOCK *lock = OPENSSL_zalloc(sizeof(CRITICAL_SECTION)); - if (lock == NULL) + CRYPTO_RWLOCK *lock; + + if ((lock = OPENSSL_zalloc(sizeof(CRITICAL_SECTION))) == NULL) { + /* Don't set error, to avoid recursion blowup. */ return NULL; + } /* 0x400 is the spin count value suggested in the documentation */ if (!InitializeCriticalSectionAndSpinCount(lock, 0x400)) { @@ -78,8 +81,8 @@ int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void)) do { result = InterlockedCompareExchange(lock, ONCE_ININIT, ONCE_UNINITED); if (result == ONCE_UNINITED) { - *lock = ONCE_DONE; init(); + *lock = ONCE_DONE; return 1; } } while (result == ONCE_ININIT); @@ -133,4 +136,21 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) return 1; } +int CRYPTO_atomic_read(int *val, int *ret, CRYPTO_RWLOCK *lock) +{ + *ret = InterlockedCompareExchange(val, 0, 0); + return 1; +} + +int CRYPTO_atomic_write(int *val, int n, CRYPTO_RWLOCK *lock) +{ + InterlockedExchange(val, n); + return 1; +} + +int openssl_init_fork_handlers(void) +{ + return 0; +} + #endif