Zebediah Figura : server: Add helper functions to perform atomic stores.

Alexandre Julliard julliard at winehq.org
Mon Sep 6 16:15:04 CDT 2021


Module: wine
Branch: master
Commit: 09dd801291db78ede8515081e8837f562dc1a908
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=09dd801291db78ede8515081e8837f562dc1a908

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Fri Sep  3 16:15:26 2021 -0500

server: Add helper functions to perform atomic stores.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 server/fd.c | 63 ++++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 33 insertions(+), 30 deletions(-)

diff --git a/server/fd.c b/server/fd.c
index 7a88f412c7a..8ef01e0ce40 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -385,43 +385,46 @@ timeout_t monotonic_time;
 struct _KUSER_SHARED_DATA *user_shared_data = NULL;
 static const int user_shared_data_timeout = 16;
 
-static void set_user_shared_data_time(void)
+static void atomic_store_ulong(volatile ULONG *ptr, ULONG value)
 {
-    timeout_t tick_count = monotonic_time / 10000;
+    /* on x86 there should be total store order guarantees, so volatile is
+     * enough to ensure the stores aren't reordered by the compiler, and then
+     * they will always be seen in-order from other CPUs. On other archs, we
+     * need atomic intrinsics to guarantee that. */
+#if defined(__i386__) || defined(__x86_64__)
+    *ptr = value;
+#else
+    __atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
+#endif
+}
 
-    /* on X86 there should be total store order guarantees, so volatile is enough
-     * to ensure the stores aren't reordered by the compiler, and then they will
-     * always be seen in-order from other CPUs. On other archs, we need atomic
-     * intrinsics to guarantee that. */
+static void atomic_store_long(volatile LONG *ptr, LONG value)
+{
 #if defined(__i386__) || defined(__x86_64__)
-    user_shared_data->SystemTime.High2Time = current_time >> 32;
-    user_shared_data->SystemTime.LowPart   = current_time;
-    user_shared_data->SystemTime.High1Time = current_time >> 32;
-
-    user_shared_data->InterruptTime.High2Time = monotonic_time >> 32;
-    user_shared_data->InterruptTime.LowPart   = monotonic_time;
-    user_shared_data->InterruptTime.High1Time = monotonic_time >> 32;
-
-    user_shared_data->TickCount.High2Time = tick_count >> 32;
-    user_shared_data->TickCount.LowPart   = tick_count;
-    user_shared_data->TickCount.High1Time = tick_count >> 32;
-    *(volatile ULONG *)&user_shared_data->TickCountLowDeprecated = tick_count;
+    *ptr = value;
 #else
-    __atomic_store_n(&user_shared_data->SystemTime.High2Time, current_time >> 32, __ATOMIC_SEQ_CST);
-    __atomic_store_n(&user_shared_data->SystemTime.LowPart, current_time, __ATOMIC_SEQ_CST);
-    __atomic_store_n(&user_shared_data->SystemTime.High1Time, current_time >> 32, __ATOMIC_SEQ_CST);
-
-    __atomic_store_n(&user_shared_data->InterruptTime.High2Time, monotonic_time >> 32, __ATOMIC_SEQ_CST);
-    __atomic_store_n(&user_shared_data->InterruptTime.LowPart, monotonic_time, __ATOMIC_SEQ_CST);
-    __atomic_store_n(&user_shared_data->InterruptTime.High1Time, monotonic_time >> 32, __ATOMIC_SEQ_CST);
-
-    __atomic_store_n(&user_shared_data->TickCount.High2Time, tick_count >> 32, __ATOMIC_SEQ_CST);
-    __atomic_store_n(&user_shared_data->TickCount.LowPart, tick_count, __ATOMIC_SEQ_CST);
-    __atomic_store_n(&user_shared_data->TickCount.High1Time, tick_count >> 32, __ATOMIC_SEQ_CST);
-    __atomic_store_n(&user_shared_data->TickCountLowDeprecated, tick_count, __ATOMIC_SEQ_CST);
+    __atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
 #endif
 }
 
+static void set_user_shared_data_time(void)
+{
+    timeout_t tick_count = monotonic_time / 10000;
+
+    atomic_store_long(&user_shared_data->SystemTime.High2Time, current_time >> 32);
+    atomic_store_ulong(&user_shared_data->SystemTime.LowPart, current_time);
+    atomic_store_long(&user_shared_data->SystemTime.High1Time, current_time >> 32);
+
+    atomic_store_long(&user_shared_data->InterruptTime.High2Time, monotonic_time >> 32);
+    atomic_store_ulong(&user_shared_data->InterruptTime.LowPart, monotonic_time);
+    atomic_store_long(&user_shared_data->InterruptTime.High1Time, monotonic_time >> 32);
+
+    atomic_store_long(&user_shared_data->TickCount.High2Time, tick_count >> 32);
+    atomic_store_ulong(&user_shared_data->TickCount.LowPart, tick_count);
+    atomic_store_long(&user_shared_data->TickCount.High1Time, tick_count >> 32);
+    atomic_store_ulong(&user_shared_data->TickCountLowDeprecated, tick_count);
+}
+
 void set_current_time(void)
 {
     static const timeout_t ticks_1601_to_1970 = (timeout_t)86400 * (369 * 365 + 89) * TICKS_PER_SEC;




More information about the wine-cvs mailing list