Problem 1: the same Pajé container (corresponding to the same MSG_process) could be destroyed more than once by the current TRACE logic.
Fix: A safer mechanism avoids multiple destroys of the same container.
Potential problem: the current TRACE logic might be bugged and this fix may only hide the problem.
Problem 2: the Pajé container (corresponding to a MSG_process) was created after the simcall_process_create although the simcall might not return the flow control.
Fix: The Pajé container is now created before the simcall_process_create (the future SIMIX process ID is hacked thanks to SIMIX_process_get_maxpid())
Code redundancy: The function TRACE_msg_process_end destroyed the process container in the exact same way as it was done in TRACE_msg_process_destroy.
Fix: the TRACE_msg_process_destroy function is now called instead.
int len = INSTR_DEFAULT_STR_SIZE;
char str[INSTR_DEFAULT_STR_SIZE];
int len = INSTR_DEFAULT_STR_SIZE;
char str[INSTR_DEFAULT_STR_SIZE];
- container_t process = PJ_container_get (instr_process_id_2 (process_name, process_pid, str, len));
- PJ_container_remove_from_parent (process);
- PJ_container_free (process);
+ // Avoids multiple destroys of the same process
+ container_t process = PJ_container_get_or_null (instr_process_id_2 (process_name, process_pid, str, len));
+ if (process){
+ PJ_container_remove_from_parent (process);
+ PJ_container_free (process);
+ }
}
void TRACE_msg_process_kill(smx_process_exit_status_t status, msg_process_t process)
}
void TRACE_msg_process_kill(smx_process_exit_status_t status, msg_process_t process)
void TRACE_msg_process_end(msg_process_t process)
{
if (TRACE_msg_process_is_enabled()) {
void TRACE_msg_process_end(msg_process_t process)
{
if (TRACE_msg_process_is_enabled()) {
- int len = INSTR_DEFAULT_STR_SIZE;
- char str[INSTR_DEFAULT_STR_SIZE];
-
//that's the end, let's destroy it
//that's the end, let's destroy it
- container_t container = PJ_container_get (instr_process_id(process, str, len));
- PJ_container_remove_from_parent (container);
- PJ_container_free (container);
+ TRACE_msg_process_destroy(MSG_process_get_name (process), MSG_process_get_PID (process), MSG_process_get_host (process));
simdata->data = data;
simdata->last_errno = MSG_OK;
simdata->data = data;
simdata->last_errno = MSG_OK;
+ int future_simix_process_pid = SIMIX_process_get_maxpid();
+ TRACE_msg_process_create(name, future_simix_process_pid, host);
+
/* Let's create the process: SIMIX may decide to start it right now,
* even before returning the flow control to us */
/* Let's create the process: SIMIX may decide to start it right now,
* even before returning the flow control to us */
- simcall_process_create(&process, name, code, simdata, sg_host_name(host), -1,
+ simcall_process_create(&process, name, code, simdata, sg_host_name(host), -1,
argc, argv, properties,0);
argc, argv, properties,0);
-
- TRACE_msg_process_create(name, SIMIX_process_get_PID(process), host);
+ xbt_assert(future_simix_process_pid == SIMIX_process_get_PID(process));
if (!process) {
/* Undo everything we have just changed */
if (!process) {
/* Undo everything we have just changed */