Module: wine Branch: master Commit: 09dd801291db78ede8515081e8837f562dc1a908 URL: https://source.winehq.org/git/wine.git/?a=commit;h=09dd801291db78ede8515081e...
Author: Zebediah Figura zfigura@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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;