XBT_PUBLIC(int) simcall_process_is_suspended(smx_process_t process);
XBT_PUBLIC(xbt_dict_t) simcall_process_get_properties(smx_process_t host);
XBT_PUBLIC(void) simcall_process_set_kill_time(smx_process_t process, double kill_time);
+XBT_PUBLIC(void) simcall_process_on_exit(smx_process_t process, int_f_pvoid_t fun, void *data);
/* Sleep control */
XBT_PUBLIC(e_smx_state_t) simcall_process_sleep(double duration);
}
else {
#ifdef HAVE_TRACING
- SIMIX_process_on_exit(process,(int_f_pvoid_t)TRACE_msg_process_kill,MSG_process_self());
+ simcall_process_on_exit(process,(int_f_pvoid_t)TRACE_msg_process_kill,MSG_process_self());
#endif
}
return process;
* You should use them to free the data used by your process.
*/
void MSG_process_on_exit(int_f_pvoid_t fun, void *data) {
- SIMIX_process_on_exit(MSG_process_self(),fun,data);
+ simcall_process_on_exit(MSG_process_self(),fun,data);
}
SIMIX_process_get_data(simcall->process_get_data.process);
SIMIX_simcall_answer(simcall);
break;
-
+ case SIMCALL_PROCESS_ON_EXIT:
+ SIMIX_process_on_exit(simcall->process_on_exit.process,
+ simcall->process_on_exit.fun,
+ simcall->process_on_exit.data);
+ SIMIX_simcall_answer(simcall);
+ break;
case SIMCALL_PROCESS_SET_DATA:
SIMIX_process_set_data(
simcall->process_set_data.process,
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_IS_SUSPENDED),\
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_GET_PROPERTIES),\
SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_SLEEP),\
+SIMCALL_ENUM_ELEMENT(SIMCALL_PROCESS_ON_EXIT),\
SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_CREATE),\
SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_DESTROY),\
SIMCALL_ENUM_ELEMENT(SIMCALL_RDV_GEY_BY_NAME),\
e_smx_state_t result;
} process_sleep;
+ struct {
+ smx_process_t process;
+ int_f_pvoid_t fun;
+ void *data;
+ } process_on_exit;
+
struct {
const char *name;
smx_rdv_t result;
SIMIX_simcall_push(simcall->issuer);
return simcall->process_get_properties.result;
}
+/** \ingroup m_process_management
+ * \brief Add an on_exit function
+ * Add an on_exit function which will be executed when the process exits/is killed.
+ */
+XBT_PUBLIC(void) simcall_process_on_exit(smx_process_t process, int_f_pvoid_t fun, void *data) {
+ smx_simcall_t simcall = SIMIX_simcall_mine();
+ simcall->call = SIMCALL_PROCESS_ON_EXIT;
+ simcall->process_on_exit.process = process;
+ simcall->process_on_exit.fun = fun;
+ simcall->process_on_exit.data = data;
+
+ SIMIX_simcall_push(simcall->issuer);
+}
/** \brief Creates a new sleep SIMIX action.
*
* This function creates a SURF action and allocates the data necessary