- /* arg is a pointer to a simix process, we can get the msg process with the field data */
- m_process_t proc = ((smx_process_t) arg)->data;
- xbt_fifo_remove(msg_global->process_list, proc);
- SIMIX_process_cleanup(arg);
- free(proc->name);
- proc->name = NULL;
- free(proc->simdata);
- proc->simdata = NULL;
+ /* 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();
+
+#ifdef HAVE_TRACING
+ TRACE_msg_process_end(proc);
+#endif
+
+ if(msg_global)
+ xbt_fifo_remove(msg_global->process_list, proc);
+
+ SIMIX_process_cleanup(smx_proc);
+ if (proc->name) {
+ free(proc->name);
+ proc->name = NULL;
+ }
+ if (proc->simdata) {
+ free(proc->simdata);
+ proc->simdata = NULL;
+ }