|
struct | temptable::Lock_free_type_selector< T, V > |
| Lock-free type selector, a helper utility which evaluates during the compile-time whether the given type T has a property of being always-lock-free for given platform. More...
|
|
struct | temptable::Lock_free_type_selector< T, typename std::enable_if< std::is_class< T >::value and std::is_trivially_copyable< T >::value >::type > |
| Template-specialization for trivially-copyable classes/structs. More...
|
|
struct | temptable::Lock_free_type_selector< T, typename std::enable_if< std::is_pointer< T >::value >::type > |
| Template-specialization for pointer types. More...
|
|
struct | temptable::Lock_free_type_selector< T, typename std::enable_if< std::is_same< T, long long >::value or std::is_same< T, unsigned long long >::value >::type > |
| Template-specialization for long long types. More...
|
|
struct | temptable::Lock_free_type_selector< T, typename std::enable_if< std::is_same< T, long >::value or std::is_same< T, unsigned long >::value >::type > |
| Template-specialization for long types. More...
|
|
struct | temptable::Lock_free_type_selector< T, typename std::enable_if< std::is_same< T, int >::value or std::is_same< T, unsigned int >::value >::type > |
| Template-specialization for int types. More...
|
|
struct | temptable::Lock_free_type_selector< T, typename std::enable_if< std::is_same< T, short >::value or std::is_same< T, unsigned short >::value >::type > |
| Template-specialization for short types. More...
|
|
struct | temptable::Lock_free_type_selector< T, typename std::enable_if< std::is_same< T, char >::value or std::is_same< T, unsigned char >::value >::type > |
| Template-specialization for char types. More...
|
|
struct | temptable::Lock_free_type_selector< T, typename std::enable_if< std::is_same< T, bool >::value >::type > |
| Template-specialization for boolean types. More...
|
|
struct | temptable::Largest_lock_free_type_selector< T, V > |
| Largest lock-free type selector, a helper utility very much similar to Lock_free_type_selector with the difference being that it tries hard not to fail. More...
|
|
struct | temptable::Largest_lock_free_type_selector< T, typename std::enable_if< std::is_pointer< T >::value >::type > |
| Template-specialization for pointer types. More...
|
|
struct | temptable::Largest_lock_free_type_selector< T, typename std::enable_if< std::is_integral< T >::value >::type > |
| Template-specialization for integral types. More...
|
|
struct | temptable::Lock_free_type< T, ALIGN, TypeSelector > |
| Representation of an atomic type which is guaranteed to be always-lock-free. More...
|
|
struct | temptable::Lock_free_type< T, Alignment::L1_DCACHE_SIZE, TypeSelector > |
|
Lock-free type (selection) implementation.
#define WORKAROUND_PR31864_CLANG_BUG (0) |
Clang has a bug which causes ATOMIC_LLONG_LOCK_FREE to be defined as 1 (or "sometimes lock-free") in 32-bit builds even though __atomic_always_lock_free returns true for the same type on the same platform.
This is an inconsistency which can be easily verified by:
% clang -dM -E -x c /dev/null | grep LLONG_LOCK define __CLANG_ATOMIC_LLONG_LOCK_FREE 2 define __GCC_ATOMIC_LLONG_LOCK_FREE 2
% clang -m32 -dM -E -x c /dev/null | grep LLONG_LOCK define __CLANG_ATOMIC_LLONG_LOCK_FREE 1 define __GCC_ATOMIC_LLONG_LOCK_FREE 1
% gcc -dM -E -x c /dev/null | grep LLONG_LOCK define __GCC_ATOMIC_LLONG_LOCK_FREE 2
% gcc -m32 -dM -E -x c /dev/null | grep LLONG_LOCK define __GCC_ATOMIC_LLONG_LOCK_FREE 2
There has been some work towards fixing this issue:
Some more links: