PFUNC  1.0
pfunc/pfunc.h
Go to the documentation of this file.
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 */