]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/libbenchmark/inc/libbenchmark/libbenchmark_porting_abstraction_layer_lock_gcc_spinlock_atomic.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_gcc_spinlock_atomic.h
1 /****************************************************************************/
2 #if( defined __GNUC__ && LIBLFDS_GCC_VERSION >= 473 )
3
4   /***** defines *****/
5   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC 1
6
7   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_UNINITIALIZED  0
8   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_AVAILABLE      1
9   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_UNAVAILABLE    2
10
11   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_CREATE( pal_lock_gcc_spinlock_atomic_state )  \
12   {                                                                                               \
13     (pal_lock_gcc_spinlock_atomic_state) = LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_AVAILABLE;   \
14     LFDS710_MISC_BARRIER_STORE;                                                                   \
15     lfds710_misc_force_store();                                                                   \
16   }
17
18   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_DESTROY( pal_lock_gcc_spinlock_atomic_state )  \
19   {                                                                                                \
20     (pal_lock_gcc_spinlock_atomic_state) = LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_UNAVAILABLE;  \
21     LFDS710_MISC_BARRIER_STORE;                                                                    \
22     lfds710_misc_force_store();                                                                    \
23   }
24
25   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_GET( pal_lock_gcc_spinlock_atomic_state )                                                                                                                                                                                                             \
26   {                                                                                                                                                                                                                                                                                                       \
27     lfds710_pal_uint_t expected = (lfds710_pal_uint_t) LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_AVAILABLE;                                                                                                                                                                                               \
28     while( 0 == __atomic_compare_exchange_n(&(pal_lock_gcc_spinlock_atomic_state), &expected, (lfds710_pal_uint_t) LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_UNAVAILABLE, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED) )  expected = (lfds710_pal_uint_t) LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_AVAILABLE;  \
29   }
30
31   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_RELEASE( pal_lock_gcc_spinlock_atomic_state )  __atomic_exchange_n( &(pal_lock_gcc_spinlock_atomic_state), (void *) LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_AVAILABLE, __ATOMIC_RELAXED )
32
33   /***** typedefs *****/
34   typedef lfds710_pal_uint_t pal_lock_gcc_spinlock_atomic_state;
35
36 #endif
37
38
39
40
41
42 /****************************************************************************/
43 #if( !defined LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC )
44
45   /***** defines *****/
46   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC 0
47
48   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_CREATE( pal_lock_gcc_spinlock_atomic_state )
49   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_DESTROY( pal_lock_gcc_spinlock_atomic_state )
50   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_GET( pal_lock_gcc_spinlock_atomic_state )
51   #define LIBBENCHMARK_PAL_LOCK_GCC_SPINLOCK_ATOMIC_RELEASE( pal_lock_gcc_spinlock_atomic_state )
52
53   /***** typedefs *****/
54   typedef void * pal_lock_gcc_spinlock_atomic_state;
55
56 #endif
57