Skip to content

Commit

Permalink
Addressing OE linking issues when built with GCC (#167)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
mjp41 authored Apr 10, 2020
1 parent c09b246 commit cf9c2eb
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 7 deletions.
10 changes: 8 additions & 2 deletions src/ds/aba.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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
{
Expand Down
4 changes: 4 additions & 0 deletions src/ds/defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 5 additions & 5 deletions src/ds/helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit cf9c2eb

Please sign in to comment.