XBT_PUBLIC(void*) SIMIX_host_self_get_data(void);
/********************************* Process ************************************/
-XBT_PUBLIC(void) SIMIX_process_cleanup(smx_process_t arg);
XBT_PUBLIC(int) SIMIX_process_count(void);
XBT_INLINE XBT_PUBLIC(smx_process_t) SIMIX_process_self(void);
XBT_PUBLIC(const char*) SIMIX_process_self_get_name(void);
XBT_PUBLIC(void) SIMIX_req_process_kill(smx_process_t process);
/* Process handling */
-XBT_PUBLIC(void) SIMIX_req_process_cleanup(void *arg); /* FIXME: This function shouldn't be called from outside SIMIX */
+XBT_PUBLIC(void) SIMIX_req_process_cleanup(smx_process_t process);
XBT_PUBLIC(void) SIMIX_req_process_change_host(smx_process_t process,
const char *source, const char *dest);
XBT_PUBLIC(void) SIMIX_req_process_suspend(smx_process_t process);
/******************************** Process ************************************/
void __MSG_process_cleanup(smx_process_t smx_proc)
{
- /* This function should be always be executed by the process being
- * cleaned up */
- if(smx_proc != SIMIX_process_self())
- THROW_IMPOSSIBLE;
- /* arg is no longer used, just kept to avoid changing the interface */
- m_process_t proc = SIMIX_process_self_get_data();
+ m_process_t proc;
+
+ if (smx_proc == SIMIX_process_self()) {
+ /* avoid a SIMIX request if this function is called by the process itself */
+ proc = SIMIX_process_self_get_data();
+ }
+ else {
+ proc = SIMIX_req_process_get_data(smx_proc);
+ }
#ifdef HAVE_TRACING
TRACE_msg_process_end(proc);
if (msg_global)
xbt_swag_remove(proc, msg_global->process_list);
- SIMIX_process_cleanup(smx_proc);
+ SIMIX_req_process_cleanup(smx_proc);
+
if (proc->name) {
free(proc->name);
proc->name = NULL;
void SIMIX_process_killall(void);
smx_process_t SIMIX_process_create_from_wrapper(smx_process_arg_t args);
void SIMIX_create_maestro_process(void);
+void SIMIX_process_cleanup(smx_process_t arg);
void SIMIX_process_empty_trash(void);
void SIMIX_process_yield(void);
xbt_running_ctx_t *SIMIX_process_get_running_context(void);
SIMIX_REQ_ENUM_ELEMENT(REQ_HOST_EXECUTION_WAIT),\
SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_CREATE),\
SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_KILL),\
+SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_CLEANUP),\
SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_CHANGE_HOST),\
SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_SUSPEND),\
SIMIX_REQ_ENUM_ELEMENT(REQ_PROCESS_RESUME),\
smx_process_t process;
} process_kill;
+ struct {
+ smx_process_t process;
+ } process_cleanup;
+
struct {
smx_process_t process;
const char *source;
SIMIX_request_answer(req);
break;
+ case REQ_PROCESS_CLEANUP:
+ SIMIX_process_cleanup(req->process_cleanup.process);
+ SIMIX_request_answer(req);
+ break;
+
case REQ_PROCESS_CHANGE_HOST:
SIMIX_process_change_host(
req->process_change_host.process,
SIMIX_request_push();
}
+/** \brief Cleans up a SIMIX process.
+ * \param process poor victim
+ */
+void SIMIX_req_process_cleanup(smx_process_t process)
+{
+ smx_req_t req = SIMIX_req_mine();
+
+ req->call = REQ_PROCESS_CLEANUP;
+ req->process_cleanup.process = process;
+ SIMIX_request_push();
+}
+
/**
* \brief Migrates an agent to another location.
*