--- a/atomic/unix/mutex64.c 2023/02/09 12:45:02 1907540
+++ b/atomic/unix/mutex64.c 2023/02/09 13:36:18 1907541
@@ -96,7 +96,26 @@
APR_DECLARE(apr_uint64_t) apr_atomic_read64(volatile apr_uint64_t *mem)
{
+ /* On 32bit CPUs this loads with two instructions (tearing),
+ * so a lock is needed to ensure atomicity.
+ *
+ * APR_SIZEOF_VOIDP is probably not the right check for 32 vs 64 bits CPUs
+ * but it spares an (hardly-)exhaustive list of supported CPUs (and using
+ * assembly). If APR_SIZEOF_VOIDP==4 means that the compiler generates
+ * 32bit instructions (-m32 or whatever) then it's the right check though.
+ */
+#if APR_SIZEOF_VOIDP >= 8
return *mem;
+#else
+ apr_uint64_t cur_value;
+ DECLARE_MUTEX_LOCKED(mutex, mem);
+
+ cur_value = *mem;
+
+ MUTEX_UNLOCK(mutex);
+
+ return cur_value;
+#endif
}
APR_DECLARE(void) apr_atomic_set64(volatile apr_uint64_t *mem, apr_uint64_t val)