<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/144ace54f04c7edde6209ea1c310b61936a30c23">https://github.com/macports/macports-ports/commit/144ace54f04c7edde6209ea1c310b61936a30c23</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 144ace54f04c7edde6209ea1c310b61936a30c23
</span>Author: Clemens Lang <cal@macports.org>
AuthorDate: Tue Apr 8 16:58:52 2025 +0200

<span style='display:block; white-space:pre;color:#404040;'>    openssl3: Update to 3.5.0
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Upstream release announcement at
</span><span style='display:block; white-space:pre;color:#404040;'>      https://openssl-library.org/post/2025-04-08-openssl-35-final-release/
</span>---
 devel/openssl3/Portfile                            |  15 +-
 devel/openssl3/files/0001-revert-rcu.diff          |  74 -----
 devel/openssl3/files/0002-use-atomic-relaxed.diff  | 310 ---------------------
 .../files/0003-dont-use-atomic-acq-rel.diff        |  94 -------
 4 files changed, 4 insertions(+), 489 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/openssl3/Portfile b/devel/openssl3/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 80ae5409352..dbd3c4e8656 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/openssl3/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/openssl3/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -12,14 +12,14 @@ legacysupport.newest_darwin_requires_legacy 8
</span> set major_v         3
 # For former rollback to 3.1.x release where needed. Must now stay.
 epoch               1
<span style='display:block; white-space:pre;background:#ffe0e0;'>-github.setup        openssl openssl ${major_v}.4.1 openssl-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup        openssl openssl ${major_v}.5.0 openssl-
</span> name                openssl3
 revision            0
 
 github.tarball_from releases
<span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums           rmd160  0ed35dcf4a93ad96e1844c03e655c89e08fe3340 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    size    18346056
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums           rmd160  a91cd921f76ba9833d2539a980f4366088f3ea8a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  344d0a79f1a9b08029b0744e2cc401a43f9c90acd1044d09a530b4885a8e9fc0 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    53136912
</span> 
 # Please revbump these ports when updating the openssl3 version/revision
 #  - freeradius (#43461)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -94,13 +94,6 @@ if {${os.platform} eq "darwin" && ${os.major} < 18 && ${os.major} > 8} {
