| // 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()); | 
 | } |