]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/libbenchmark/inc/libbenchmark/libbenchmark_porting_abstraction_layer_lock_msvc_spinlock.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / test_and_benchmark / libbenchmark / inc / libbenchmark / libbenchmark_porting_abstraction_layer_lock_msvc_spinlock.h
1 /****************************************************************************/
2 #if( defined _MSC_VER && _MSC_VER >= 1400 )
3
4   /* TRD : MSVC
5
6            _MSC_VER  indicates Microsoft C compiler
7                        - _InterlockedCompareExchangePointer requires 8.0 (1400)
8   */
9
10   /***** defines *****/
11   #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK 1
12
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
16
17   #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_CREATE( pal_lock_msvc_spinlock_state )  \
18   {                                                                                   \
19     pal_lock_msvc_spinlock_state = LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_AVAILABLE;     \
20     LFDS710_MISC_BARRIER_STORE;                                                       \
21     lfds710_misc_force_store();                                                       \
22   }
23
24   #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_DESTROY( pal_lock_msvc_spinlock_state )  \
25   {                                                                                    \
26     pal_lock_msvc_spinlock_state = LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_UNAVAILABLE;    \
27     LFDS710_MISC_BARRIER_STORE;                                                        \
28     lfds710_misc_force_store();                                                        \
29   }
30
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!*
33   */
34
35   #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_GET( pal_lock_msvc_spinlock_state )                                                                \
36   {                                                                                                                                              \
37     char unsigned                                                                                                                                \
38       result;                                                                                                                                    \
39                                                                                                                                                  \
40     lfds710_pal_uint_t                                                                                                                           \
41       compare;                                                                                                                                   \
42                                                                                                                                                  \
43     do                                                                                                                                           \
44     {                                                                                                                                            \
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 );  \
47     }                                                                                                                                            \
48     while( result == 0 );                                                                                                                        \
49   }
50
51   #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_RELEASE( pal_lock_msvc_spinlock_state )  \
52   {                                                                                    \
53     LFDS710_PAL_ATOMIC_SET( &(pal_lock_msvc_spinlock_state), LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_AVAILABLE );         \
54   }
55
56   /***** typedefs *****/
57   typedef lfds710_pal_uint_t pal_lock_msvc_spinlock_state;
58
59 #endif
60
61
62
63
64
65 /****************************************************************************/
66 #if( !defined LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK )
67
68   /***** defines *****/
69   #define LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK 0
70
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 )
75
76   /***** typedefs *****/
77   typedef void * pal_lock_msvc_spinlock_state;
78
79 #endif
80