</span> #
 patchfiles-append   patch-use-timegm.diff
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# https://github.com/openssl/openssl/pull/26690
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# https://github.com/openssl/openssl/pull/26747
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# remove these patches in the next release
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles-append   0001-revert-rcu.diff \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    0002-use-atomic-relaxed.diff \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    0003-dont-use-atomic-acq-rel.diff
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> if {${os.platform} eq "darwin" && ${os.major} < 11} {
     # Having the stdlib set to libc++ on 10.6 causes a dependency on a
     # macports-clang compiler to be added, which would be a dep cycle.
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/openssl3/files/0001-revert-rcu.diff b/devel/openssl3/files/0001-revert-rcu.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 7bdff39609f..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/openssl3/files/0001-revert-rcu.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,74 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 80040de93593a8b3ca34c009931bf95b13dd2c4b Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: Bernd Edlinger <bernd.edlinger@hotmail.de>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Sun, 9 Feb 2025 13:49:31 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] Revert "rcu: Ensure that updates to the ID field of a qp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- don't lose refs"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-This reverts commit fbd34c03e3ca94d3805e97a01defdf8b6037f61c.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Reviewed-by: Neil Horman <nhorman@openssl.org>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Reviewed-by: Tomas Mraz <tomas@openssl.org>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-(Merged from https://github.com/openssl/openssl/pull/26690)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-(cherry picked from commit 65787e2dc219685c30539c6f60eb6b64b890bf6f)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- crypto/threads_pthread.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ crypto/threads_pthread.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -129,7 +129,6 @@ static inline void *apple_atomic_load_n_pvoid(void **p,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  define ATOMIC_STORE_N(t, p, v, o) __atomic_store_n(p, v, o)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  define ATOMIC_STORE(t, p, v, o) __atomic_store(p, v, o)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  define ATOMIC_EXCHANGE_N(t, p, v, o) __atomic_exchange_n(p, v, o)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#  define ATOMIC_COMPARE_EXCHANGE_N(t, p, e, d, s, f) __atomic_compare_exchange_n(p, e, d, 0, s, f)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  define ATOMIC_ADD_FETCH(p, v, o) __atomic_add_fetch(p, v, o)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  define ATOMIC_FETCH_ADD(p, v, o) __atomic_fetch_add(p, v, o)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  define ATOMIC_SUB_FETCH(p, v, o) __atomic_sub_fetch(p, v, o)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -198,23 +197,6 @@ IMPL_fallback_atomic_exchange_n(prcu_cb_item)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  define ATOMIC_EXCHANGE_N(t, p, v, o) fallback_atomic_exchange_n_##t(p, v)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#  define IMPL_fallback_atomic_compare_exchange_n(t)                                  \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    static ossl_inline int fallback_atomic_compare_exchange_n_##t(t *p, t *e, t d, s, f) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    {                                                                                 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        int ret = 1;                                                                 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        pthread_mutex_lock(&atomic_sim_lock);                                         \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (*p == *e)                                                                 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            *p = d;                                                                    \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        else                                                                          \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            ret = 0;                                                                   \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        pthread_mutex_unlock(&atomic_sim_lock);                                       \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        return ret;                                                                   \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--IMPL_fallback_atomic_exchange_n(uint64_t)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#  define ATOMIC_COMPARE_EXCHANGE_N(t, p, e, d, s, f) fallback_atomic_compare_exchange_n_##t(p, e, d, s, f)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * The fallbacks that follow don't need any per type implementation, as
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * they are designed for uint64_t only.  If there comes a time when multiple
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -523,8 +505,6 @@ void ossl_rcu_read_unlock(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static struct rcu_qp *update_qp(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     uint64_t new_id;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    uint64_t update;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    uint64_t ret;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     uint32_t current_idx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_mutex_lock(&lock->alloc_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -557,13 +537,10 @@ static struct rcu_qp *update_qp(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      * of this update are published to the read side prior to updating the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      * reader idx below
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--try_again:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    ret = ATOMIC_LOAD_N(uint64_t, &lock->qp_group[current_idx].users, __ATOMIC_ACQUIRE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    update = ret & ID_MASK;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    update |= new_id;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    if (!ATOMIC_COMPARE_EXCHANGE_N(uint64_t, &lock->qp_group[current_idx].users, &ret, update,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                   __ATOMIC_ACQ_REL, __ATOMIC_RELAXED))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        goto try_again;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ATOMIC_AND_FETCH(&lock->qp_group[current_idx].users, ID_MASK,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                     __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ATOMIC_OR_FETCH(&lock->qp_group[current_idx].users, new_id,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      * Update the reader index to be the prior qp.
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/openssl3/files/0002-use-atomic-relaxed.diff b/devel/openssl3/files/0002-use-atomic-relaxed.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 3a709ebd220..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/openssl3/files/0002-use-atomic-relaxed.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,310 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 51f69325e868d7fe39a23077feddd87217821d65 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: Bernd Edlinger <bernd.edlinger@hotmail.de>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Sun, 9 Feb 2025 17:24:43 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] Rework and simplify RCU code
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Use __ATOMIC_RELAXED where possible.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Dont store additional values in the users field.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Reviewed-by: Neil Horman <nhorman@openssl.org>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Reviewed-by: Tomas Mraz <tomas@openssl.org>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-(Merged from https://github.com/openssl/openssl/pull/26690)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-(cherry picked from commit 5949918f9afa85d72535676f114346ed541e0b1e)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- crypto/threads_pthread.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ crypto/threads_pthread.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -270,25 +270,6 @@ static ossl_inline uint64_t fallback_atomic_or_fetch(uint64_t *p, uint64_t m)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  define ATOMIC_OR_FETCH(p, v, o) fallback_atomic_or_fetch(p, v)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * users is broken up into 2 parts
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * bits 0-15 current readers
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * bit 32-63 ID
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define READER_SHIFT 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define ID_SHIFT 32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--/* TODO: READER_SIZE 32 in threads_win.c */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define READER_SIZE 16
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define ID_SIZE 32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define READER_MASK     (((uint64_t)1 << READER_SIZE) - 1)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define ID_MASK         (((uint64_t)1 << ID_SIZE) - 1)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define READER_COUNT(x) ((uint32_t)(((uint64_t)(x) >> READER_SHIFT) & \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                     READER_MASK))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define ID_VAL(x)       ((uint32_t)(((uint64_t)(x) >> ID_SHIFT) & ID_MASK))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define VAL_READER      ((uint64_t)1 << READER_SHIFT)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define VAL_ID(x)       ((uint64_t)x << ID_SHIFT)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * This is the core of an rcu lock. It tracks the readers and writers for the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * current quiescence point for a given lock. Users is the 64 bit value that
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -388,28 +369,16 @@ static struct rcu_qp *get_hold_current_qp(struct rcu_lock_st *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-          */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         qp_idx = ATOMIC_LOAD_N(uint32_t, &lock->reader_idx, __ATOMIC_ACQUIRE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * Notes of use of __ATOMIC_RELEASE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * This counter is only read by the write side of the lock, and so we
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * specify __ATOMIC_RELEASE here to ensure that the write side of the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * lock see this during the spin loop read of users, as it waits for the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * reader count to approach zero
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        ATOMIC_ADD_FETCH(&lock->qp_group[qp_idx].users, VAL_READER,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                         __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        ATOMIC_ADD_FETCH(&lock->qp_group[qp_idx].users, (uint64_t)1,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                         __ATOMIC_ACQUIRE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         /* if the idx hasn't changed, we're good, else try again */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (qp_idx == ATOMIC_LOAD_N(uint32_t, &lock->reader_idx, __ATOMIC_ACQUIRE))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (qp_idx == ATOMIC_LOAD_N(uint32_t, &lock->reader_idx,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                    __ATOMIC_RELAXED))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * Notes on use of __ATOMIC_RELEASE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * As with the add above, we want to ensure that this decrement is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * seen by the write side of the lock as soon as it happens to prevent
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * undue spinning waiting for write side completion
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        ATOMIC_SUB_FETCH(&lock->qp_group[qp_idx].users, VAL_READER,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                         __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        ATOMIC_SUB_FETCH(&lock->qp_group[qp_idx].users, (uint64_t)1,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                         __ATOMIC_RELAXED);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return &lock->qp_group[qp_idx];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -476,14 +445,14 @@ void ossl_rcu_read_unlock(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     for (i = 0; i < MAX_QPS; i++) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         if (data->thread_qps[i].lock == lock) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             * As with read side acquisition, we use __ATOMIC_RELEASE here
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             * to ensure that the decrement is published immediately
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             * to any write side waiters
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             * we have to use __ATOMIC_RELEASE here
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             * to ensure that all preceding read instructions complete
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             * before the decrement is visible to ossl_synchronize_rcu
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             data->thread_qps[i].depth--;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             if (data->thread_qps[i].depth == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                ret = ATOMIC_SUB_FETCH(&data->thread_qps[i].qp->users, VAL_READER,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                       __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ret = ATOMIC_SUB_FETCH(&data->thread_qps[i].qp->users,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                       (uint64_t)1, __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 OPENSSL_assert(ret != UINT64_MAX);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 data->thread_qps[i].qp = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 data->thread_qps[i].lock = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -502,9 +471,8 @@ void ossl_rcu_read_unlock(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * Write side allocation routine to get the current qp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * and replace it with a new one
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--static struct rcu_qp *update_qp(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+static struct rcu_qp *update_qp(CRYPTO_RCU_LOCK *lock, uint32_t *curr_id)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    uint64_t new_id;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     uint32_t current_idx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_mutex_lock(&lock->alloc_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -527,29 +495,11 @@ static struct rcu_qp *update_qp(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     lock->current_alloc_idx =
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         (lock->current_alloc_idx + 1) % lock->group_count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* get and insert a new id */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    new_id = VAL_ID(lock->id_ctr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    *curr_id = lock->id_ctr;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     lock->id_ctr++;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * Even though we are under a write side lock here
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * We need to use atomic instructions to ensure that the results
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * of this update are published to the read side prior to updating the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * reader idx below
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    ATOMIC_AND_FETCH(&lock->qp_group[current_idx].users, ID_MASK,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                     __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    ATOMIC_OR_FETCH(&lock->qp_group[current_idx].users, new_id,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                    __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * Update the reader index to be the prior qp.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * Note the use of __ATOMIC_RELEASE here is based on the corresponding use
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * of __ATOMIC_ACQUIRE in get_hold_current_qp, as we want any publication
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * of this value to be seen on the read side immediately after it happens
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     ATOMIC_STORE_N(uint32_t, &lock->reader_idx, lock->current_alloc_idx,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   __ATOMIC_RELEASE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   __ATOMIC_RELAXED);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* wake up any waiters */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_cond_signal(&lock->alloc_signal);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -593,6 +543,7 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct rcu_qp *qp;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     uint64_t count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    uint32_t curr_id;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct rcu_cb_item *cb_items, *tmpcb;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_mutex_lock(&lock->write_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -600,25 +551,26 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     lock->cb_items = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_mutex_unlock(&lock->write_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    qp = update_qp(lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    qp = update_qp(lock, &curr_id);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* retire in order */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    pthread_mutex_lock(&lock->prior_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    while (lock->next_to_retire != curr_id)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pthread_cond_wait(&lock->prior_signal, &lock->prior_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    lock->next_to_retire++;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    pthread_cond_broadcast(&lock->prior_signal);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    pthread_mutex_unlock(&lock->prior_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      * wait for the reader count to reach zero
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      * Note the use of __ATOMIC_ACQUIRE here to ensure that any
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * prior __ATOMIC_RELEASE write operation in get_hold_current_qp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * prior __ATOMIC_RELEASE write operation in ossl_rcu_read_unlock
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      * is visible prior to our read
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * however this is likely just necessary to silence a tsan warning
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     do {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         count = ATOMIC_LOAD_N(uint64_t, &qp->users, __ATOMIC_ACQUIRE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    } while (READER_COUNT(count) != 0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* retire in order */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    pthread_mutex_lock(&lock->prior_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    while (lock->next_to_retire != ID_VAL(count))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        pthread_cond_wait(&lock->prior_signal, &lock->prior_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    lock->next_to_retire++;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    pthread_cond_broadcast(&lock->prior_signal);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    pthread_mutex_unlock(&lock->prior_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    } while (count != (uint64_t)0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     retire_qp(lock, qp);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- crypto/threads_win.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ crypto/threads_win.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -43,25 +43,6 @@ typedef struct {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- } CRYPTO_win_rwlock;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * users is broken up into 2 parts
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * bits 0-31 current readers
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * bit 32-63 ID
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define READER_SHIFT 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define ID_SHIFT 32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--/* TODO: READER_SIZE 16 in threads_pthread.c */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define READER_SIZE 32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define ID_SIZE 32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define READER_MASK     (((uint64_t)1 << READER_SIZE) - 1)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define ID_MASK         (((uint64_t)1 << ID_SIZE) - 1)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define READER_COUNT(x) ((uint32_t)(((uint64_t)(x) >> READER_SHIFT) & \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                     READER_MASK))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define ID_VAL(x)       ((uint32_t)(((uint64_t)(x) >> ID_SHIFT) & ID_MASK))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define VAL_READER      ((int64_t)1 << READER_SHIFT)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# define VAL_ID(x)       ((uint64_t)x << ID_SHIFT)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * This defines a quescent point (qp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * This is the barrier beyond which a writer
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -229,13 +210,13 @@ static ossl_inline struct rcu_qp *get_hold_current_qp(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     for (;;) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         CRYPTO_atomic_load_int((int *)&lock->reader_idx, (int *)&qp_idx,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                lock->rw_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        CRYPTO_atomic_add64(&lock->qp_group[qp_idx].users, VAL_READER, &tmp64,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        CRYPTO_atomic_add64(&lock->qp_group[qp_idx].users, (uint64_t)1, &tmp64,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                             lock->rw_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         CRYPTO_atomic_load_int((int *)&lock->reader_idx, (int *)&tmp,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                lock->rw_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         if (qp_idx == tmp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        CRYPTO_atomic_add64(&lock->qp_group[qp_idx].users, -VAL_READER, &tmp64,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        CRYPTO_atomic_add64(&lock->qp_group[qp_idx].users, (uint64_t)-1, &tmp64,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                             lock->rw_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -313,7 +294,7 @@ void ossl_rcu_read_unlock(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             data->thread_qps[i].depth--;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             if (data->thread_qps[i].depth == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 CRYPTO_atomic_add64(&data->thread_qps[i].qp->users,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                    -VAL_READER, (uint64_t *)&ret,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                    (uint64_t)-1, (uint64_t *)&ret,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                     lock->rw_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 OPENSSL_assert(ret >= 0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 data->thread_qps[i].qp = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -328,12 +309,10 @@ void ossl_rcu_read_unlock(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * Write side allocation routine to get the current qp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * and replace it with a new one
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--static struct rcu_qp *update_qp(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+static struct rcu_qp *update_qp(CRYPTO_RCU_LOCK *lock, uint32_t *curr_id)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    uint64_t new_id;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     uint32_t current_idx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     uint32_t tmp;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    uint64_t tmp64;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     ossl_crypto_mutex_lock(lock->alloc_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -355,20 +334,9 @@ static struct rcu_qp *update_qp(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         (lock->current_alloc_idx + 1) % lock->group_count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* get and insert a new id */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    new_id = VAL_ID(lock->id_ctr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    *curr_id = lock->id_ctr;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     lock->id_ctr++;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * Even though we are under a write side lock here
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * We need to use atomic instructions to ensure that the results
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * of this update are published to the read side prior to updating the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * reader idx below
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    CRYPTO_atomic_and(&lock->qp_group[current_idx].users, ID_MASK, &tmp64,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                      lock->rw_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    CRYPTO_atomic_add64(&lock->qp_group[current_idx].users, new_id, &tmp64,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                        lock->rw_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* update the reader index to be the prior qp */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     tmp = lock->current_alloc_idx;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     InterlockedExchange((LONG volatile *)&lock->reader_idx, tmp);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -393,27 +361,28 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct rcu_qp *qp;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     uint64_t count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    uint32_t curr_id;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct rcu_cb_item *cb_items, *tmpcb;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* before we do anything else, lets grab the cb list */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     cb_items = InterlockedExchangePointer((void * volatile *)&lock->cb_items, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    qp = update_qp(lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* wait for the reader count to reach zero */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    do {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        CRYPTO_atomic_load(&qp->users, &count, lock->rw_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    } while (READER_COUNT(count) != 0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    qp = update_qp(lock, &curr_id);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* retire in order */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     ossl_crypto_mutex_lock(lock->prior_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    while (lock->next_to_retire != ID_VAL(count))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    while (lock->next_to_retire != curr_id)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         ossl_crypto_condvar_wait(lock->prior_signal, lock->prior_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     lock->next_to_retire++;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     ossl_crypto_condvar_broadcast(lock->prior_signal);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     ossl_crypto_mutex_unlock(lock->prior_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* wait for the reader count to reach zero */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    do {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        CRYPTO_atomic_load(&qp->users, &count, lock->rw_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    } while (count != (uint64_t)0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     retire_qp(lock, qp);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* handle any callbacks that we have */
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/openssl3/files/0003-dont-use-atomic-acq-rel.diff b/devel/openssl3/files/0003-dont-use-atomic-acq-rel.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index a5200457888..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/openssl3/files/0003-dont-use-atomic-acq-rel.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,94 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From ec7c1ca8794eb9f80542d8d1df33ca65554e58a0 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: Neil Horman <nhorman@openssl.org>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Thu, 13 Feb 2025 15:52:16 -0500
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] Don't use __ATOMIC_ACQ_REL on older compilers
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Older compilers don't always support __ATOMIC_ACQ_REL, use a lock where
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-they don't
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Reviewed-by: Tomas Mraz <tomas@openssl.org>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Reviewed-by: Bernd Edlinger <bernd.edlinger@hotmail.de>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-(Merged from https://github.com/openssl/openssl/pull/26747)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-(cherry picked from commit 7d284560a0624206356d46a948ab3a0b6f670c0e)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- crypto/threads_pthread.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ crypto/threads_pthread.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -90,7 +90,6 @@ __tsan_mutex_post_lock((x), 0, 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * fallback function names.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- typedef void *pvoid;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--typedef struct rcu_cb_item *prcu_cb_item;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # if defined(__GNUC__) && defined(__ATOMIC_ACQUIRE) && !defined(BROKEN_CLANG_ATOMICS) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     && !defined(USE_ATOMIC_FALLBACKS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -193,7 +192,6 @@ IMPL_fallback_atomic_store(pvoid)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         return ret;                                                     \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- IMPL_fallback_atomic_exchange_n(uint64_t)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--IMPL_fallback_atomic_exchange_n(prcu_cb_item)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #  define ATOMIC_EXCHANGE_N(t, p, v, o) fallback_atomic_exchange_n_##t(p, v)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -583,6 +581,10 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Note: This call assumes its made under the protection of
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * ossl_rcu_write_lock
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct rcu_cb_item *new =
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -593,13 +595,9 @@ int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     new->data = data;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     new->fn = cb;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * Use __ATOMIC_ACQ_REL here to indicate that any prior writes to this
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * list are visible to us prior to reading, and publish the new value
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * immediately
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    new->next = ATOMIC_EXCHANGE_N(prcu_cb_item, &lock->cb_items, new,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                  __ATOMIC_ACQ_REL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    new->next = lock->cb_items;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    lock->cb_items = new;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- crypto/threads_win.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ crypto/threads_win.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -365,7 +365,10 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct rcu_cb_item *cb_items, *tmpcb;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* before we do anything else, lets grab the cb list */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    cb_items = InterlockedExchangePointer((void * volatile *)&lock->cb_items, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ossl_crypto_mutex_lock(lock->write_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    cb_items = lock->cb_items;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    lock->cb_items = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ossl_crypto_mutex_unlock(lock->write_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     qp = update_qp(lock, &curr_id);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -398,6 +401,9 @@ void ossl_synchronize_rcu(CRYPTO_RCU_LOCK *lock)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Note, must be called under the protection of ossl_rcu_write_lock
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct rcu_cb_item *new;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -408,7 +414,9 @@ int ossl_rcu_call(CRYPTO_RCU_LOCK *lock, rcu_cb_fn cb, void *data)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     new->data = data;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     new->fn = cb;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    new->next = InterlockedExchangePointer((void * volatile *)&lock->cb_items, new);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    new->next = lock->cb_items;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    lock->cb_items = new;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span></pre><pre style='margin:0'>

</pre>