10
10
/********************************* Simcalls *********************************/
12
/* we want to build the e_smx_simcall_t enumeration and the table of the
13
* corresponding strings automatically, using macros */
15
#define SIMCALL_LIST1 \
16
SIMCALL_ENUM_ELEMENT(SIMCALL_NONE),\
17
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_GET_BY_NAME),\
18
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_GET_NAME),\
19
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_GET_PROPERTIES),\
20
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_GET_SPEED),\
21
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_GET_AVAILABLE_SPEED),\
22
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_GET_STATE),\
23
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_GET_DATA),\
24
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_SET_DATA),\
25
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_EXECUTE),\
26
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_PARALLEL_EXECUTE),\
27
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_EXECUTION_DESTROY),\
28
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_EXECUTION_CANCEL),\
29
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_EXECUTION_GET_REMAINS),\
30
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_EXECUTION_GET_STATE),\
31
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_EXECUTION_SET_PRIORITY),\
32
SIMCALL_ENUM_ELEMENT(SIMCALL_HOST_EXECUTION_WAIT),\
33
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_CREATE),\
34
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_KILL),\
35
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_KILLALL),\
36
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_CLEANUP),\
37
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_CHANGE_HOST),\
38
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_SUSPEND),\
39
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_RESUME),\
40
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_COUNT),\
41
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_GET_DATA),\
42
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_SET_DATA),\
43
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_GET_HOST),\
44
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_GET_NAME),\
45
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_IS_SUSPENDED),\
46
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_GET_PROPERTIES),\
47
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_SLEEP),\
48
SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_CREATE),\
49
SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_DESTROY),\
50
SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_GEY_BY_NAME),\
51
SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_COMM_COUNT_BY_HOST),\
52
SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_GET_HEAD),\
53
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_SEND),\
54
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_ISEND),\
55
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_RECV),\
56
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_IRECV),\
57
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_DESTROY),\
58
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_CANCEL),\
59
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_WAITANY),\
60
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_WAIT),\
61
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_TEST),\
62
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_TESTANY),\
63
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_GET_REMAINS),\
64
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_GET_STATE),\
65
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_GET_SRC_DATA),\
66
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_GET_DST_DATA),\
67
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_GET_SRC_PROC),\
68
SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_GET_DST_PROC),\
69
SIMCALL_ENUM_ELEMENT(SIMCALL_MUTEX_INIT),\
70
SIMCALL_ENUM_ELEMENT(SIMCALL_MUTEX_DESTROY),\
71
SIMCALL_ENUM_ELEMENT(SIMCALL_MUTEX_LOCK),\
72
SIMCALL_ENUM_ELEMENT(SIMCALL_MUTEX_TRYLOCK),\
73
SIMCALL_ENUM_ELEMENT(SIMCALL_MUTEX_UNLOCK),\
74
SIMCALL_ENUM_ELEMENT(SIMCALL_COND_INIT),\
75
SIMCALL_ENUM_ELEMENT(SIMCALL_COND_DESTROY),\
76
SIMCALL_ENUM_ELEMENT(SIMCALL_COND_SIGNAL),\
77
SIMCALL_ENUM_ELEMENT(SIMCALL_COND_WAIT),\
78
SIMCALL_ENUM_ELEMENT(SIMCALL_COND_WAIT_TIMEOUT),\
79
SIMCALL_ENUM_ELEMENT(SIMCALL_COND_BROADCAST),\
80
SIMCALL_ENUM_ELEMENT(SIMCALL_SEM_INIT),\
81
SIMCALL_ENUM_ELEMENT(SIMCALL_SEM_DESTROY),\
82
SIMCALL_ENUM_ELEMENT(SIMCALL_SEM_RELEASE),\
83
SIMCALL_ENUM_ELEMENT(SIMCALL_SEM_WOULD_BLOCK),\
84
SIMCALL_ENUM_ELEMENT(SIMCALL_SEM_ACQUIRE),\
85
SIMCALL_ENUM_ELEMENT(SIMCALL_SEM_ACQUIRE_TIMEOUT),\
86
SIMCALL_ENUM_ELEMENT(SIMCALL_SEM_GET_CAPACITY),\
87
SIMCALL_ENUM_ELEMENT(SIMCALL_FILE_READ),\
88
SIMCALL_ENUM_ELEMENT(SIMCALL_FILE_WRITE),\
89
SIMCALL_ENUM_ELEMENT(SIMCALL_FILE_OPEN),\
90
SIMCALL_ENUM_ELEMENT(SIMCALL_FILE_CLOSE),\
91
SIMCALL_ENUM_ELEMENT(SIMCALL_FILE_STAT)
12
/* we want to build the e_smx_simcall_t enumeration, the table of the
13
* corresponding simcalls string names, and the simcall handlers table
14
* automatically, using macros.
15
* To add a new simcall follow the following syntax:
17
* SIMCALL_ENUM_ELEMENT(<simcall_enumeration_id>, <simcall_handler_function>)
21
/****************************
22
* SIMCALL GENERATING MACRO *
23
****************************
25
* action(ENUM_NAME, func_name, result_type, params…)
30
* Some macro machinery to get a MAP over the arguments of a variadic macro.
31
* It uses a FOLD to apply a macro to every argument, and because there is
32
* no recursion in the C preprocessor we must create a new macro for every
33
* depth of FOLD's recursion.
37
#define FE_0(WHAT, X, ...)
38
#define FE_1(I, WHAT, X) WHAT(I, X)
39
#define FE_2(I, WHAT, X, ...) WHAT(I, X), FE_1(I+1, WHAT, __VA_ARGS__)
40
#define FE_3(I, WHAT, X, ...) WHAT(I, X), FE_2(I+1, WHAT, __VA_ARGS__)
41
#define FE_4(I, WHAT, X, ...) WHAT(I, X), FE_3(I+1, WHAT, __VA_ARGS__)
42
#define FE_5(I, WHAT, X, ...) WHAT(I, X), FE_4(I+1, WHAT, __VA_ARGS__)
43
#define FE_6(I, WHAT, X, ...) WHAT(I, X), FE_5(I+1, WHAT, __VA_ARGS__)
44
#define FE_7(I, WHAT, X, ...) WHAT(I, X), FE_6(I+1, WHAT, __VA_ARGS__)
45
#define FE_8(I, WHAT, X, ...) WHAT(I, X), FE_7(I+1, WHAT, __VA_ARGS__)
46
#define FE_9(I, WHAT, X, ...) WHAT(I, X), FE_8(I+1, WHAT, __VA_ARGS__)
47
#define FE_10(I, WHAT, X, ...) WHAT(I, X), FE_9(I+1, WHAT, __VA_ARGS__)
49
/* NOTE: add as many FE_n as needed (maximum number of simcall arguments )*/
51
/* Make a MAP macro usgin FOLD (will apply 'action' to the arguments.
52
* GET_MACRO is a smart hack that counts the number of arguments passed to
53
* the variadic macro, and it is used to invoke the right FOLD depth.
55
#define GET_MACRO(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,NAME,...) NAME
56
#define MAP(action, ...) \
57
GET_MACRO(, ##__VA_ARGS__, FE_10,FE_9,FE_8,FE_7,FE_6,FE_5,FE_4,FE_3,FE_2,FE_1, FE_0) (0, action, __VA_ARGS__)
59
/* MAP with default arguments */
60
#define APPLY_MAP(WHAT, I, X, ...) WHAT(I, __VA_ARGS__, X)
61
#define FE_DA_0(I, WHAT, args, X, ...)
62
#define FE_DA_1(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args)
63
#define FE_DA_2(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_1(I+1, WHAT, args, __VA_ARGS__)
64
#define FE_DA_3(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_2(I+1, WHAT, args, __VA_ARGS__)
65
#define FE_DA_4(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_3(I+1, WHAT, args, __VA_ARGS__)
66
#define FE_DA_5(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_4(I+1, WHAT, args, __VA_ARGS__)
67
#define FE_DA_6(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_5(I+1, WHAT, args, __VA_ARGS__)
68
#define FE_DA_7(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_6(I+1, WHAT, args, __VA_ARGS__)
69
#define FE_DA_8(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_7(I+1, WHAT, args, __VA_ARGS__)
70
#define FE_DA_9(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_8(I+1, WHAT, args, __VA_ARGS__)
71
#define FE_DA_10(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_9(I+1, WHAT, args, __VA_ARGS__)
73
#define MAP_WITH_DEFAULT_ARGS(action, args, ...) \
74
GET_MACRO(, ##__VA_ARGS__, FE_DA_10,FE_DA_9,FE_DA_8,FE_DA_7,FE_DA_6,FE_DA_5,FE_DA_4,FE_DA_3,FE_DA_2,FE_DA_1, FE_DA_0) (0, action, args, __VA_ARGS__)
77
* Define scalar type wrappers to ease the use of simcalls.
78
* These are used to wrap the arguments in SIMIX_simcall macro.
80
#define TCHAR(n) (n, char, c)
81
#define TSTRING(n) (n, const char*, cc)
82
#define TSHORT(n) (n, short, s)
83
#define TINT(n) (n, int, i)
84
#define TLONG(n) (n, long, l)
85
#define TUCHAR(n) (n, unsigned char, uc)
86
#define TUSHORT(n) (n, unsigned short, us)
87
#define TUINT(n) (n, unsigned int, ui)
88
#define TULONG(n) (n, unsigned long, ul)
89
#define TFLOAT(n) (n, float, f)
90
#define TDOUBLE(n) (n, double, d)
91
#define TPTR(n) (n, void*, p)
92
#define TCPTR(n) (n, const void*, cp)
93
#define TSIZE(n) (n, size_t, si)
94
#define TVOID(n) (n, void)
95
#define TSPEC(n,t) (n, t, p)
97
/* use comma or nothing to separate elements*/
98
#define SIMCALL_SEP_COMMA ,
99
#define SIMCALL_SEP_NOTHING
101
/* get the name of the parameter */
102
#define SIMCALL_NAME_(name, type, field) name
103
#define SIMCALL_NAME(i, v) SIMCALL_NAME_ v
105
/* get the %s format code of the parameter */
106
#define SIMCALL_FORMAT_(name, type, field) %field
107
#define SIMCALL_FORMAT(i, v) SIMCALL_FORMAT_ v
109
/* get the field of the parameter */
110
#define SIMCALL_FIELD_(name, type, field) field
111
#define SIMCALL_FIELD(i, v) SIMCALL_FIELD_ v
113
/* get the parameter declaration */
114
#define SIMCALL_ARG_(name, type, field) type name
115
#define SIMCALL_ARG(i, v) SIMCALL_ARG_ v
117
/* get the parameter initialisation field */
118
#define SIMCALL_INIT_FIELD_(name, type, field) .field = name
119
#define SIMCALL_INIT_FIELD(i, d, v) self->simcall.args[i]SIMCALL_INIT_FIELD_ v;
121
/* get the case of the parameter */
122
#define SIMCALL_CASE_PARAM_(name, type, field) field
123
#define SIMCALL_CASE_PARAM(i, v) simcall->args[i].SIMCALL_CASE_PARAM_ v
125
/* generate some code for SIMCALL_CASE if the simcall has an answer */
126
#define MAYBE2(_0, _1, func, ...) func
128
#define SIMCALL_WITH_RESULT_BEGIN(name, type, field) simcall->result.field =
129
#define SIMCALL_WITHOUT_RESULT_BEGIN(name, type, field)
130
#define SIMCALL_RESULT_BEGIN_(name, type, ...)\
131
MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RESULT_BEGIN, SIMCALL_WITHOUT_RESULT_BEGIN)\
132
(name, type, __VA_ARGS__)
133
#define SIMCALL_RESULT_BEGIN(answer, res) answer(SIMCALL_RESULT_BEGIN_ res)
135
#define SIMCALL_RESULT_END_(name, type, ...)\
136
SIMIX_simcall_answer(simcall);
137
#define SIMCALL_RESULT_END(answer, res) answer(SIMCALL_RESULT_END_ res)
139
/* generate some code for BODY function */
140
#define SIMCALL_FUNC_RETURN_TYPE_(name, type, ...) type
141
#define SIMCALL_FUNC_RETURN_TYPE(res) SIMCALL_FUNC_RETURN_TYPE_ res
143
#define SIMCALL_WITH_FUNC_SIMCALL(name, type, field) smx_simcall_t simcall =
144
#define SIMCALL_WITHOUT_FUNC_SIMCALL(name, type, field)
145
#define SIMCALL_FUNC_SIMCALL_(name, type, ...)\
146
MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_FUNC_SIMCALL, SIMCALL_WITHOUT_FUNC_SIMCALL)\
147
(name, type, __VA_ARGS__)
148
#define SIMCALL_FUNC_SIMCALL(res) SIMCALL_FUNC_SIMCALL_ res
150
#define SIMCALL_WITH_FUNC_RETURN(name, type, field) return self->simcall.result.field;
151
#define SIMCALL_WITHOUT_FUNC_RETURN(name, type, field)
152
#define SIMCALL_FUNC_RETURN_(name, type, ...)\
153
MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_FUNC_RETURN, SIMCALL_WITHOUT_FUNC_RETURN)\
154
(name, type, __VA_ARGS__)
155
#define SIMCALL_FUNC_RETURN(res) SIMCALL_FUNC_RETURN_ res
158
/* generate the simcall enumeration */
159
#define SIMCALL_ENUM(type, ...)\
162
/* generate the strings name from the enumeration values */
163
#define SIMCALL_STRING_TYPE(type, name, answer, res, ...)\
164
[type] = STRINGIFY(type)
166
/* generate strings from the enumeration values */
167
#define SIMCALL_TYPE(type, name, answer, res, ...)\
168
[type] = STRINGIFY(MAP(SIMCALL_FORMAT, __VA_ARGS__))
170
/* generate the simcalls BODY functions */
171
#define SIMCALL_FUNC(TYPE, NAME, ANSWER, RES, ...)\
172
inline static SIMCALL_FUNC_RETURN_TYPE(RES) simcall_BODY_##NAME(MAP(SIMCALL_ARG, ##__VA_ARGS__)) { \
173
smx_process_t self = SIMIX_process_self(); \
174
self->simcall.call = TYPE; \
175
memset(self->simcall.args, 0, sizeof(self->simcall.args)); \
176
MAP_WITH_DEFAULT_ARGS(SIMCALL_INIT_FIELD, (), ##__VA_ARGS__) \
177
if (self != simix_global->maestro_process) { \
178
XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name, \
179
SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call); \
180
SIMIX_process_yield(self); \
182
SIMIX_simcall_pre(&self->simcall, 0); \
184
SIMCALL_FUNC_RETURN(RES) \
187
/* generate a comma if there is an argument*/
188
#define WITHOUT_COMMA
190
#define GET_CLEAN(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10, NAME,...) NAME
191
#define MAYBE_COMMA(...) GET_CLEAN(,##__VA_ARGS__,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITHOUT_COMMA)
193
/* generate the simcalls cases for the SIMIX_simcall_pre function */
194
#define WITH_ANSWER(...) __VA_ARGS__
195
#define WITHOUT_ANSWER(...)
196
#define SIMCALL_CASE(type, name, answer, res, ...)\
198
SIMCALL_RESULT_BEGIN(answer, res) SIMIX_pre_ ## name(simcall MAYBE_COMMA(__VA_ARGS__) MAP(SIMCALL_CASE_PARAM, ##__VA_ARGS__));\
199
SIMCALL_RESULT_END(answer, res)\
204
* Generate simcall args and result getter/setter
206
#define SIMCALL_GS_SC_NAME_(n) n
207
#define SIMCALL_GS_SC_NAME(n) SIMCALL_GS_SC_NAME_ n
208
#define SIMCALL_GS_ARG_NAME(n) SIMCALL_NAME_ n
209
#define JOIN2(_0, _1) _0 ##__## _1
210
#define JOIN3(_0, _1, _2) JOIN2(_0 ##__## _1, _2)
211
#define JOIN4(_0, _1, _2, _3) JOIN3(_0 ##_## _1, _2, _3)
212
#define SIMCALL_GS_FUNC(scname, setget, vname) \
213
JOIN4(simcall, scname, setget, vname)
215
/* generate the simcalls args getter/setter */
216
#define SIMCALL_ARG_GETSET_(i, name, v) \
217
static inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME(name), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall){\
218
return simcall->args[i].SIMCALL_FIELD_ v ;\
220
static inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME(name), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v){\
221
simcall->args[i].SIMCALL_FIELD_ v = SIMCALL_NAME_ v ;\
224
#define SIMCALL_ARG_GETSET(type, name, answer, res, ...)\
225
MAP_WITH_DEFAULT_ARGS(SIMCALL_ARG_GETSET_, (name), ##__VA_ARGS__)
227
/* generate the simcalls result getter/setter */
228
#define SIMCALL_WITH_RES_GETSET(name, v) \
229
static inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall){\
230
return simcall->result.SIMCALL_FIELD_ v ;\
232
static inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v){\
233
simcall->result.SIMCALL_FIELD_ v = SIMCALL_NAME_ v ;\
235
#define SIMCALL_WITHOUT_RES_GETSET(name, v)
236
#define SIMCALL_RES_GETSET__(name, type, ...)\
237
MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RES_GETSET, SIMCALL_WITHOUT_RES_GETSET)
238
#define SIMCALL_RES_GETSET_(scname, v)\
239
SIMCALL_RES_GETSET__ v (scname, v)
240
#define SIMCALL_RES_GETSET(type, name, answer, res, ...)\
241
SIMCALL_RES_GETSET_(name, res)
243
/* generate the simcalls result getter/setter protos*/
244
#define SIMCALL_WITH_RES_GETSET_PROTO(name, v) \
245
inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall);\
246
inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v);
247
#define SIMCALL_WITHOUT_RES_GETSET_PROTO(name, v)
248
#define SIMCALL_RES_GETSET_PROTO__(name, type, ...)\
249
MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RES_GETSET_PROTO, SIMCALL_WITHOUT_RES_GETSET_PROTO)
250
#define SIMCALL_RES_GETSET_PROTO_(scname, v)\
251
SIMCALL_RES_GETSET_PROTO__ v (scname, v)
252
#define SIMCALL_RES_GETSET_PROTO(type, name, answer, res, ...)\
253
SIMCALL_RES_GETSET_PROTO_(name, res)
255
/* stringify arguments */
256
#define STRINGIFY_(...) #__VA_ARGS__
257
#define STRINGIFY(...) STRINGIFY_(__VA_ARGS__)
259
/* the list of simcalls definitions */
260
#define SIMCALL_LIST1(ACTION, sep) \
261
ACTION(SIMCALL_HOST_GET_BY_NAME, host_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \
262
ACTION(SIMCALL_HOST_GET_NAME, host_get_name, WITH_ANSWER, TSTRING(result), TSPEC(host, smx_host_t)) sep \
263
ACTION(SIMCALL_HOST_GET_PROPERTIES, host_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(host, smx_host_t)) sep \
264
ACTION(SIMCALL_HOST_GET_SPEED, host_get_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
265
ACTION(SIMCALL_HOST_GET_AVAILABLE_SPEED, host_get_available_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
266
ACTION(SIMCALL_HOST_GET_STATE, host_get_state, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \
267
ACTION(SIMCALL_HOST_GET_DATA, host_get_data, WITH_ANSWER, TPTR(result), TSPEC(host, smx_host_t)) sep \
268
ACTION(SIMCALL_HOST_SET_DATA, host_set_data, WITH_ANSWER, TVOID(result), TSPEC(host, smx_host_t), TPTR(data)) sep \
269
ACTION(SIMCALL_HOST_EXECUTE, host_execute, WITH_ANSWER, TSPEC(result, smx_action_t), TSTRING(name), TSPEC(host, smx_host_t), TDOUBLE(computation_amount), TDOUBLE(priority)) sep \
270
ACTION(SIMCALL_HOST_PARALLEL_EXECUTE, host_parallel_execute, WITH_ANSWER, TSPEC(result, smx_action_t), TSTRING(name), TINT(host_nb), TSPEC(host_list, smx_host_t*), TSPEC(computation_amount, double*), TSPEC(communication_amount, double*), TDOUBLE(amount), TDOUBLE(rate)) sep \
271
ACTION(SIMCALL_HOST_EXECUTION_DESTROY, host_execution_destroy, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t)) sep \
272
ACTION(SIMCALL_HOST_EXECUTION_CANCEL, host_execution_cancel, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t)) sep \
273
ACTION(SIMCALL_HOST_EXECUTION_GET_REMAINS, host_execution_get_remains, WITH_ANSWER, TDOUBLE(result), TSPEC(execution, smx_action_t)) sep \
274
ACTION(SIMCALL_HOST_EXECUTION_GET_STATE, host_execution_get_state, WITH_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \
275
ACTION(SIMCALL_HOST_EXECUTION_SET_PRIORITY, host_execution_set_priority, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t), TDOUBLE(priority)) sep \
276
ACTION(SIMCALL_HOST_EXECUTION_WAIT, host_execution_wait, WITHOUT_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \
277
ACTION(SIMCALL_PROCESS_CREATE, process_create, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t*), TSTRING(name), TSPEC(code, xbt_main_func_t), TPTR(data), TSTRING(hostname), TDOUBLE(kill_time), TINT(argc), TSPEC(argv, char**), TSPEC(properties, xbt_dict_t), TINT(auto_restart)) sep \
278
ACTION(SIMCALL_PROCESS_KILL, process_kill, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
279
ACTION(SIMCALL_PROCESS_KILLALL, process_killall, WITH_ANSWER, TVOID(result)) sep \
280
ACTION(SIMCALL_PROCESS_CLEANUP, process_cleanup, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
281
ACTION(SIMCALL_PROCESS_CHANGE_HOST, process_change_host, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TSPEC(dest, smx_host_t)) sep \
282
ACTION(SIMCALL_PROCESS_SUSPEND, process_suspend, WITHOUT_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
283
ACTION(SIMCALL_PROCESS_RESUME, process_resume, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
284
ACTION(SIMCALL_PROCESS_COUNT, process_count, WITH_ANSWER, TINT(result)) sep \
285
ACTION(SIMCALL_PROCESS_GET_DATA, process_get_data, WITH_ANSWER, TPTR(result), TSPEC(process, smx_process_t)) sep \
286
ACTION(SIMCALL_PROCESS_SET_DATA, process_set_data, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TPTR(data)) sep \
287
ACTION(SIMCALL_PROCESS_GET_HOST, process_get_host, WITH_ANSWER, TSPEC(result, smx_host_t), TSPEC(process, smx_process_t)) sep \
288
ACTION(SIMCALL_PROCESS_GET_NAME, process_get_name, WITH_ANSWER, TSTRING(result), TSPEC(process, smx_process_t)) sep \
289
ACTION(SIMCALL_PROCESS_IS_SUSPENDED, process_is_suspended, WITH_ANSWER, TINT(result), TSPEC(process, smx_process_t)) sep \
290
ACTION(SIMCALL_PROCESS_GET_PROPERTIES, process_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(process, smx_process_t)) sep \
291
ACTION(SIMCALL_PROCESS_SLEEP, process_sleep, WITHOUT_ANSWER, TINT(result), TDOUBLE(duration)) sep \
292
ACTION(SIMCALL_PROCESS_ON_EXIT, process_on_exit, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TSPEC(fun, int_f_pvoid_t), TPTR(data)) sep \
293
ACTION(SIMCALL_PROCESS_AUTO_RESTART_SET, process_auto_restart_set, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TINT(auto_restart)) sep \
294
ACTION(SIMCALL_PROCESS_RESTART, process_restart, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(process, smx_process_t)) sep \
295
ACTION(SIMCALL_RDV_CREATE, rdv_create, WITH_ANSWER, TSPEC(result, smx_rdv_t), TSTRING(name)) sep \
296
ACTION(SIMCALL_RDV_DESTROY, rdv_destroy, WITH_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t)) sep \
297
ACTION(SIMCALL_RDV_GET_BY_NAME, rdv_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \
298
ACTION(SIMCALL_RDV_COMM_COUNT_BY_HOST, rdv_comm_count_by_host, WITH_ANSWER, TUINT(result), TSPEC(rdv, smx_rdv_t), TSPEC(host, smx_host_t)) sep \
299
ACTION(SIMCALL_RDV_GET_HEAD, rdv_get_head, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t)) sep \
300
ACTION(SIMCALL_RDV_SET_RECV, rdv_set_receiver, WITH_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TSPEC(receiver, smx_process_t)) sep \
301
ACTION(SIMCALL_RDV_GET_RECV, rdv_get_receiver, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(rdv, smx_rdv_t)) sep \
302
ACTION(SIMCALL_COMM_IPROBE, comm_iprobe, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TINT(src), TINT(tag), TSPEC(match_fun, simix_match_func_t), TPTR(data)) sep \
303
ACTION(SIMCALL_COMM_SEND, comm_send, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TDOUBLE(task_size), TDOUBLE(rate), TPTR(src_buff), TSIZE(src_buff_size), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout)) sep \
304
ACTION(SIMCALL_COMM_ISEND, comm_isend, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TDOUBLE(task_size), TDOUBLE(rate), TPTR(src_buff), TSIZE(src_buff_size), TSPEC(match_fun, simix_match_func_t), TSPEC(clean_fun, simix_clean_func_t), TPTR(data), TINT(detached)) sep \
305
ACTION(SIMCALL_COMM_RECV, comm_recv, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout)) sep \
306
ACTION(SIMCALL_COMM_IRECV, comm_irecv, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data)) sep \
307
ACTION(SIMCALL_COMM_DESTROY, comm_destroy, WITH_ANSWER, TVOID(result), TSPEC(comm, smx_action_t)) sep \
308
ACTION(SIMCALL_COMM_CANCEL, comm_cancel, WITH_ANSWER, TVOID(result), TSPEC(comm, smx_action_t)) sep \
309
ACTION(SIMCALL_COMM_WAITANY, comm_waitany, WITHOUT_ANSWER, TINT(result), TSPEC(comms, xbt_dynar_t)) sep \
310
ACTION(SIMCALL_COMM_WAIT, comm_wait, WITHOUT_ANSWER, TVOID(result), TSPEC(comm, smx_action_t), TDOUBLE(timeout)) sep \
311
ACTION(SIMCALL_COMM_TEST, comm_test, WITHOUT_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep \
312
ACTION(SIMCALL_COMM_TESTANY, comm_testany, WITHOUT_ANSWER, TINT(result), TSPEC(comms, xbt_dynar_t)) sep \
313
ACTION(SIMCALL_COMM_GET_REMAINS, comm_get_remains, WITH_ANSWER, TDOUBLE(result), TSPEC(comm, smx_action_t)) sep \
314
ACTION(SIMCALL_COMM_GET_STATE, comm_get_state, WITH_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep \
315
ACTION(SIMCALL_COMM_GET_SRC_DATA, comm_get_src_data, WITH_ANSWER, TPTR(result), TSPEC(comm, smx_action_t)) sep \
316
ACTION(SIMCALL_COMM_GET_DST_DATA, comm_get_dst_data, WITH_ANSWER, TPTR(result), TSPEC(comm, smx_action_t)) sep \
317
ACTION(SIMCALL_COMM_GET_SRC_PROC, comm_get_src_proc, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(comm, smx_action_t)) sep \
318
ACTION(SIMCALL_COMM_GET_DST_PROC, comm_get_dst_proc, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(comm, smx_action_t)) sep \
319
ACTION(SIMCALL_MUTEX_INIT, mutex_init, WITH_ANSWER, TSPEC(result, smx_mutex_t)) sep \
320
ACTION(SIMCALL_MUTEX_DESTROY, mutex_destroy, WITH_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \
321
ACTION(SIMCALL_MUTEX_LOCK, mutex_lock, WITHOUT_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \
322
ACTION(SIMCALL_MUTEX_TRYLOCK, mutex_trylock, WITH_ANSWER, TINT(result), TSPEC(mutex, smx_mutex_t)) sep \
323
ACTION(SIMCALL_MUTEX_UNLOCK, mutex_unlock, WITH_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \
324
ACTION(SIMCALL_COND_INIT, cond_init, WITH_ANSWER, TSPEC(result, smx_cond_t)) sep \
325
ACTION(SIMCALL_COND_DESTROY, cond_destroy, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \
326
ACTION(SIMCALL_COND_SIGNAL, cond_signal, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \
327
ACTION(SIMCALL_COND_WAIT, cond_wait, WITHOUT_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t), TSPEC(mutex, smx_mutex_t)) sep \
328
ACTION(SIMCALL_COND_WAIT_TIMEOUT, cond_wait_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t), TSPEC(mutex, smx_mutex_t), TDOUBLE(timeout)) sep \
329
ACTION(SIMCALL_COND_BROADCAST, cond_broadcast, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \
330
ACTION(SIMCALL_SEM_INIT, sem_init, WITH_ANSWER, TSPEC(result, smx_sem_t), TINT(capacity)) sep \
331
ACTION(SIMCALL_SEM_DESTROY, sem_destroy, WITH_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
332
ACTION(SIMCALL_SEM_RELEASE, sem_release, WITH_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
333
ACTION(SIMCALL_SEM_WOULD_BLOCK, sem_would_block, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \
334
ACTION(SIMCALL_SEM_ACQUIRE, sem_acquire, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
335
ACTION(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem_acquire_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t), TDOUBLE(timeout)) sep \
336
ACTION(SIMCALL_SEM_GET_CAPACITY, sem_get_capacity, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \
337
ACTION(SIMCALL_FILE_READ, file_read, WITHOUT_ANSWER, TDOUBLE(result), TPTR(ptr), TSIZE(size), TSIZE(nmemb), TSPEC(stream, smx_file_t)) sep \
338
ACTION(SIMCALL_FILE_WRITE, file_write, WITHOUT_ANSWER, TSIZE(result), TCPTR(ptr), TSIZE(size), TSIZE(nmemb), TSPEC(stream, smx_file_t)) sep \
339
ACTION(SIMCALL_FILE_OPEN, file_open, WITHOUT_ANSWER, TSPEC(result, smx_file_t), TSTRING(mount), TSTRING(path), TSTRING(mode)) sep \
340
ACTION(SIMCALL_FILE_CLOSE, file_close, WITHOUT_ANSWER, TINT(result), TSPEC(fp, smx_file_t)) sep \
341
ACTION(SIMCALL_FILE_STAT, file_stat, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t), TSPEC(buf, s_file_stat_t*)) sep \
342
ACTION(SIMCALL_FILE_UNLINK, file_unlink, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \
343
ACTION(SIMCALL_FILE_LS, file_ls, WITHOUT_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(mount), TSTRING(path)) sep \
344
ACTION(SIMCALL_ASR_GET_PROPERTIES, asr_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(name)) sep
94
346
/* SIMCALL_COMM_IS_LATENCY_BOUNDED and SIMCALL_SET_CATEGORY make things complicated
95
347
* because they are not always present */
96
348
#ifdef HAVE_LATENCY_BOUND_TRACKING
97
#define SIMCALL_LIST2 \
98
,SIMCALL_ENUM_ELEMENT(SIMCALL_COMM_IS_LATENCY_BOUNDED)
349
#define SIMCALL_LIST2(ACTION, sep) \
350
ACTION(SIMCALL_COMM_IS_LATENCY_BOUNDED, comm_is_latency_bounded, WITH_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep
100
#define SIMCALL_LIST2
352
#define SIMCALL_LIST2(ACTION, sep)
103
355
#ifdef HAVE_TRACING
104
#define SIMCALL_LIST3 \
105
,SIMCALL_ENUM_ELEMENT(SIMCALL_SET_CATEGORY)
107
#define SIMCALL_LIST3
356
#define SIMCALL_LIST3(ACTION, sep) \
357
ACTION(SIMCALL_SET_CATEGORY, set_category, WITH_ANSWER, TVOID(result), TSPEC(action, smx_action_t), TSTRING(category)) sep
359
#define SIMCALL_LIST3(ACTION, sep)
363
#define SIMCALL_LIST4(ACTION, sep) \
364
ACTION(SIMCALL_MC_SNAPSHOT, mc_snapshot, WITH_ANSWER, TPTR(result)) sep \
365
ACTION(SIMCALL_MC_COMPARE_SNAPSHOTS, mc_compare_snapshots, WITH_ANSWER, TINT(result), TPTR(s1), TPTR(s2)) sep
367
#define SIMCALL_LIST4(ACTION, sep)
110
370
/* SIMCALL_LIST is the final macro to use */
111
#define SIMCALL_LIST SIMCALL_LIST1 SIMCALL_LIST2 SIMCALL_LIST3
371
#define SIMCALL_LIST(ACTION, ...) \
372
SIMCALL_LIST1(ACTION, ##__VA_ARGS__)\
373
SIMCALL_LIST2(ACTION, ##__VA_ARGS__)\
374
SIMCALL_LIST3(ACTION, ##__VA_ARGS__)\
375
SIMCALL_LIST4(ACTION, ##__VA_ARGS__)
113
378
/* you can redefine the following macro differently to generate something else
114
379
* with the list of enumeration values (e.g. a table of strings or a table of function pointers) */
115
#define SIMCALL_ENUM_ELEMENT(x) x
380
#define SIMCALL_ENUM_ELEMENT(x, y) x
118
383
* \brief All possible simcalls.
387
SIMCALL_LIST(SIMCALL_ENUM, SIMCALL_SEP_COMMA)
388
SIMCALL_NEW_API_INIT,
122
390
} e_smx_simcall_t;
392
typedef int (*simix_match_func_t)(void *, void *, smx_action_t);
393
typedef void (*simix_clean_func_t)(void *);
395
/* Pack all possible scalar types in an union */
125
414
* \brief Represents a simcall to the kernel.
127
416
typedef struct s_smx_simcall {
128
417
e_smx_simcall_t call;
129
418
smx_process_t issuer;
420
union u_smx_scalar args[10];
421
union u_smx_scalar result;
422
//FIXME: union u_smx_scalar retval;
146
} host_get_properties;
156
} host_get_available_speed;
176
double computation_amount;
184
smx_host_t *host_list;
185
double *computation_amount;
186
double *communication_amount;
190
} host_parallel_execute;
193
smx_action_t execution;
194
} host_execution_destroy;
197
smx_action_t execution;
198
} host_execution_cancel;
201
smx_action_t execution;
203
} host_execution_get_remains;
206
smx_action_t execution;
207
e_smx_state_t result;
208
} host_execution_get_state;
211
smx_action_t execution;
213
} host_execution_set_priority;
216
smx_action_t execution;
217
e_smx_state_t result;
218
} host_execution_wait;
221
smx_process_t *process;
223
xbt_main_func_t code;
225
const char *hostname;
229
xbt_dict_t properties;
233
smx_process_t process;
237
smx_process_t process;
241
smx_process_t process;
243
} process_change_host;
246
smx_process_t process;
250
smx_process_t process;
258
smx_process_t process;
263
smx_process_t process;
268
smx_process_t process;
273
smx_process_t process;
278
smx_process_t process;
280
} process_is_suspended;
283
smx_process_t process;
285
} process_get_properties;
289
e_smx_state_t result;
310
} rdv_comm_count_by_host;
322
size_t src_buff_size;
323
int (*match_fun)(void *, void *, smx_action_t);
333
size_t src_buff_size;
334
int (*match_fun)(void *, void *, smx_action_t);
335
void (*clean_fun)(void *);
344
size_t *dst_buff_size;
345
int (*match_fun)(void *, void *, smx_action_t);
353
size_t *dst_buff_size;
354
int (*match_fun)(void *, void *, smx_action_t);
394
e_smx_state_t result;
409
smx_process_t result;
414
smx_process_t result;
417
#ifdef HAVE_LATENCY_BOUND_TRACKING
421
} comm_is_latency_bounded;
427
const char *category;
504
} sem_acquire_timeout;
550
431
} s_smx_simcall_t, *smx_simcall_t;
433
SIMCALL_LIST(SIMCALL_RES_GETSET, SIMCALL_SEP_NOTHING)
434
SIMCALL_LIST(SIMCALL_ARG_GETSET, SIMCALL_SEP_NOTHING)
552
436
/******************************** General *************************************/
554
438
void SIMIX_simcall_push(smx_process_t self);