PFUNC 1.0
pfunc/trampolines.hpp
Go to the documentation of this file.
00001 #ifndef PFUNC_TRAMPOLINES_HPP
00002 #define PFUNC_TRAMPOLINES_HPP
00003 
00005 #include <pfunc/event.hpp>
00006 
00012 namespace pfunc { namespace detail {
00013 
00014 /*************************************************************************/
00025 struct taskmgr_virtual_base { 
00029   virtual ~taskmgr_virtual_base() {}; 
00030 
00034   virtual void operator() (void*) = 0; 
00035 
00039   virtual unsigned int current_thread_id () = 0;
00040 
00045   virtual unsigned int current_task_group_rank () = 0;
00046 
00051   virtual unsigned int current_task_group_size () = 0;
00052 
00057   virtual void current_task_group_barrier () = 0;
00058 
00063   virtual void progress_wait (event<testable_event>&) = 0;
00064 
00070   virtual void progress_barrier () = 0;
00071 
00078   virtual void spawn_task (void*, void*) = 0;
00079 
00086   virtual void spawn_task (void*, void*, void*) = 0;
00087 
00094   virtual void spawn_task (void*, void*, void*, void*) = 0;
00095 
00099   virtual void set_max_attempts (const unsigned int&) = 0;
00100 
00104   virtual unsigned int get_max_attempts () const = 0;
00105 
00110   virtual unsigned int get_num_threads () const = 0;
00111 
00116   virtual unsigned int get_num_queues () const = 0;
00117 };
00118 
00119 /***********************************************************************/
00120 
00128 struct reroute_function_arg {
00129   taskmgr_virtual_base* taskmgr_ptr; 
00130   void* thd_attr; 
00139   explicit reroute_function_arg (taskmgr_virtual_base* taskmgr_ptr,
00140                                  void* thd_attr) : 
00141                                      taskmgr_ptr (taskmgr_ptr),
00142                                      thd_attr (thd_attr) {}
00143 };
00144 } /* namespace detail */
00145 
00151 struct virtual_functor { 
00152   virtual ~virtual_functor() {} ; 
00153   virtual void operator() (void) = 0; 
00154 };
00155 } /* namespace pfunc */
00156 
00157 /*************************************************************************/
00158 
00159 #ifdef PFUNC_WINDOWS
00160 #define PFUNC_THREAD_FUNC_PREFIX DWORD __stdcall 
00161 #else
00162 #define PFUNC_THREAD_FUNC_PREFIX void*
00163 #endif
00164 
00165 namespace {
00171   extern "C" PFUNC_THREAD_FUNC_PREFIX reroute_function (void* object) {
00172     /* cast the parameter back to pfunc_reroute_function_arg_t */
00173     pfunc::detail::reroute_function_arg* arg = 
00174              static_cast<pfunc::detail::reroute_function_arg*>(object);
00175  
00176     /* call "run" with the argument passed to it */          
00177     (*(arg->taskmgr_ptr))(arg->thd_attr);
00178  
00179      /* never reaches here */
00180     return 0;
00181   }
00182 }
00183 
00184 #undef PFUNC_THREAD_FUNC_PREFIX
00185 
00186 /************************************************************************/
00187 
00188 #endif // PFUNC_TRAMPOLINES_HPP