- // free the data if a function was provided
- if (msg_proc->data && msg_global->process_data_cleanup) {
- msg_global->process_data_cleanup(msg_proc->data);
+ msg_process_data_t process_data = (msg_process_data_t)msg_proc->data;
+ //free the process data
+ if (process_data) {
+ //Remove the process from its vm
+ if (process_data->current_vm) {
+ int pos = xbt_dynar_search(process_data->current_vm->processes,&smx_proc);
+ xbt_dynar_remove_at(process_data->current_vm->processes,pos, NULL);
+ }
+ //Free the data if a function was provided
+ if (process_data->data && msg_global->process_data_cleanup) {
+ msg_global->process_data_cleanup(process_data->data);
+ }
+ xbt_free(process_data);