-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "msg_private.h"
#include "xbt/sysdep.h"
#include "xbt/log.h"
+#include "simix/smx_process_private.h"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_process, msg,
"Logging specific to MSG (process)");
TRACE_msg_process_end(smx_proc);
#endif
// free the data if a function was provided
- if (msg_proc->data && msg_global->process_data_cleanup) {
+ if (msg_proc && msg_proc->data && msg_global->process_data_cleanup) {
msg_global->process_data_cleanup(msg_proc->data);
}
- // remove the process from its virtual machine
- if (msg_proc->vm) {
- int pos = xbt_dynar_search(msg_proc->vm->processes,&smx_proc);
- xbt_dynar_remove_at(msg_proc->vm->processes,pos, NULL);
- }
-
// free the MSG process
xbt_free(msg_proc);
+ SIMIX_process_cleanup(smx_proc);
}
/* This function creates a MSG process. It has the prototype enforced by SIMIX_function_register_process_create */
void MSG_process_create_from_SIMIX(smx_process_t* process, const char *name,
- xbt_main_func_t code, void *data,
- const char *hostname, double kill_time, int argc, char **argv,
- xbt_dict_t properties, int auto_restart)
+ xbt_main_func_t code, void *data,
+ const char *hostname, double kill_time,
+ int argc, char **argv,
+ xbt_dict_t properties, int auto_restart,
+ smx_process_t parent_process)
{
msg_host_t host = MSG_get_host_by_name(hostname);
msg_process_t p = MSG_process_create_with_environment(name, code, data,
simcall_process_create(&process, name, code, simdata, sg_host_name(host), -1,
argc, argv, properties,0);
- #ifdef HAVE_TRACING
- TRACE_msg_process_create(name, simcall_process_get_PID(process), simdata->m_host);
- #endif
+#ifdef HAVE_TRACING
+ TRACE_msg_process_create(name, SIMIX_process_get_PID(process), host);
+#endif
if (!process) {
/* Undo everything we have just changed */
}
else {
#ifdef HAVE_TRACING
- simcall_process_on_exit(process,(int_f_pvoid_t)TRACE_msg_process_kill,MSG_process_self());
+ simcall_process_on_exit(process,(int_f_pvoid_pvoid_t)TRACE_msg_process_kill,process);
#endif
}
return process;
// if (p_simdata->waiting_task && p_simdata->waiting_task->simdata->comm) {
// simcall_comm_cancel(p_simdata->waiting_task->simdata->comm);
// }
-
+
simcall_process_kill(process);
return;
}
+/**
+* \brief Wait for the completion of a #msg_process_t.
+*
+* \param process the process to wait for
+* \param timeout wait until the process is over, or the timeout occurs
+*/
+msg_error_t MSG_process_join(msg_process_t process, double timeout){
+ simcall_process_join(process, timeout);
+ return MSG_OK;
+}
+
/** \ingroup m_process_management
* \brief Migrates a process to another location.
*
* The on_exit functions are the functions executed when your process is killed.
* You should use them to free the data used by your process.
*/
-void MSG_process_on_exit(int_f_pvoid_t fun, void *data) {
+void MSG_process_on_exit(int_f_pvoid_pvoid_t fun, void *data) {
simcall_process_on_exit(MSG_process_self(),fun,data);
}
/**