1 /****************************************************************************/
2 #if( defined _MSC_VER && _MSC_VER >= 1400 )
6 _MSC_VER indicates Microsoft C compiler
7 - _InterlockedCompareExchangePointer requires 8.0 (1400)
11 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK 1
13 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_UNINITIALIZED 0
14 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_AVAILABLE 1
15 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_UNAVAILABLE 2
17 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_CREATE( pal_lock_msvc_spinlock_state ) \
19 pal_lock_msvc_spinlock_state = LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_AVAILABLE; \
20 LFDS710_MISC_BARRIER_STORE; \
21 lfds710_misc_force_store(); \
24 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_DESTROY( pal_lock_msvc_spinlock_state ) \
26 pal_lock_msvc_spinlock_state = LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_UNAVAILABLE; \
27 LFDS710_MISC_BARRIER_STORE; \
28 lfds710_misc_force_store(); \
31 /* TRD : bloody MS - they have multiple functions for the same thing
32 I have to use my own abstraction layer *just to get my code working on MS platforms!*
35 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_GET( pal_lock_msvc_spinlock_state ) \
45 compare = LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_AVAILABLE; \
46 LFDS710_PAL_ATOMIC_CAS( &(pal_lock_msvc_spinlock_state), &compare, LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_UNAVAILABLE, LFDS710_MISC_CAS_STRENGTH_STRONG, result ); \
48 while( result == 0 ); \
51 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_RELEASE( pal_lock_msvc_spinlock_state ) \
53 LFDS710_PAL_ATOMIC_SET( &(pal_lock_msvc_spinlock_state), LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_AVAILABLE ); \
56 /***** typedefs *****/
57 typedef lfds710_pal_uint_t pal_lock_msvc_spinlock_state;
65 /****************************************************************************/
66 #if( !defined LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK )
69 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK 0
71 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_CREATE( pal_lock_msvc_spinlock_state )
72 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_DESTROY( pal_lock_msvc_spinlock_state )
73 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_GET( pal_lock_msvc_spinlock_state )
74 #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_RELEASE( pal_lock_msvc_spinlock_state )
76 /***** typedefs *****/
77 typedef void * pal_lock_msvc_spinlock_state;