PFUNC 1.0
|
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