|  | // This file is part of Eigen, a lightweight C++ template library | 
|  | // for linear algebra. | 
|  | // | 
|  | // Copyright (C) 2015 Vijay Vasudevan <vrv@google.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/. | 
|  |  | 
|  | #define EIGEN_USE_THREADS | 
|  |  | 
|  | #include <atomic> | 
|  |  | 
|  | #include <stdlib.h> | 
|  | #include "main.h" | 
|  | #include <Eigen/CXX11/Tensor> | 
|  |  | 
|  | static void test_notification_single() { | 
|  | ThreadPool thread_pool(1); | 
|  |  | 
|  | std::atomic<int> counter(0); | 
|  | Eigen::Notification n; | 
|  | auto func = [&n, &counter]() { | 
|  | n.Wait(); | 
|  | ++counter; | 
|  | }; | 
|  | thread_pool.Schedule(func); | 
|  | std::this_thread::sleep_for(std::chrono::milliseconds(1000)); | 
|  |  | 
|  | // The thread should be waiting for the notification. | 
|  | VERIFY_IS_EQUAL(counter, 0); | 
|  |  | 
|  | // Unblock the thread | 
|  | n.Notify(); | 
|  |  | 
|  | std::this_thread::sleep_for(std::chrono::milliseconds(1000)); | 
|  |  | 
|  | // Verify the counter has been incremented | 
|  | VERIFY_IS_EQUAL(counter, 1); | 
|  | } | 
|  |  | 
|  | // Like test_notification_single() but enqueues multiple threads to | 
|  | // validate that all threads get notified by Notify(). | 
|  | static void test_notification_multiple() { | 
|  | ThreadPool thread_pool(1); | 
|  |  | 
|  | std::atomic<int> counter(0); | 
|  | Eigen::Notification n; | 
|  | auto func = [&n, &counter]() { | 
|  | n.Wait(); | 
|  | ++counter; | 
|  | }; | 
|  | thread_pool.Schedule(func); | 
|  | thread_pool.Schedule(func); | 
|  | thread_pool.Schedule(func); | 
|  | thread_pool.Schedule(func); | 
|  | std::this_thread::sleep_for(std::chrono::milliseconds(1000)); | 
|  | VERIFY_IS_EQUAL(counter, 0); | 
|  | n.Notify(); | 
|  | std::this_thread::sleep_for(std::chrono::milliseconds(1000)); | 
|  | VERIFY_IS_EQUAL(counter, 4); | 
|  | } | 
|  |  | 
|  | EIGEN_DECLARE_TEST(cxx11_tensor_notification) { | 
|  | CALL_SUBTEST(test_notification_single()); | 
|  | CALL_SUBTEST(test_notification_multiple()); | 
|  | } |