Addressing OE linking issues when built with GCC (#167)
* Use C++17 inline statics This leads to better codegen in GCC, and fixes some linking issues in OE. * Detect GCC and OE combination and fall-back to lock based ABA. * clangformat
This commit is contained in:
committed by
GitHub
parent
c09b2468f9
commit
cf9c2eb9d9
10
src/ds/aba.h
10
src/ds/aba.h
@@ -7,7 +7,8 @@
|
||||
* implementable with double-word compare and exchange or with load-link
|
||||
* store conditional.
|
||||
*
|
||||
* We provide a lock based implementation.
|
||||
* We provide a lock based implementation as a backup for other platforms
|
||||
* without appropriate intrinsics.
|
||||
*/
|
||||
namespace snmalloc
|
||||
{
|
||||
@@ -16,7 +17,12 @@ namespace snmalloc
|
||||
// check this on other platforms using a thread_local.
|
||||
inline thread_local bool operation_in_flight = false;
|
||||
#endif
|
||||
#ifdef PLATFORM_IS_X86
|
||||
// The !(defined(GCC_NOT_CLANG) && defined(OPEN_ENCLAVE)) is required as
|
||||
// GCC is outputing a function call to libatomic, rather than just the x86
|
||||
// instruction, this causes problems for linking later. For this case
|
||||
// fall back to locked implementation.
|
||||
#if defined(PLATFORM_IS_X86) && \
|
||||
!(defined(GCC_NOT_CLANG) && defined(OPEN_ENCLAVE))
|
||||
template<typename T, Construction c = RequiresInit>
|
||||
class ABA
|
||||
{
|
||||
|
||||
@@ -19,6 +19,10 @@
|
||||
#endif
|
||||
|
||||
#if !defined(__clang__) && defined(__GNUC__)
|
||||
# define GCC_NOT_CLANG
|
||||
#endif
|
||||
|
||||
#ifdef GCC_NOT_CLANG
|
||||
# if __GNUC__ >= 8
|
||||
# define GCC_VERSION_EIGHT_PLUS
|
||||
# endif
|
||||
|
||||
@@ -13,18 +13,18 @@ namespace snmalloc
|
||||
template<class Object, Object init() noexcept>
|
||||
class Singleton
|
||||
{
|
||||
inline static std::atomic_flag flag;
|
||||
inline static std::atomic<bool> initialised = false;
|
||||
inline static Object obj;
|
||||
|
||||
public:
|
||||
/**
|
||||
* If argument is non-null, then it is assigned the value
|
||||
* true, if this is the first call to get.
|
||||
* At most one call will be first.
|
||||
*/
|
||||
inline static Object& get(bool* first = nullptr)
|
||||
inline SNMALLOC_SLOW_PATH static Object& get(bool* first = nullptr)
|
||||
{
|
||||
static std::atomic_flag flag;
|
||||
static std::atomic<bool> initialised;
|
||||
static Object obj;
|
||||
|
||||
// If defined should be initially false;
|
||||
SNMALLOC_ASSERT(first == nullptr || *first == false);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user