/********************************* 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(<simcall_enumeration_id>, <simcall_handler_function>)
+ *
+ * */
#define SIMCALL_LIST1 \
SIMCALL_ENUM_ELEMENT(SIMCALL_NONE),\
* 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
/* 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.
typedef struct s_smx_simcall {
e_smx_simcall_t call;
smx_process_t issuer;
+ union u_smx_scalar *args;
+ //FIXME: union u_smx_scalar retval;
union {
/*************************** New simcall interface ****************************/
/* Pack all possible scalar types in an union */
-typedef union {
+typedef union u_smx_scalar {
char c;
short s;
int i;
#define DOUBLE(x) (d,x)
#define PTR(x) (p,x)
+#define MYMACRO(...)
+
/*
* Some macro machinery to get a MAP over the arguments of a variadic macro.
* It uses a FOLD to apply a macro to every argument, and because there is
/* Generate code to initialize the field 'x' with value 'y' of an structure or union */
#define INIT_FIELD_(x,y) {.x = y}
-#define INIT_FIELD(t) INIT_FIELD t
+#define INIT_FIELD(t) INIT_FIELD_ t
/* Project the second element of a tuple */
#define SECOND_(x, y) y
*/
#define SIMIX_simcall(id, ...) \
SIMIX_simcall_typecheck(simcall_types[id], MAP(SECOND, __VA_ARGS__)); \
- __SIMIX_simcall(id, (mytype_t[]){MAP(INIT_FIELD, __VA_ARGS__)})
+ __SIMIX_simcall(id, (u_smx_scalar_t[]){MAP(INIT_FIELD, __VA_ARGS__)})
void __SIMIX_simcall(e_smx_simcall_t simcall_id, u_smx_scalar_t *args);
*/
void SIMIX_simcall_typecheck(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
+typedef smx_action_t (*simcall_handler_t)(u_smx_scalar_t *);
+
+extern const char *simcall_types[];
+extern simcall_handler_t simcall_table[];
#endif