1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2015 Vijay Vasudevan <vrv@google.com>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #define EIGEN_USE_THREADS
11 
12 #include <stdlib.h>
13 #include "main.h"
14 #include <Eigen/CXX11/Tensor>
15 
16 #if EIGEN_OS_WIN || EIGEN_OS_WIN64
17 #include <windows.h>
sleep(int seconds)18 void sleep(int seconds) {
19   Sleep(seconds*1000);
20 }
21 #else
22 #include <unistd.h>
23 #endif
24 
25 
26 namespace {
27 
WaitAndAdd(Eigen::Notification * n,int * counter)28 void WaitAndAdd(Eigen::Notification* n, int* counter) {
29   n->Wait();
30   *counter = *counter + 1;
31 }
32 
33 }  // namespace
34 
test_notification_single()35 static void test_notification_single()
36 {
37   ThreadPool thread_pool(1);
38 
39   int counter = 0;
40   Eigen::Notification n;
41   std::function<void()> func = std::bind(&WaitAndAdd, &n, &counter);
42   thread_pool.Schedule(func);
43   sleep(1);
44 
45   // The thread should be waiting for the notification.
46   VERIFY_IS_EQUAL(counter, 0);
47 
48   // Unblock the thread
49   n.Notify();
50 
51   sleep(1);
52 
53   // Verify the counter has been incremented
54   VERIFY_IS_EQUAL(counter, 1);
55 }
56 
57 // Like test_notification_single() but enqueues multiple threads to
58 // validate that all threads get notified by Notify().
test_notification_multiple()59 static void test_notification_multiple()
60 {
61   ThreadPool thread_pool(1);
62 
63   int counter = 0;
64   Eigen::Notification n;
65   std::function<void()> func = std::bind(&WaitAndAdd, &n, &counter);
66   thread_pool.Schedule(func);
67   thread_pool.Schedule(func);
68   thread_pool.Schedule(func);
69   thread_pool.Schedule(func);
70   sleep(1);
71   VERIFY_IS_EQUAL(counter, 0);
72   n.Notify();
73   sleep(1);
74   VERIFY_IS_EQUAL(counter, 4);
75 }
76 
test_cxx11_tensor_notification()77 void test_cxx11_tensor_notification()
78 {
79   CALL_SUBTEST(test_notification_single());
80   CALL_SUBTEST(test_notification_multiple());
81 }
82