1 /** 2 * This file is part of the mingw-w64 runtime package. 3 * No warranty is given; refer to the file DISCLAIMER within this package. 4 */ 5 #ifndef _INTERLOCKAPI_H_ 6 #define _INTERLOCKAPI_H_ 7 8 #include <apiset.h> 9 #include <apisetcconv.h> 10 #include <minwindef.h> 11 12 #ifdef __cplusplus 13 extern "C" { 14 #endif 15 16 #if !defined (NOWINBASEINTERLOCK) && !defined (_NTOS_) 17 #if !defined (__x86_64__) && !defined (__ia64__) && !defined (__arm__) 18 WINBASEAPI LONG WINAPI InterlockedIncrement (LONG volatile *lpAddend); 19 WINBASEAPI LONG WINAPI InterlockedDecrement (LONG volatile *lpAddend); 20 WINBASEAPI LONG WINAPI InterlockedExchange (LONG volatile *Target, LONG Value); 21 WINBASEAPI LONG WINAPI InterlockedExchangeAdd (LONG volatile *Addend, LONG Value); 22 WINBASEAPI LONG WINAPI InterlockedCompareExchange (LONG volatile *Destination, LONG Exchange, LONG Comperand); 23 WINBASEAPI LONGLONG WINAPI InterlockedCompareExchange64 (LONGLONG volatile *Destination, LONGLONG Exchange, LONGLONG Comperand); 24 25 #define InterlockedExchangePointer(Target, Value) (PVOID)InterlockedExchange ((PLONG) (Target),((LONG) (LONG_PTR) (Value))) 26 #define InterlockedExchangePointerNoFence InterlockedExchangePointer 27 28 #if defined(__MINGW_INTRIN_INLINE) && (defined(__GNUC__) && (__MINGW_GNUC_PREREQ(4, 9) || (__MINGW_GNUC_PREREQ(4, 8) && __GNUC_PATCHLEVEL__ >= 2))) 29 __MINGW_INTRIN_INLINE LONG WINAPI InterlockedIncrement(LONG volatile *lpAddend) { 30 return _InterlockedIncrement(lpAddend); 31 } 32 __MINGW_INTRIN_INLINE LONG WINAPI InterlockedDecrement(LONG volatile *lpAddend) { 33 return _InterlockedDecrement(lpAddend); 34 } 35 __MINGW_INTRIN_INLINE LONG WINAPI InterlockedExchange(LONG volatile *Target, LONG Value) { 36 return _InterlockedExchange(Target, Value); 37 } 38 __MINGW_INTRIN_INLINE LONG WINAPI InterlockedExchangeAdd(LONG volatile *Addend, LONG Value) { 39 return _InterlockedExchangeAdd(Addend, Value); 40 } 41 __MINGW_INTRIN_INLINE LONG WINAPI InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG Comperand) { 42 return _InterlockedCompareExchange(Destination, Exchange, Comperand); 43 } 44 __MINGW_INTRIN_INLINE LONGLONG WINAPI InterlockedCompareExchange64(LONGLONG volatile *Destination, LONGLONG Exchange, LONGLONG Comperand) { 45 return _InterlockedCompareExchange64(Destination, Exchange, Comperand); 46 } 47 #endif 48 #endif 49 50 #if defined (_SLIST_HEADER_) && !defined (_NTOSP_) 51 WINBASEAPI VOID WINAPI InitializeSListHead (PSLIST_HEADER ListHead); 52 WINBASEAPI PSLIST_ENTRY WINAPI InterlockedPopEntrySList (PSLIST_HEADER ListHead); 53 WINBASEAPI PSLIST_ENTRY WINAPI InterlockedPushEntrySList (PSLIST_HEADER ListHead, PSLIST_ENTRY ListEntry); 54 WINBASEAPI PSLIST_ENTRY WINAPI InterlockedFlushSList (PSLIST_HEADER ListHead); 55 WINBASEAPI USHORT WINAPI QueryDepthSList (PSLIST_HEADER ListHead); 56 57 #if NTDDI_VERSION >= 0x06020000 58 #define InterlockedPushListSList InterlockedPushListSListEx 59 60 WINBASEAPI PSLIST_ENTRY WINAPI InterlockedPushListSListEx (PSLIST_HEADER ListHead, PSLIST_ENTRY List, PSLIST_ENTRY ListEnd, ULONG Count); 61 #endif 62 #endif 63 #endif 64 65 #ifdef __cplusplus 66 } 67 #endif 68 #endif 69