aboutsummaryrefslogtreecommitdiffhomepage
path: root/unsupported/Eigen/CXX11/src/ThreadPool
diff options
context:
space:
mode:
authorGravatar Benoit Steiner <benoit.steiner.goog@gmail.com>2016-12-08 08:12:49 -0800
committerGravatar Benoit Steiner <benoit.steiner.goog@gmail.com>2016-12-08 08:12:49 -0800
commit7bfff85355215a4702d4d42b1f3bfbfc08977372 (patch)
tree8698dff508476a28aece2f17fd5793407b987a15 /unsupported/Eigen/CXX11/src/ThreadPool
parent6811e6cf492731b3e1504bfa42237f909c93d129 (diff)
Added support for thread cancellation on Linux
Diffstat (limited to 'unsupported/Eigen/CXX11/src/ThreadPool')
-rw-r--r--unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h6
-rw-r--r--unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h6
-rw-r--r--unsupported/Eigen/CXX11/src/ThreadPool/ThreadCancel.h23
-rw-r--r--unsupported/Eigen/CXX11/src/ThreadPool/ThreadEnvironment.h1
4 files changed, 36 insertions, 0 deletions
diff --git a/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h b/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h
index 354bce52a..b57863163 100644
--- a/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h
+++ b/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h
@@ -97,6 +97,12 @@ class NonBlockingThreadPoolTempl : public Eigen::ThreadPoolInterface {
env_.ExecuteTask(t); // Push failed, execute directly.
}
+ void Cancel() {
+ for (size_t i = 0; i < threads_.size(); i++) {
+ threads_[i]->Cancel();
+ }
+ }
+
int NumThreads() const final {
return static_cast<int>(threads_.size());
}
diff --git a/unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h b/unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h
index e75d0f467..ab4f85fbf 100644
--- a/unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h
+++ b/unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h
@@ -69,6 +69,12 @@ class SimpleThreadPoolTempl : public ThreadPoolInterface {
}
}
+ void Cancel() {
+ for (size_t i = 0; i < threads_.size(); i++) {
+ threads_[i]->Cancel();
+ }
+ }
+
int NumThreads() const final {
return static_cast<int>(threads_.size());
}
diff --git a/unsupported/Eigen/CXX11/src/ThreadPool/ThreadCancel.h b/unsupported/Eigen/CXX11/src/ThreadPool/ThreadCancel.h
new file mode 100644
index 000000000..a05685f11
--- /dev/null
+++ b/unsupported/Eigen/CXX11/src/ThreadPool/ThreadCancel.h
@@ -0,0 +1,23 @@
+// 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_CANCEL_H
+#define EIGEN_CXX11_THREADPOOL_THREAD_CANCEL_H
+
+// Try to come up with a portable way to cancel a thread
+#if EIGEN_OS_GNULINUX
+ #define EIGEN_THREAD_CANCEL(t) \
+ pthread_cancel(t.native_handle());
+ #define EIGEN_SUPPORTS_THREAD_CANCELLATION 1
+#else
+#define EIGEN_THREAD_CANCEL(t)
+#endif
+
+
+#endif // EIGEN_CXX11_THREADPOOL_THREAD_CANCEL_H
diff --git a/unsupported/Eigen/CXX11/src/ThreadPool/ThreadEnvironment.h b/unsupported/Eigen/CXX11/src/ThreadPool/ThreadEnvironment.h
index 399f95cc1..b3c45057d 100644
--- a/unsupported/Eigen/CXX11/src/ThreadPool/ThreadEnvironment.h
+++ b/unsupported/Eigen/CXX11/src/ThreadPool/ThreadEnvironment.h
@@ -23,6 +23,7 @@ struct StlThreadEnvironment {
public:
EnvThread(std::function<void()> f) : thr_(std::move(f)) {}
~EnvThread() { thr_.join(); }
+ void Cancel() { EIGEN_THREAD_CANCEL(thr_); }
private:
std::thread thr_;