From 5460f34ed156280c6beaf9a6b330bb0d68ab46b9 Mon Sep 17 00:00:00 2001 From: Cristian Rosa Date: Fri, 7 Sep 2012 12:33:18 -0300 Subject: [PATCH 1/1] Extend definition of simcalls to include a pointer to the simcall handler functions. Use these pointers to initialize a simcall dispatch table. --- src/simix/smx_smurf.c | 10 ++++++++-- src/simix/smx_smurf_private.h | 16 +++++++++++----- src/simix/smx_user.c | 2 +- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/simix/smx_smurf.c b/src/simix/smx_smurf.c index 91c67a4acf..0ef4ca31b8 100644 --- a/src/simix/smx_smurf.c +++ b/src/simix/smx_smurf.c @@ -198,7 +198,7 @@ void SIMIX_simcall_pre(smx_simcall_t simcall, int value) SIMIX_simcall_answer(simcall); break; - case SIMCALL_RDV_GEY_BY_NAME: + case SIMCALL_RDV_GET_BY_NAME: simcall->rdv_get_by_name.result = SIMIX_rdv_get_by_name(simcall->rdv_get_by_name.name); SIMIX_simcall_answer(simcall); @@ -623,7 +623,13 @@ void SIMIX_simcall_post(smx_action_t action) /* FIXME: add types for every simcall */ const char *simcall_types[NUM_SIMCALLS] = { [SIMCALL_HOST_EXECUTE] = "%s%p%f%f%p" }; -simcall_handler_t simcall_table[NUM_SIMCALLS] = {[SIMCALL_HOST_EXECUTE] = &SIMIX_host_execute}; +simcall_handler_t simcall_table[NUM_SIMCALLS] = { +#undef SIMCALL_ENUM_ELEMENT +#define SIMCALL_ENUM_ELEMENT(x,y) &y /* generate strings from the enumeration values */ +SIMCALL_LIST +#undef SIMCALL_ENUM_ELEMENT +}; + void SIMIX_simcall_typecheck(const char *fmt, ...) { diff --git a/src/simix/smx_smurf_private.h b/src/simix/smx_smurf_private.h index 7ba6aec295..f6e03892b3 100644 --- a/src/simix/smx_smurf_private.h +++ b/src/simix/smx_smurf_private.h @@ -9,8 +9,14 @@ /********************************* Simcalls *********************************/ -/* we want to build the e_smx_simcall_t enumeration and the table of the - * corresponding strings automatically, using macros */ +/* we want to build the e_smx_simcall_t enumeration, the table of the + * corresponding simcalls string names, and the simcall handlers table + * automatically, using macros. + * To add a new simcall follow the following syntax: + * + * SIMCALL_ENUM_ELEMENT(, ) + * + * */ #define SIMCALL_LIST1 \ SIMCALL_ENUM_ELEMENT(SIMCALL_NONE),\ @@ -107,14 +113,14 @@ SIMCALL_ENUM_ELEMENT(SIMCALL_NEW_API_INIT) * because they are not always present */ #ifdef HAVE_LATENCY_BOUND_TRACKING #define SIMCALL_LIST2 \ -,SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_IS_LATENCY_BOUNDED) +,SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_IS_LATENCY_BOUNDED, SIMIX_comm_is_latency_bounded) #else #define SIMCALL_LIST2 #endif #ifdef HAVE_TRACING #define SIMCALL_LIST3 \ -,SIMCALL_ENUM_ELEMENT(SIMCALL_SET_CATEGORY) +,SIMCALL_ENUM_ELEMENT(SIMCALL_SET_CATEGORY, SIMIX_set_category) #else #define SIMCALL_LIST3 #endif @@ -132,7 +138,7 @@ SIMCALL_ENUM_ELEMENT(SIMCALL_NEW_API_INIT) /* you can redefine the following macro differently to generate something else * with the list of enumeration values (e.g. a table of strings or a table of function pointers) */ -#define SIMCALL_ENUM_ELEMENT(x) x +#define SIMCALL_ENUM_ELEMENT(x, y) x /** * \brief All possible simcalls. diff --git a/src/simix/smx_user.c b/src/simix/smx_user.c index db657c15a5..d019078c51 100644 --- a/src/simix/smx_user.c +++ b/src/simix/smx_user.c @@ -14,7 +14,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix); static const char* simcall_names[] = { #undef SIMCALL_ENUM_ELEMENT -#define SIMCALL_ENUM_ELEMENT(x) #x /* generate strings from the enumeration values */ +#define SIMCALL_ENUM_ELEMENT(x,y) #x /* generate strings from the enumeration values */ SIMCALL_LIST #undef SIMCALL_ENUM_ELEMENT }; -- 2.20.1