summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Moenicke <thomas.moenicke@mapbox.com>2019-06-11 16:06:16 +0300
committerThomas Moenicke <thomas.moenicke@mapbox.com>2019-06-25 18:10:40 +0300
commit0990a8c3e943dc5d000f6df185fea43ba137bf3c (patch)
tree264adfb70337afae06b9ba34a5011cb57706df12
parentbd481b1d60132c1b7f8ab1ebd8e363802907f9d5 (diff)
downloadqtlocation-mapboxgl-upstream/tmoenicke-remove-threadlocal.tar.gz
use C++11 thread_local, ThreadLocal class as a fallback when thread_local not supportedupstream/tmoenicke-remove-threadlocal
-rw-r--r--CMakeLists.txt3
-rw-r--r--cmake/core.cmake1
-rw-r--r--cmake/test.cmake1
-rw-r--r--cmake/thread_local.cmake10
-rw-r--r--platform/android/src/run_loop.cpp1
-rw-r--r--platform/default/src/mbgl/util/run_loop.cpp1
-rw-r--r--platform/default/src/mbgl/util/thread_local.cpp22
-rw-r--r--src/mbgl/actor/scheduler.cpp2
-rw-r--r--src/mbgl/util/thread_local.hpp17
9 files changed, 53 insertions, 5 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ca33c36be2..f01f6e6941 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,6 +39,7 @@ include(cmake/vendor.cmake)
include(cmake/mason.cmake)
include(cmake/xcode.cmake)
include(cmake/doxygen.cmake)
+include(cmake/thread_local.cmake)
if(WITH_CXX11ABI)
set(MASON_CXXABI_SUFFIX -cxx11abi)
@@ -159,7 +160,7 @@ elseif(WIN32)
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
endif()
else()
- message(STATUS "Can't find ccache — consider installing ccache to improve recompilation performance")
+ message(STATUS "Can't find ccache — consider installing ccache to improve recompilation performance")
endif()
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/platform/${MBGL_PLATFORM}/config.cmake)
diff --git a/cmake/core.cmake b/cmake/core.cmake
index 1971352c37..ea44400f0b 100644
--- a/cmake/core.cmake
+++ b/cmake/core.cmake
@@ -5,6 +5,7 @@ add_library(mbgl-core STATIC ${MBGL_CORE_FILES})
target_include_directories(mbgl-core
PUBLIC include
PRIVATE src
+ PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/compilerchecks
)
target_link_libraries(mbgl-core PRIVATE
diff --git a/cmake/test.cmake b/cmake/test.cmake
index 16dc10f93d..de78e5f06b 100644
--- a/cmake/test.cmake
+++ b/cmake/test.cmake
@@ -22,6 +22,7 @@ target_include_directories(mbgl-test
PRIVATE test/include
PRIVATE test/src
PRIVATE platform/default/include
+ PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/compilerchecks
)
target_link_libraries(mbgl-test PRIVATE
diff --git a/cmake/thread_local.cmake b/cmake/thread_local.cmake
new file mode 100644
index 0000000000..e0031d8439
--- /dev/null
+++ b/cmake/thread_local.cmake
@@ -0,0 +1,10 @@
+include(WriteCompilerDetectionHeader)
+
+write_compiler_detection_header(
+ FILE "${CMAKE_CURRENT_BINARY_DIR}/compilerchecks/thread_local_compiler_detection.h"
+ PREFIX MB
+ COMPILERS GNU Clang AppleClang MSVC Intel
+ FEATURES cxx_thread_local
+)
+
+add_definitions(-DDETECT_THREAD_LOCAL)
diff --git a/platform/android/src/run_loop.cpp b/platform/android/src/run_loop.cpp
index 2966ecdfb0..6bc792a6e4 100644
--- a/platform/android/src/run_loop.cpp
+++ b/platform/android/src/run_loop.cpp
@@ -1,7 +1,6 @@
#include "run_loop_impl.hpp"
#include <mbgl/util/platform.hpp>
-#include <mbgl/util/thread_local.hpp>
#include <mbgl/util/thread.hpp>
#include <mbgl/util/timer.hpp>
#include <mbgl/actor/scheduler.hpp>
diff --git a/platform/default/src/mbgl/util/run_loop.cpp b/platform/default/src/mbgl/util/run_loop.cpp
index 868ee72114..dabba63cbe 100644
--- a/platform/default/src/mbgl/util/run_loop.cpp
+++ b/platform/default/src/mbgl/util/run_loop.cpp
@@ -1,6 +1,5 @@
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/async_task.hpp>
-#include <mbgl/util/thread_local.hpp>
#include <mbgl/actor/scheduler.hpp>
#include <uv.h>
diff --git a/platform/default/src/mbgl/util/thread_local.cpp b/platform/default/src/mbgl/util/thread_local.cpp
index 5fb66c3440..159a8e8e17 100644
--- a/platform/default/src/mbgl/util/thread_local.cpp
+++ b/platform/default/src/mbgl/util/thread_local.cpp
@@ -6,20 +6,33 @@
#include <pthread.h>
+#ifdef MB_COMPILER_CXX_THREAD_LOCAL
+#include <unordered_map>
+#endif
+
namespace mbgl {
namespace util {
namespace impl {
+#ifdef MB_COMPILER_CXX_THREAD_LOCAL
+namespace {
+thread_local std::unordered_map<void*, void*> mapOfPointers;
+}
+#endif
+
ThreadLocalBase::ThreadLocalBase() {
+#ifndef MB_COMPILER_CXX_THREAD_LOCAL
static_assert(sizeof(storage) >= sizeof(pthread_key_t), "storage is too small");
static_assert(alignof(decltype(storage)) % alignof(pthread_key_t) == 0, "storage is incorrectly aligned");
if (pthread_key_create(&reinterpret_cast<pthread_key_t&>(storage), nullptr) != 0) {
Log::Error(Event::General, "Failed to initialize thread-specific storage key");
abort();
}
+#endif
}
ThreadLocalBase::~ThreadLocalBase() {
+#ifndef MB_COMPILER_CXX_THREAD_LOCAL
// ThreadLocal will not take ownership of the pointer it is managing. The pointer
// needs to be explicitly cleared before we destroy this object.
assert(!get());
@@ -28,17 +41,26 @@ ThreadLocalBase::~ThreadLocalBase() {
Log::Error(Event::General, "Failed to delete thread-specific storage key");
abort();
}
+#endif
}
void* ThreadLocalBase::get() {
+#ifdef MB_COMPILER_CXX_THREAD_LOCAL
+ return mapOfPointers[this];
+#else
return pthread_getspecific(reinterpret_cast<pthread_key_t&>(storage));
+#endif
}
void ThreadLocalBase::set(void* ptr) {
+#ifdef MB_COMPILER_CXX_THREAD_LOCAL
+ mapOfPointers[this] = ptr;
+#else
if (pthread_setspecific(reinterpret_cast<pthread_key_t&>(storage), ptr) != 0) {
Log::Error(Event::General, "Failed to set thread-specific storage");
abort();
}
+#endif
}
} // namespace impl
diff --git a/src/mbgl/actor/scheduler.cpp b/src/mbgl/actor/scheduler.cpp
index cb0c7728ec..06a4c6a9fc 100644
--- a/src/mbgl/actor/scheduler.cpp
+++ b/src/mbgl/actor/scheduler.cpp
@@ -4,8 +4,6 @@
namespace mbgl {
-util::ThreadLocal<Scheduler> g_currentScheduler;
-
static auto& current() {
static util::ThreadLocal<Scheduler> scheduler;
return scheduler;
diff --git a/src/mbgl/util/thread_local.hpp b/src/mbgl/util/thread_local.hpp
index cf5579a2ba..84417e631c 100644
--- a/src/mbgl/util/thread_local.hpp
+++ b/src/mbgl/util/thread_local.hpp
@@ -2,6 +2,21 @@
#include <type_traits>
+#ifdef DETECT_THREAD_LOCAL
+#include "thread_local_compiler_detection.h"
+#endif
+
+#ifdef __APPLE__
+# include <TargetConditionals.h>
+# include <Availability.h>
+# if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0
+# undef MB_COMPILER_CXX_THREAD_LOCAL
+# endif
+# if defined(__i386__) && defined(TARGET_OS_SIMULATOR)
+# undef MB_COMPILER_CXX_THREAD_LOCAL
+# endif
+#endif
+
namespace mbgl {
namespace util {
namespace impl {
@@ -15,7 +30,9 @@ protected:
void set(void*);
private:
+#ifndef MB_COMPILER_CXX_THREAD_LOCAL
std::aligned_storage_t<sizeof(void*), alignof(void*)> storage;
+#endif
};
} // namespace impl