| // 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 <stdlib.h> | 
 | #include "main.h" | 
 | #include <Eigen/CXX11/Tensor> | 
 |  | 
 | #if EIGEN_OS_WIN || EIGEN_OS_WIN64 | 
 | #include <windows.h> | 
 | void sleep(int seconds) { | 
 |   Sleep(seconds*1000); | 
 | } | 
 | #else | 
 | #include <unistd.h> | 
 | #endif | 
 |  | 
 |  | 
 | namespace { | 
 |  | 
 | void WaitAndAdd(Eigen::Notification* n, int* counter) { | 
 |   n->Wait(); | 
 |   *counter = *counter + 1; | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | static void test_notification_single() | 
 | { | 
 |   ThreadPool thread_pool(1); | 
 |  | 
 |   int counter = 0; | 
 |   Eigen::Notification n; | 
 |   std::function<void()> func = std::bind(&WaitAndAdd, &n, &counter); | 
 |   thread_pool.Schedule(func); | 
 |   sleep(1); | 
 |  | 
 |   // The thread should be waiting for the notification. | 
 |   VERIFY_IS_EQUAL(counter, 0); | 
 |  | 
 |   // Unblock the thread | 
 |   n.Notify(); | 
 |  | 
 |   sleep(1); | 
 |  | 
 |   // 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); | 
 |  | 
 |   int counter = 0; | 
 |   Eigen::Notification n; | 
 |   std::function<void()> func = std::bind(&WaitAndAdd, &n, &counter); | 
 |   thread_pool.Schedule(func); | 
 |   thread_pool.Schedule(func); | 
 |   thread_pool.Schedule(func); | 
 |   thread_pool.Schedule(func); | 
 |   sleep(1); | 
 |   VERIFY_IS_EQUAL(counter, 0); | 
 |   n.Notify(); | 
 |   sleep(1); | 
 |   VERIFY_IS_EQUAL(counter, 4); | 
 | } | 
 |  | 
 | void test_cxx11_tensor_notification() | 
 | { | 
 |   CALL_SUBTEST(test_notification_single()); | 
 |   CALL_SUBTEST(test_notification_multiple()); | 
 | } |