From 92efe426265df2263e6aba490a01d95db040ec52 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 31 Jan 2016 15:43:53 +0200 Subject: [PATCH] Thread safe atomic operations. --- include/sysdeps.h | 6 ++++++ od-win32/posixemu.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/sysdeps.h b/include/sysdeps.h index 9d0f7de3..c95aed82 100644 --- a/include/sysdeps.h +++ b/include/sysdeps.h @@ -215,6 +215,12 @@ typedef uae_u32 uaecptr; #define UVAL64(a) (a ## ul) #endif +void atomic_and(volatile uae_atomic *p, uae_u32 v); +void atomic_or(volatile uae_atomic *p, uae_u32 v); +uae_atomic atomic_inc(volatile uae_atomic *p); +uae_atomic atomic_dec(volatile uae_atomic *p); +uae_u32 atomic_bit_test_and_reset(volatile uae_atomic *p, uae_u32 v); + #ifdef HAVE_STRDUP #define my_strdup _tcsdup #else diff --git a/od-win32/posixemu.cpp b/od-win32/posixemu.cpp index 6b889526..30163179 100644 --- a/od-win32/posixemu.cpp +++ b/od-win32/posixemu.cpp @@ -243,4 +243,29 @@ void uae_set_thread_priority (uae_thread_id *tid, int pri) } } +void atomic_and(volatile uae_atomic *p, uae_u32 v) +{ + _InterlockedAnd(p, v); +} +void atomic_or(volatile uae_atomic *p, uae_u32 v) +{ + _InterlockedOr(p, v); +} +void atomic_set(volatile uae_atomic *p, uae_u32 v) +{ +} +uae_atomic atomic_inc(volatile uae_atomic *p) +{ + return _InterlockedIncrement(p); +} +uae_atomic atomic_dec(volatile uae_atomic *p) +{ + return _InterlockedDecrement(p); +} + +uae_u32 atomic_bit_test_and_reset(volatile uae_atomic *p, uae_u32 v) +{ + return _interlockedbittestandreset(p, v); +} #endif + -- 2.47.3