diff options
Diffstat (limited to 'crypto/threads_none.c')
-rw-r--r-- | crypto/threads_none.c | 118 |
1 files changed, 114 insertions, 4 deletions
diff --git a/crypto/threads_none.c b/crypto/threads_none.c index 2570efde2378..240b7d9fdcfe 100644 --- a/crypto/threads_none.c +++ b/crypto/threads_none.c @@ -1,5 +1,5 @@ /* - * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2016-2024 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -9,6 +9,8 @@ #include <openssl/crypto.h> #include "internal/cryptlib.h" +#include "internal/rcu.h" +#include "rcu_internal.h" #if !defined(OPENSSL_THREADS) || defined(CRYPTO_TDEBUG) @@ -17,14 +19,90 @@ # include <unistd.h> # endif +struct rcu_lock_st { + struct rcu_cb_item *cb_items; +}; + +CRYPTO_RCU_LOCK *ossl_rcu_lock_new(int num_writers, + ossl_unused OSSL_LIB_CTX *ctx) +{ + struct rcu_lock_st *lock; + + lock = OPENSSL_zalloc(sizeof(*lock)); + return lock; +} + +void ossl_rcu_lock_free(CRYPTO_RCU_LOCK *lock) +{ + OPENSSL_free(lock); +} + +void ossl_rcu_read_lock(CRYPTO_RCU_LOCK *lock) +{ + return; +} + +void ossl_rcu_write_lock(CRYPTO_RCU_LOCK *lock) +{ + return; +} + +void ossl_rcu_write_unlock(CRYPTO_RCU_LOCK *lock) +{ + return; +} + +void ossl_rcu_read_unlock(CRYPTO_RCU_LOCK *lock) +{ + return; +} + +void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock) +{ + struct rcu_cb_item *items = lock->cb_items; + struct rcu_cb_item *tmp; + + lock->cb_items = NULL; + + while (items != NULL) { + tmp = items->next; + items->fn(items->data); + OPENSSL_free(items); + items = tmp; + } +} + +int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data) +{ + struct rcu_cb_item *new = OPENSSL_zalloc(sizeof(*new)); + + if (new == NULL) + return 0; + + new->fn = cb; + new->data = data; + new->next = lock->cb_items; + lock->cb_items = new; + return 1; +} + +void *ossl_rcu_uptr_deref(void **p) +{ + return (void *)*p; +} + +void ossl_rcu_assign_uptr(void **p, void **v) +{ + *(void **)p = *(void **)v; +} + CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void) { CRYPTO_RWLOCK *lock; - if ((lock = OPENSSL_zalloc(sizeof(unsigned int))) == NULL) { + if ((lock = CRYPTO_zalloc(sizeof(unsigned int), NULL, 0)) == NULL) /* Don't set error, to avoid recursion blowup. */ return NULL; - } *(unsigned int *)lock = 1; @@ -73,7 +151,7 @@ int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void)) return 1; } -#define OPENSSL_CRYPTO_THREAD_LOCAL_KEY_MAX 256 +# define OPENSSL_CRYPTO_THREAD_LOCAL_KEY_MAX 256 static void *thread_local_storage[OPENSSL_CRYPTO_THREAD_LOCAL_KEY_MAX]; @@ -133,6 +211,24 @@ int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock) return 1; } +int CRYPTO_atomic_add64(uint64_t *val, uint64_t op, uint64_t *ret, + CRYPTO_RWLOCK *lock) +{ + *val += op; + *ret = *val; + + return 1; +} + +int CRYPTO_atomic_and(uint64_t *val, uint64_t op, uint64_t *ret, + CRYPTO_RWLOCK *lock) +{ + *val &= op; + *ret = *val; + + return 1; +} + int CRYPTO_atomic_or(uint64_t *val, uint64_t op, uint64_t *ret, CRYPTO_RWLOCK *lock) { @@ -149,6 +245,20 @@ int CRYPTO_atomic_load(uint64_t *val, uint64_t *ret, CRYPTO_RWLOCK *lock) return 1; } +int CRYPTO_atomic_store(uint64_t *dst, uint64_t val, CRYPTO_RWLOCK *lock) +{ + *dst = val; + + return 1; +} + +int CRYPTO_atomic_load_int(int *val, int *ret, CRYPTO_RWLOCK *lock) +{ + *ret = *val; + + return 1; +} + int openssl_init_fork_handlers(void) { return 0; |