Home | History | Annotate | Download | only in include
      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