Module: wine Branch: master Commit: 0d1345ac2bf5c9c4b36e34cd2a790c10dd2bbd08 URL: https://source.winehq.org/git/wine.git/?a=commit;h=0d1345ac2bf5c9c4b36e34cd2...
Author: Zebediah Figura z.figura12@gmail.com Date: Wed Jan 20 22:35:45 2021 -0600
include: Add InterlockedAnd().
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcrt/lock.c | 10 ---------- include/winnt.h | 12 ++++++++++++ 2 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/dlls/msvcrt/lock.c b/dlls/msvcrt/lock.c index c10445becda..74156aa7db3 100644 --- a/dlls/msvcrt/lock.c +++ b/dlls/msvcrt/lock.c @@ -1157,16 +1157,6 @@ static inline void spin_wait_for_next_rwl(rwl_queue *q) SpinWait_dtor(&sw); }
-static LONG InterlockedAnd(LONG *d, LONG v) -{ - LONG l = *d, old; - while ((l & v) != l) { - if((old = InterlockedCompareExchange(d, l&v, l)) == l) break; - l = old; - } - return l; -} - /* ?lock@reader_writer_lock@Concurrency@@QAEXXZ */ /* ?lock@reader_writer_lock@Concurrency@@QEAAXXZ */ DEFINE_THISCALL_WRAPPER(reader_writer_lock_lock, 4) diff --git a/include/winnt.h b/include/winnt.h index 8834ced73e6..b03f7bb3646 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -6896,6 +6896,7 @@ static inline BOOLEAN BitScanReverse(DWORD *index, DWORD mask)
#ifdef _MSC_VER
+#pragma intrinsic(_InterlockedAnd) #pragma intrinsic(_InterlockedCompareExchange) #pragma intrinsic(_InterlockedCompareExchange64) #ifdef _WIN64 @@ -6907,6 +6908,7 @@ static inline BOOLEAN BitScanReverse(DWORD *index, DWORD mask) #pragma intrinsic(_InterlockedDecrement) #pragma intrinsic(_InterlockedOr)
+long _InterlockedAnd(long volatile *,long); long _InterlockedCompareExchange(long volatile*,long,long); long long _InterlockedCompareExchange64(long long volatile*,long long,long long); #ifdef _WIN64 @@ -6918,6 +6920,11 @@ long _InterlockedExchangeAdd(long volatile*,long); long _InterlockedIncrement(long volatile*); long _InterlockedOr(long volatile *,long);
+static FORCEINLINE LONG WINAPI InterlockedAnd( LONG volatile *dest, LONG val ) +{ + return _InterlockedAnd( (long volatile *)dest, val ); +} + static FORCEINLINE LONG WINAPI InterlockedCompareExchange( LONG volatile *dest, LONG xchg, LONG compare ) { return _InterlockedCompareExchange( (long volatile *)dest, xchg, compare ); @@ -7030,6 +7037,11 @@ static FORCEINLINE void MemoryBarrier(void)
#elif defined(__GNUC__)
+static FORCEINLINE LONG WINAPI InterlockedAnd( LONG volatile *dest, LONG val ) +{ + return __sync_fetch_and_and( dest, val ); +} + static FORCEINLINE LONG WINAPI InterlockedCompareExchange( LONG volatile *dest, LONG xchg, LONG compare ) { return __sync_val_compare_and_swap( dest, compare, xchg );