PFUNC
1.0
|
00001 #ifndef PFUNC_H 00002 #define PFUNC_H 00003 00004 #include <pfunc/pfunc_common.h> 00005 00006 #ifndef PFUNC_PACK_CODE 00009 typedef void (*pfunc_c_work_func_t)(void*); 00010 00011 #ifdef PFUNC_LIBRARY_CODE 00013 #include <pfunc/generator.hpp> 00014 00018 namespace pfunc { namespace detail { 00020 struct internal_work_func_t { 00026 void set_func (const pfunc_c_work_func_t& ptr) { func_ptr = ptr;} 00027 00033 pfunc_c_work_func_t get_func ( ) const { return func_ptr;} 00034 00040 void set_arg (void* arg) { func_arg = arg;} 00041 00047 void* get_arg ( ) const { return func_arg;} 00048 00055 internal_work_func_t (pfunc_c_work_func_t func, void* arg) : 00056 func_ptr (func), func_arg (arg) {} 00057 00059 internal_work_func_t () : func_ptr (NULL), func_arg (NULL) {} 00060 00066 internal_work_func_t (const internal_work_func_t& other) : 00067 func_ptr (other.get_func()), func_arg (other.get_arg()) {} 00068 00070 void operator() (void) { func_ptr (func_arg); } 00071 00072 private: 00073 pfunc_c_work_func_t func_ptr; 00074 void* func_arg; 00075 }; 00076 00082 #define PFUNC_GEN_TYPES(sched) \ 00083 typedef generator <sched##S, \ 00084 use_default, \ 00085 internal_work_func_t> pfunc_##sched##_type_t; \ 00086 typedef pfunc_##sched##_type_t::attribute pfunc_##sched##_attr_t; \ 00087 typedef pfunc_##sched##_type_t::task pfunc_##sched##_task_t; \ 00088 typedef pfunc_##sched##_type_t::taskmgr pfunc_##sched##_taskmgr_t; \ 00089 typedef pfunc_##sched##_type_t::group pfunc_##sched##_group_t; 00090 00092 PFUNC_GEN_TYPES(cilk) 00093 00094 00095 PFUNC_GEN_TYPES(fifo) 00096 00097 00098 PFUNC_GEN_TYPES(lifo) 00099 00100 00101 PFUNC_GEN_TYPES(prio) 00102 } /* namespace detail */ } /* namespace pfunc */ 00103 00104 #else 00106 #include "pfunc_atomics.h" 00107 00108 #endif 00110 #ifdef __cplusplus 00111 extern "C" { 00112 #endif 00113 00121 #define PFUNC_GEN_C_TYPES(sched) \ 00122 struct pfunc_##sched##_dummy_attr_t; \ 00123 typedef struct pfunc_##sched##_dummy_attr_t* pfunc_##sched##_attr_t; \ 00124 struct pfunc_##sched##_dummy_task_t; \ 00125 typedef struct pfunc_##sched##_dummy_task_t* pfunc_##sched##_task_t; \ 00126 struct pfunc_##sched##_dummy_taskmgr_t; \ 00127 typedef struct pfunc_##sched##_dummy_taskmgr_t* pfunc_##sched##_taskmgr_t; \ 00128 struct pfunc_##sched##_dummy_group_t; \ 00129 typedef struct pfunc_##sched##_dummy_group_t* pfunc_##sched##_group_t; \ 00130 00131 00132 typedef int pfunc_attr_priority_t; 00133 00135 typedef unsigned int pfunc_attr_qnum_t; 00136 00138 typedef unsigned int pfunc_attr_num_waiters_t; 00139 00141 typedef unsigned int pfunc_attr_nested_t; 00142 00144 typedef unsigned int pfunc_attr_grouped_t; 00145 00147 typedef unsigned int pfunc_attr_level_t; 00148 00150 typedef unsigned int pfunc_group_size_t; 00151 00153 typedef unsigned int pfunc_group_id_t; 00154 00156 typedef unsigned int pfunc_group_barrier_t; 00157 00162 #define PFUNC_GEN_ATTR_INITCLEAR_DECLS(sched) \ 00163 int pfunc_##sched##_attr_init (pfunc_##sched##_attr_t*); \ 00164 int pfunc_##sched##_attr_clear (pfunc_##sched##_attr_t*); \ 00165 00166 00170 #define PFUNC_GEN_ATTR_SET_DECLS(sched) \ 00171 int pfunc_##sched##_attr_priority_set \ 00172 (pfunc_##sched##_attr_t, pfunc_attr_priority_t);\ 00173 int pfunc_##sched##_attr_qnum_set \ 00174 (pfunc_##sched##_attr_t, pfunc_attr_qnum_t);\ 00175 int pfunc_##sched##_attr_num_waiters_set \ 00176 (pfunc_##sched##_attr_t, pfunc_attr_num_waiters_t);\ 00177 int pfunc_##sched##_attr_nested_set \ 00178 (pfunc_##sched##_attr_t, pfunc_attr_nested_t);\ 00179 int pfunc_##sched##_attr_grouped_set \ 00180 (pfunc_##sched##_attr_t, pfunc_attr_grouped_t);\ 00181 int pfunc_##sched##_attr_level_set \ 00182 (pfunc_##sched##_attr_t, pfunc_attr_level_t); 00183 00188 #define PFUNC_GEN_ATTR_GET_DECLS(sched) \ 00189 int pfunc_##sched##_attr_priority_get \ 00190 (pfunc_##sched##_attr_t, pfunc_attr_priority_t*);\ 00191 int pfunc_##sched##_attr_qnum_get \ 00192 (pfunc_##sched##_attr_t, pfunc_attr_qnum_t*);\ 00193 int pfunc_##sched##_attr_num_waiters_get \ 00194 (pfunc_##sched##_attr_t, pfunc_attr_num_waiters_t*);\ 00195 int pfunc_##sched##_attr_nested_get \ 00196 (pfunc_##sched##_attr_t, pfunc_attr_nested_t*);\ 00197 int pfunc_##sched##_attr_grouped_get \ 00198 (pfunc_##sched##_attr_t, pfunc_attr_grouped_t*); \ 00199 int pfunc_##sched##_attr_level_get \ 00200 (pfunc_##sched##_attr_t, pfunc_attr_level_t*); 00201 00207 #define PFUNC_GEN_ATTR_DECLS(sched) \ 00208 PFUNC_GEN_ATTR_INITCLEAR_DECLS(sched)\ 00209 PFUNC_GEN_ATTR_SET_DECLS(sched) \ 00210 PFUNC_GEN_ATTR_GET_DECLS(sched) 00211 00216 #define PFUNC_GEN_GROUP_INITCLEAR_DECLS(sched) \ 00217 int pfunc_##sched##_group_init (pfunc_##sched##_group_t*); \ 00218 int pfunc_##sched##_group_clear (pfunc_##sched##_group_t*); \ 00219 00220 00224 #define PFUNC_GEN_GROUP_SET_DECLS(sched) \ 00225 int pfunc_##sched##_group_size_set \ 00226 (pfunc_##sched##_group_t, pfunc_group_size_t);\ 00227 int pfunc_##sched##_group_id_set \ 00228 (pfunc_##sched##_group_t, pfunc_group_id_t);\ 00229 int pfunc_##sched##_group_barrier_set \ 00230 (pfunc_##sched##_group_t, pfunc_group_barrier_t);\ 00231 00232 00236 #define PFUNC_GEN_GROUP_GET_DECLS(sched) \ 00237 int pfunc_##sched##_group_size_get \ 00238 (pfunc_##sched##_group_t, pfunc_group_size_t*);\ 00239 int pfunc_##sched##_group_id_get \ 00240 (pfunc_##sched##_group_t, pfunc_group_id_t*);\ 00241 int pfunc_##sched##_group_barrier_get \ 00242 (pfunc_##sched##_group_t, pfunc_group_barrier_t*);\ 00243 00244 00249 #define PFUNC_GEN_GROUP_DECLS(sched) \ 00250 PFUNC_GEN_GROUP_INITCLEAR_DECLS(sched)\ 00251 PFUNC_GEN_GROUP_SET_DECLS(sched) \ 00252 PFUNC_GEN_GROUP_GET_DECLS(sched) 00253 00258 #define PFUNC_GEN_TASK_INITCLEAR_DECLS(sched) \ 00259 int pfunc_##sched##_task_init (pfunc_##sched##_task_t*); \ 00260 int pfunc_##sched##_task_clear (pfunc_##sched##_task_t*); 00261 00267 #define PFUNC_GEN_TASK_DECLS(sched) \ 00268 PFUNC_GEN_TASK_INITCLEAR_DECLS(sched) 00269 00274 #define PFUNC_GEN_TASKMGR_INITCLEAR_DECLS(sched) \ 00275 int pfunc_##sched##_taskmgr_init (pfunc_##sched##_taskmgr_t*, \ 00276 const unsigned int, \ 00277 const unsigned int*, \ 00278 const unsigned int**); \ 00279 int pfunc_##sched##_taskmgr_clear (pfunc_##sched##_taskmgr_t*); 00280 00286 #define PFUNC_GEN_TASKMGR_SET_AND_GET_MAX_ATTEMPTS_DECLS(sched) \ 00287 int pfunc_##sched##_taskmgr_max_attempts_set (pfunc_##sched##_taskmgr_t, \ 00288 const unsigned int); \ 00289 int pfunc_##sched##_taskmgr_max_attempts_get (pfunc_##sched##_taskmgr_t, \ 00290 unsigned int*); 00291 00297 #define PFUNC_GEN_TASKMGR_DECLS(sched) \ 00298 PFUNC_GEN_TASKMGR_INITCLEAR_DECLS(sched) \ 00299 PFUNC_GEN_TASKMGR_SET_AND_GET_MAX_ATTEMPTS_DECLS(sched) 00300 00307 #define PFUNC_GEN_WORK_TYPES_DECLS(sched) \ 00308 struct pfunc_##sched##_dummy_work_t; \ 00309 typedef struct pfunc_##sched##_dummy_work_t* pfunc_##sched##_work_t; \ 00310 int pfunc_##sched##_work_init (pfunc_##sched##_work_t*); \ 00311 int pfunc_##sched##_work_clear (pfunc_##sched##_work_t*); \ 00312 int pfunc_##sched##_work_func_set (pfunc_##sched##_work_t, pfunc_c_work_func_t); \ 00313 int pfunc_##sched##_work_arg_set (pfunc_##sched##_work_t, void*); \ 00314 int pfunc_##sched##_work_func_get (pfunc_##sched##_work_t, pfunc_c_work_func_t*); \ 00315 int pfunc_##sched##_work_arg_get (pfunc_##sched##_work_t, void**); \ 00316 00317 00321 #define PFUNC_GEN_TESTS_AND_WAITS_DECLS(sched) \ 00322 int pfunc_##sched##_wait (pfunc_##sched##_taskmgr_t, pfunc_##sched##_task_t); \ 00323 int pfunc_##sched##_wait_all (pfunc_##sched##_taskmgr_t, pfunc_##sched##_task_t*, int); \ 00324 int pfunc_##sched##_wait_any (pfunc_##sched##_taskmgr_t, pfunc_##sched##_task_t*, int, int*); \ 00325 int pfunc_##sched##_test (pfunc_##sched##_taskmgr_t, pfunc_##sched##_task_t); \ 00326 int pfunc_##sched##_test_all (pfunc_##sched##_taskmgr_t, pfunc_##sched##_task_t*, int, int*); \ 00327 00328 00335 #define PFUNC_GEN_RUN_DECLS(sched) \ 00336 int pfunc_##sched##_spawn_c (pfunc_##sched##_taskmgr_t, \ 00337 pfunc_##sched##_task_t, \ 00338 pfunc_##sched##_attr_t, \ 00339 pfunc_##sched##_group_t, \ 00340 pfunc_c_work_func_t, \ 00341 void*); \ 00342 int pfunc_##sched##_spawn_cxx (pfunc_##sched##_taskmgr_t, \ 00343 pfunc_##sched##_task_t, \ 00344 pfunc_##sched##_attr_t, \ 00345 pfunc_##sched##_group_t, \ 00346 pfunc_##sched##_work_t); 00347 00354 #define PFUNC_GEN_RANK_AND_SIZE_DECLS(sched) \ 00355 int pfunc_##sched##_thread_id (pfunc_##sched##_taskmgr_t, unsigned int*); \ 00356 int pfunc_##sched##_group_rank (pfunc_##sched##_taskmgr_t, unsigned int*); \ 00357 int pfunc_##sched##_group_size (pfunc_##sched##_taskmgr_t, unsigned int*); \ 00358 int pfunc_##sched##_barrier (pfunc_##sched##_taskmgr_t); 00359 00360 00361 /*************************************************************************** 00362 * Adding the generators for declarations of global versions of the following 00363 * functions: init, clear, thread_id, group_rank, group_size, barrier, wait, 00364 * wait_all, wait_any, test, test_all, spawn_c and spawn_cxx. These take in an 00365 * implicit argument (taskmgr) that has to have been initialized before hand. 00366 * Note: The functions are similar to their local counterparts, but differ in 00367 * two respects. 00368 * 1. "taskmgr" argument is missing. 00369 * 2. Name of the function now includes the suffix "_gbl" -- this is required 00370 * as there is no function overloading in C. 00371 */ 00372 00376 #define PFUNC_GEN_GLOBAL_TASKMGR_INIT_CLEAR(sched) \ 00377 int pfunc_##sched##_init (pfunc_##sched##_taskmgr_t*); \ 00378 int pfunc_##sched##_clear (); 00379 00385 #define PFUNC_GEN_TASKMGR_GLOBAL_SET_AND_GET_MAX_ATTEMPTS_DECLS(sched) \ 00386 int pfunc_##sched##_taskmgr_max_attempts_set_gbl (const unsigned int); \ 00387 int pfunc_##sched##_taskmgr_max_attempts_get_gbl (unsigned int*); 00388 00392 #define PFUNC_GEN_GLOBAL_TASKMGR_DECLS(sched) \ 00393 PFUNC_GEN_GLOBAL_TASKMGR_INIT_CLEAR(sched) \ 00394 PFUNC_GEN_TASKMGR_GLOBAL_SET_AND_GET_MAX_ATTEMPTS_DECLS(sched) 00395 00401 #define PFUNC_GEN_GLOBAL_TESTS_AND_WAITS_DECLS(sched) \ 00402 int pfunc_##sched##_wait_gbl (pfunc_##sched##_task_t); \ 00403 int pfunc_##sched##_wait_all_gbl (pfunc_##sched##_task_t*, int); \ 00404 int pfunc_##sched##_wait_any_gbl (pfunc_##sched##_task_t*, int, int*); \ 00405 int pfunc_##sched##_test_gbl (pfunc_##sched##_task_t); \ 00406 int pfunc_##sched##_test_all_gbl (pfunc_##sched##_task_t*, int, int*); \ 00407 00408 00415 #define PFUNC_GEN_GLOBAL_RUN_DECLS(sched) \ 00416 int pfunc_##sched##_spawn_c_gbl (pfunc_##sched##_task_t, \ 00417 pfunc_##sched##_attr_t, \ 00418 pfunc_##sched##_group_t, \ 00419 pfunc_c_work_func_t, \ 00420 void*); \ 00421 int pfunc_##sched##_spawn_cxx_gbl (pfunc_##sched##_task_t, \ 00422 pfunc_##sched##_attr_t, \ 00423 pfunc_##sched##_group_t, \ 00424 pfunc_##sched##_work_t); 00425 00431 #define PFUNC_GEN_GLOBAL_RANK_AND_SIZE_DECLS(sched) \ 00432 int pfunc_##sched##_thread_id_gbl (unsigned int*); \ 00433 int pfunc_##sched##_group_rank_gbl (unsigned int*); \ 00434 int pfunc_##sched##_group_size_gbl (unsigned int*); \ 00435 int pfunc_##sched##_barrier_gbl (); 00436 00437 /***************************************************************************/ 00438 00444 #define PFUNC_GEN_ALL_TYPES_DECLS(sched) \ 00445 PFUNC_GEN_C_TYPES(sched) \ 00446 PFUNC_GEN_ATTR_DECLS(sched) \ 00447 PFUNC_GEN_GROUP_DECLS(sched) \ 00448 PFUNC_GEN_TASK_DECLS(sched) \ 00449 PFUNC_GEN_TASKMGR_DECLS(sched) \ 00450 PFUNC_GEN_WORK_TYPES_DECLS(sched) \ 00451 PFUNC_GEN_TESTS_AND_WAITS_DECLS(sched) \ 00452 PFUNC_GEN_RUN_DECLS(sched) \ 00453 PFUNC_GEN_RANK_AND_SIZE_DECLS(sched) \ 00454 PFUNC_GEN_GLOBAL_TASKMGR_DECLS(sched) \ 00455 PFUNC_GEN_GLOBAL_TESTS_AND_WAITS_DECLS(sched) \ 00456 PFUNC_GEN_GLOBAL_RUN_DECLS(sched) \ 00457 PFUNC_GEN_GLOBAL_RANK_AND_SIZE_DECLS(sched) 00458 00460 PFUNC_GEN_ALL_TYPES_DECLS(cilk) 00461 00462 00463 PFUNC_GEN_ALL_TYPES_DECLS(fifo) 00464 00466 PFUNC_GEN_ALL_TYPES_DECLS(lifo) 00467 00469 PFUNC_GEN_ALL_TYPES_DECLS(prio) 00470 00472 extern pfunc_cilk_taskmgr_t pfunc_cilk_global_tmanager; 00473 00475 extern pfunc_fifo_taskmgr_t pfunc_fifo_global_tmanager; 00476 00478 extern pfunc_lifo_taskmgr_t pfunc_lifo_global_tmanager; 00479 00481 extern pfunc_prio_taskmgr_t pfunc_prio_global_tmanager; 00482 00483 #ifdef __cplusplus 00484 } 00485 #endif 00486 00487 #endif 00489 #ifdef __cplusplus 00490 extern "C" { 00491 #endif 00492 00494 int pfunc_pack (char**, const char* format, ...); 00495 int pfunc_unpack (char*, const char* format, ...); 00496 00497 #ifdef __cplusplus 00498 } 00499 #endif 00500 00501 #endif /* PFUNC_H */