iLab Neuromorphic Robotics Toolkit  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AsyncImpl.H
Go to the documentation of this file.
1 /*! @file
2  @author Shane Grant
3  @copyright GNU Public License (GPL v3)
4  @section License
5  @verbatim
6  // ////////////////////////////////////////////////////////////////////////
7  // The iLab Neuromorphic Robotics Toolkit (NRT) //
8  // Copyright 2010-2012 by the University of Southern California (USC) //
9  // and the iLab at USC. //
10  // //
11  // iLab - University of Southern California //
12  // Hedco Neurociences Building, Room HNB-10 //
13  // Los Angeles, Ca 90089-2520 - USA //
14  // //
15  // See http://ilab.usc.edu for information about this project. //
16  // ////////////////////////////////////////////////////////////////////////
17  // This file is part of The iLab Neuromorphic Robotics Toolkit. //
18  // //
19  // The iLab Neuromorphic Robotics Toolkit is free software: you can //
20  // redistribute it and/or modify it under the terms of the GNU General //
21  // Public License as published by the Free Software Foundation, either //
22  // version 3 of the License, or (at your option) any later version. //
23  // //
24  // The iLab Neuromorphic Robotics Toolkit is distributed in the hope //
25  // that it will be useful, but WITHOUT ANY WARRANTY; without even the //
26  // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //
27  // PURPOSE. See the GNU General Public License for more details. //
28  // //
29  // You should have received a copy of the GNU General Public License //
30  // along with The iLab Neuromorphic Robotics Toolkit. If not, see //
31  // <http://www.gnu.org/licenses/>. //
32  // ////////////////////////////////////////////////////////////////////////
33  @endverbatim */
34 
35 
36 #ifndef INCLUDE_NRT_CORE_UTIL_DETAILS_ASYNCIMPL_H
37 #define INCLUDE_NRT_CORE_UTIL_DETAILS_ASYNCIMPL_H
38 
39 //#define NRT_DEBUG_ASYNC
40 
41 #ifdef NRT_DEBUG_ASYNC
42 #include <iostream>
43 #endif // NRT_DEBUG_ASYNC
44 
45 #include <nrt/Core/Design/BottomlessThreadPool.H> // for BottomlessThreadPool
46 //#include <nrt/Core/Design/ThreadPools.H> // for the UnboundedThreadPool variants
47 
48 #ifndef NRT_USE_STD_ASYNC
49 inline nrt::BottomlessThreadPool & getAsyncThreadPool()
50 {
51  static nrt::BottomlessThreadPool pool;
52  return pool;
53 }
54 
55 //inline nrt::UnboundedThreadPool & getAsyncThreadPool()
56 //{
57 // static nrt::UnboundedThreadPool pool;
58 // return pool;
59 //}
60 
61 #endif
62 
63 template<typename Function, typename ... Args> inline
64 std::future<typename std::result_of<Function(Args...)>::type>
65 nrt::async( Function && fn, Args && ... args )
66 {
68  std::forward<Function>( fn ),
69  std::forward<Args>( args )... );
70 }
71 
72 template<typename Function, typename ... Args> inline
73 std::future<typename std::result_of<Function(Args...)>::type>
74 nrt::async( std::launch policy, Function && fn, Args && ... args )
75 {
76  // Launch asynchronously - use the NRT thread pool if available
77  if ( ( policy & std::launch::async ) == std::launch::async )
78  {
79  #ifndef NRT_USE_STD_ASYNC
80  #ifdef NRT_DEBUG_ASYNC
81  std::cerr << "Launching via thread pool" << std::endl;
82  #endif
83  auto & pool = getAsyncThreadPool();
84 
85  return pool.pushJob( std::bind( std::forward<Function>( fn ),
86  std::forward<Args>( args )... ) );
87  #else // use STD version
88  #ifdef NRT_DEBUG_ASYNC
89  std::cerr << "Launching via std async" << std::endl;
90  #endif
91  return std::async( std::launch::async, std::forward<Function>( fn ),
92  std::forward<Args>( args )... );
93  #endif
94  }
95  else // deferred launch, fall back to standard std method
96  {
97  #ifdef NRT_DEBUG_ASYNC
98  std::cerr << "Doing a deferred launch!" << std::endl;
99  #endif
100  return std::async( std::launch::deferred,
101  std::forward<Function>( fn ),
102  std::forward<Args>( args )... );
103  }
104 }
105 #endif // NRT_CORE_UTIL_DETAILS_ASYNCIMPL_H