mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-20 14:09:32 +03:00
Merge fce0c16ce1
into dd7348066f
This commit is contained in:
commit
990779326f
4 changed files with 58 additions and 0 deletions
|
@ -25,6 +25,7 @@ option(MI_BUILD_TESTS "Build test executables" ON)
|
||||||
option(MI_DEBUG_TSAN "Build with thread sanitizer (needs clang)" OFF)
|
option(MI_DEBUG_TSAN "Build with thread sanitizer (needs clang)" OFF)
|
||||||
option(MI_DEBUG_UBSAN "Build with undefined-behavior sanitizer (needs clang++)" OFF)
|
option(MI_DEBUG_UBSAN "Build with undefined-behavior sanitizer (needs clang++)" OFF)
|
||||||
option(MI_SKIP_COLLECT_ON_EXIT, "Skip collecting memory on program exit" OFF)
|
option(MI_SKIP_COLLECT_ON_EXIT, "Skip collecting memory on program exit" OFF)
|
||||||
|
option(MI_ATOMIC_FOR_GCC485 "Build with custom stdatomic.h for gcc-4.8.5" OFF)
|
||||||
|
|
||||||
# deprecated options
|
# deprecated options
|
||||||
option(MI_CHECK_FULL "Use full internal invariant checking in DEBUG mode (deprecated, use MI_DEBUG_FULL instead)" OFF)
|
option(MI_CHECK_FULL "Use full internal invariant checking in DEBUG mode (deprecated, use MI_DEBUG_FULL instead)" OFF)
|
||||||
|
@ -194,6 +195,11 @@ if(MI_SHOW_ERRORS)
|
||||||
list(APPEND mi_defines MI_SHOW_ERRORS=1)
|
list(APPEND mi_defines MI_SHOW_ERRORS=1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(MI_ATOMIC_FOR_GCC485)
|
||||||
|
message(STATUS "Enable using cumstom stdatomic.h file for gcc 4.8.5 (MI_ATOMIC_FOR_GCC485=ON)")
|
||||||
|
list(APPEND mi_defines MI_ATOMIC_FOR_GCC485=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(MI_DEBUG_TSAN)
|
if(MI_DEBUG_TSAN)
|
||||||
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||||
message(STATUS "Build with thread sanitizer (MI_DEBUG_TSAN=ON)")
|
message(STATUS "Build with thread sanitizer (MI_DEBUG_TSAN=ON)")
|
||||||
|
|
43
include/gcc-4.8.5-atomic.h
Normal file
43
include/gcc-4.8.5-atomic.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/**
|
||||||
|
* @file gcc-4.8.5-atomic.h
|
||||||
|
*
|
||||||
|
* @author shadow-yuan (shadow_yuan@qq.com)
|
||||||
|
*
|
||||||
|
* @brief because gcc-4.8.5 does not include the file stdatomic.h
|
||||||
|
* so add this file to pass the compilation
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef MI_FOR_GCC_485_ATOMIC_H_
|
||||||
|
#define MI_FOR_GCC_485_ATOMIC_H_
|
||||||
|
|
||||||
|
#define memory_order_relaxed __ATOMIC_RELAXED
|
||||||
|
#define memory_order_consume __ATOMIC_CONSUME
|
||||||
|
#define memory_order_acquire __ATOMIC_ACQUIRE
|
||||||
|
#define memory_order_release __ATOMIC_RELEASE
|
||||||
|
#define memory_order_acq_rel __ATOMIC_ACQ_REL
|
||||||
|
#define memory_order_seq_cst __ATOMIC_SEQ_CST
|
||||||
|
|
||||||
|
#define _Atomic(x) x
|
||||||
|
|
||||||
|
#define __has_include(x) (1)
|
||||||
|
|
||||||
|
#define atomic_load_explicit(p, m) __atomic_load_n(p, m)
|
||||||
|
#define atomic_store_explicit(p, x, m) __atomic_store_n(p, x, m)
|
||||||
|
|
||||||
|
#define atomic_exchange(p, x) __atomic_exchange_n(p, x, memory_order_seq_cst)
|
||||||
|
#define atomic_exchange_explicit(p, x, m) __atomic_exchange_n(p, x, m)
|
||||||
|
|
||||||
|
#define atomic_compare_exchange_weak_explicit(p, expected, desired, mem_success, mem_fail) \
|
||||||
|
__atomic_compare_exchange_n(p, expected, desired, 1, mem_success, mem_fail)
|
||||||
|
|
||||||
|
#define atomic_compare_exchange_strong_explicit(p, expected, desired, mem_success, mem_fail) \
|
||||||
|
__atomic_compare_exchange_n(p, expected, desired, 0, mem_success, mem_fail)
|
||||||
|
|
||||||
|
#define atomic_fetch_add_explicit(p, x, m) __atomic_fetch_add(p, x, m)
|
||||||
|
#define atomic_fetch_sub_explicit(p, x, m) __atomic_fetch_sub(p, x, m)
|
||||||
|
#define atomic_fetch_and_explicit(p, x, m) __atomic_fetch_and(p, x, m)
|
||||||
|
#define atomic_fetch_or_explicit(p, x, m) __atomic_fetch_or(p, x, m)
|
||||||
|
|
||||||
|
#define ATOMIC_VAR_INIT(x) (x)
|
||||||
|
|
||||||
|
#endif // MI_FOR_GCC_485_ATOMIC_H_
|
|
@ -34,6 +34,11 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
#define MI_ATOMIC_VAR_INIT(x) x
|
#define MI_ATOMIC_VAR_INIT(x) x
|
||||||
#define mi_atomic(name) mi_atomic_##name
|
#define mi_atomic(name) mi_atomic_##name
|
||||||
#define mi_memory_order(name) mi_memory_order_##name
|
#define mi_memory_order(name) mi_memory_order_##name
|
||||||
|
#elif defined(MI_ATOMIC_FOR_GCC485)
|
||||||
|
#include <gcc-4.8.5-atomic.h>
|
||||||
|
#define mi_atomic(name) atomic_##name
|
||||||
|
#define mi_memory_order(name) memory_order_##name
|
||||||
|
#define MI_ATOMIC_VAR_INIT(x) x
|
||||||
#else
|
#else
|
||||||
// Use C11 atomics
|
// Use C11 atomics
|
||||||
#include <stdatomic.h>
|
#include <stdatomic.h>
|
||||||
|
|
|
@ -336,7 +336,11 @@ static void* atomic_exchange_ptr(volatile void** p, void* newval) {
|
||||||
return std::atomic_exchange((volatile std::atomic<void*>*)p, newval);
|
return std::atomic_exchange((volatile std::atomic<void*>*)p, newval);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
#if defined(MI_ATOMIC_FOR_GCC485)
|
||||||
|
#include <gcc-4.8.5-atomic.h>
|
||||||
|
#else
|
||||||
#include <stdatomic.h>
|
#include <stdatomic.h>
|
||||||
|
#endif
|
||||||
static void* atomic_exchange_ptr(volatile void** p, void* newval) {
|
static void* atomic_exchange_ptr(volatile void** p, void* newval) {
|
||||||
return atomic_exchange((volatile _Atomic(void*)*)p, newval);
|
return atomic_exchange((volatile _Atomic(void*)*)p, newval);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue