10 #ifndef EIGEN_CXX11_THREADPOOL_THREAD_LOCAL_H
11 #define EIGEN_CXX11_THREADPOOL_THREAD_LOCAL_H
13 #ifdef EIGEN_AVOID_THREAD_LOCAL
15 #ifdef EIGEN_THREAD_LOCAL
16 #undef EIGEN_THREAD_LOCAL
21 #if ((EIGEN_COMP_GNUC) || __has_feature(cxx_thread_local) || EIGEN_COMP_MSVC)
22 #define EIGEN_THREAD_LOCAL static thread_local
26 #if defined(__APPLE__)
29 #include <Availability.h>
30 #include <TargetConditionals.h>
34 #if EIGEN_COMP_CLANGAPPLE && \
35 ((EIGEN_COMP_CLANGAPPLE < 8000042) || (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0))
38 #undef EIGEN_THREAD_LOCAL
40 #elif defined(__ANDROID__) && EIGEN_COMP_CLANG
49 #if __has_include(<android/ndk-version.h>)
50 #include <android/ndk-version.h>
52 #if defined(__ANDROID__) && defined(__clang__) && defined(__NDK_MAJOR__) && defined(__NDK_MINOR__) && \
53 ((__NDK_MAJOR__ < 12) || ((__NDK_MAJOR__ == 12) && (__NDK_MINOR__ < 1)))
54 #undef EIGEN_THREAD_LOCAL
110 template <
typename T,
typename Initialize =
internal::ThreadLocalNoOpInitialize<T>,
111 typename Release =
internal::ThreadLocalNoOpRelease<T>>
133 ptr_.emplace_back(
nullptr);
138 std::thread::id this_thread = std::this_thread::get_id();
141 std::size_t h = std::hash<std::thread::id>()(this_thread);
153 while (
ptr_[idx].
load() !=
nullptr) {
159 if (idx == start_idx)
break;
172 int insertion_index =
filled_records_.fetch_add(1, std::memory_order_relaxed);
177 data_[insertion_index].thread_id = this_thread;
190 const int insertion_idx = idx;
195 while (
ptr_[idx].
load() !=
nullptr) {
204 }
while (!
ptr_[idx].compare_exchange_weak(empty, inserted));
206 return inserted->
value;
210 void ForEach(std::function<
void(std::thread::id,
T&)>
f) {
213 for (
auto& ptr :
ptr_) {
215 if (record ==
nullptr)
continue;
223 EIGEN_MUTEX_LOCK lock(
mu_);
225 f(kv.first, kv.second);
233 for (
auto& ptr :
ptr_) {
235 if (record ==
nullptr)
continue;
243 EIGEN_MUTEX_LOCK lock(
mu_);
257 EIGEN_MUTEX_LOCK lock(
mu_);
264 return (*result.first).second;
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Eigen::Triplet< double > T
Definition: EigenUnitTest.cpp:11
#define eigen_assert(x)
Definition: Macros.h:910
void load(Archive &ar, ParticleHandler &handl)
Definition: Particles.h:21
The MaxSizeVector class.
Definition: MaxSizeVector.h:31
Definition: ThreadLocal.h:112
~ThreadLocal()
Definition: ThreadLocal.h:230
Release release_
Definition: ThreadLocal.h:271
T & SpilledLocal(std::thread::id this_thread)
Definition: ThreadLocal.h:256
T & local()
Definition: ThreadLocal.h:137
ThreadLocal(int capacity)
Definition: ThreadLocal.h:117
Initialize initialize_
Definition: ThreadLocal.h:270
ThreadLocal(int capacity, Initialize initialize)
Definition: ThreadLocal.h:120
void ForEach(std::function< void(std::thread::id, T &)> f)
Definition: ThreadLocal.h:210
MaxSizeVector< ThreadIdAndValue > data_
Definition: ThreadLocal.h:276
MaxSizeVector< std::atomic< ThreadIdAndValue * > > ptr_
Definition: ThreadLocal.h:280
EIGEN_MUTEX mu_
Definition: ThreadLocal.h:288
std::atomic< int > filled_records_
Definition: ThreadLocal.h:283
const int capacity_
Definition: ThreadLocal.h:272
ThreadLocal(int capacity, Initialize initialize, Release release)
Definition: ThreadLocal.h:123
std::unordered_map< std::thread::id, T > per_thread_map_
Definition: ThreadLocal.h:289
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
Definition: cxx11_tensor_map.cpp:237
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
squared absolute value
Definition: GlobalFunctions.h:87
Definition: Eigen_Colamd.h:49
Definition: ThreadLocal.h:250
T value
Definition: ThreadLocal.h:252
std::thread::id thread_id
Definition: ThreadLocal.h:251
Definition: ThreadLocal.h:67
void operator()(T &) const
Definition: ThreadLocal.h:68
Definition: ThreadLocal.h:72
void operator()(T &) const
Definition: ThreadLocal.h:73