diff options
author | Benoit Steiner <benoit.steiner.goog@gmail.com> | 2016-04-19 17:59:58 -0700 |
---|---|---|
committer | Benoit Steiner <benoit.steiner.goog@gmail.com> | 2016-04-19 17:59:58 -0700 |
commit | c7c2054bb519ad01039560254f9dda8698cb0cd9 (patch) | |
tree | 36c96ef36753bae7778f5d8b85683e64560304ba /unsupported/Eigen/CXX11/src/ThreadPool | |
parent | 1d0238375d53e168eda40139979f8d128e72f4e8 (diff) |
Started to implement a portable way to yield.
Diffstat (limited to 'unsupported/Eigen/CXX11/src/ThreadPool')
-rw-r--r-- | unsupported/Eigen/CXX11/src/ThreadPool/EventCount.h | 4 | ||||
-rw-r--r-- | unsupported/Eigen/CXX11/src/ThreadPool/ThreadYield.h | 20 |
2 files changed, 22 insertions, 2 deletions
diff --git a/unsupported/Eigen/CXX11/src/ThreadPool/EventCount.h b/unsupported/Eigen/CXX11/src/ThreadPool/EventCount.h index 16eee1a41..6dd64f185 100644 --- a/unsupported/Eigen/CXX11/src/ThreadPool/EventCount.h +++ b/unsupported/Eigen/CXX11/src/ThreadPool/EventCount.h @@ -81,7 +81,7 @@ class EventCount { if (int64_t((state & kEpochMask) - epoch) < 0) { // The preceeding waiter has not decided on its fate. Wait until it // calls either CancelWait or CommitWait, or is notified. - std::this_thread::yield(); + EIGEN_THREAD_YIELD(); state = state_.load(std::memory_order_seq_cst); continue; } @@ -112,7 +112,7 @@ class EventCount { if (int64_t((state & kEpochMask) - epoch) < 0) { // The preceeding waiter has not decided on its fate. Wait until it // calls either CancelWait or CommitWait, or is notified. - std::this_thread::yield(); + EIGEN_THREAD_YIELD(); state = state_.load(std::memory_order_relaxed); continue; } diff --git a/unsupported/Eigen/CXX11/src/ThreadPool/ThreadYield.h b/unsupported/Eigen/CXX11/src/ThreadPool/ThreadYield.h new file mode 100644 index 000000000..a859c7ba3 --- /dev/null +++ b/unsupported/Eigen/CXX11/src/ThreadPool/ThreadYield.h @@ -0,0 +1,20 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2016 Benoit Steiner <benoit.steiner.goog@gmail.com> +// +// This Source Code Form is subject to the terms of the Mozilla +// Public License v. 2.0. If a copy of the MPL was not distributed +// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef EIGEN_CXX11_THREADPOOL_THREAD_YIELD_H +#define EIGEN_CXX11_THREADPOOL_THREAD_YIELD_H + +// Try to come up with a portable way to yield +#if EIGEN_COMP_GNUC && EIGEN_GNUC_AT_MOST(4, 7) +#define EIGEN_THREAD_YIELD() sched_yield() +#else +#define EIGEN_THREAD_YIELD() std::this_thread::yield() +#endif + +#endif // EIGEN_CXX11_THREADPOOL_THREAD_YIELD_H |