From: Martin Kroeker Date: Fri, 7 Mar 2025 12:48:28 +0000 (+0100) Subject: [PATCH] Improve thread safety of pthreads builds that rely on C11 atomic operations... X-Git-Tag: archive/raspbian/0.3.29+ds-3+rpi1^2~7 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e41c6c230c32fc3c8896ac3916e5544bcf0552f1;p=openblas.git [PATCH] Improve thread safety of pthreads builds that rely on C11 atomic operations for locking (#5170) * Tighten memory orders for C11 atomic operations Gbp-Pq: Name 39eb43d4410d0745ca2c78d1162d973abf3aa35b.patch --- diff --git a/driver/others/blas_server.c b/driver/others/blas_server.c index 7306a3e..4b79136 100644 --- a/driver/others/blas_server.c +++ b/driver/others/blas_server.c @@ -146,8 +146,8 @@ typedef struct { } thread_status_t; #ifdef HAVE_C11 -#define atomic_load_queue(p) __atomic_load_n(p, __ATOMIC_RELAXED) -#define atomic_store_queue(p, v) __atomic_store_n(p, v, __ATOMIC_RELAXED) +#define atomic_load_queue(p) __atomic_load_n(p, __ATOMIC_ACQUIRE) +#define atomic_store_queue(p, v) __atomic_store_n(p, v, __ATOMIC_RELEASE) #else #define atomic_load_queue(p) (blas_queue_t*)(*(volatile blas_queue_t**)(p)) #define atomic_store_queue(p, v) (*(volatile blas_queue_t* volatile*)(p) = (v)) @@ -637,7 +637,9 @@ int exec_blas_async(BLASLONG pos, blas_queue_t *queue){ #ifdef SMP_SERVER // Handle lazy re-init of the thread-pool after a POSIX fork + LOCK_COMMAND(&server_lock); if (unlikely(blas_server_avail == 0)) blas_thread_init(); + UNLOCK_COMMAND(&server_lock); #endif BLASLONG i = 0; blas_queue_t *current = queue;