X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/45c3f1cfee86fb48c96d53f8267f99b6db6e3d7a..c35d96ad90503621662ae5a70d481a5671e06341:/src/msg/msg_gos.c diff --git a/src/msg/msg_gos.c b/src/msg/msg_gos.c index b80ae0f7d1..7c01ce1e53 100644 --- a/src/msg/msg_gos.c +++ b/src/msg/msg_gos.c @@ -58,7 +58,7 @@ msg_error_t MSG_parallel_task_execute(msg_task_t task) xbt_assert((!simdata->compute) && (task->simdata->isused == 0), "This task is executed somewhere else. Go fix your code! %d", - task->simdata->isused); + task->simdata->isused!=NULL); XBT_DEBUG("Computing on %s", MSG_process_get_name(MSG_process_self())); @@ -71,8 +71,10 @@ msg_error_t MSG_parallel_task_execute(msg_task_t task) TRY { - - simdata->isused=1; + if (msg_global->debug_multiple_use) + MSG_BT(simdata->isused, "Using Backtrace"); + else + simdata->isused = (void*)1; if (simdata->host_nb > 0) { simdata->compute = simcall_host_parallel_execute(task->name, @@ -103,7 +105,9 @@ msg_error_t MSG_parallel_task_execute(msg_task_t task) p_simdata->waiting_action = NULL; - simdata->isused=0; + if (msg_global->debug_multiple_use && simdata->isused!=0) + xbt_ex_free(*(xbt_ex_t*)simdata->isused); + simdata->isused = 0; XBT_DEBUG("Execution task '%s' finished in state %d", task->name, (int)comp_state); @@ -405,10 +409,22 @@ msg_comm_t MSG_task_isend_internal(msg_task_t task, const char *alias, t_simdata->sender = process; t_simdata->source = ((simdata_process_t) SIMIX_process_self_get_data(process))->m_host; - xbt_assert(t_simdata->isused == 0, - "This task is still being used somewhere else. You cannot send it now. Go fix your code!"); + if (t_simdata->isused != 0) { + if (msg_global->debug_multiple_use){ + XBT_ERROR("This task is already used in there:"); + xbt_backtrace_display(t_simdata->isused); + XBT_ERROR("And you try to reuse it from here:"); + xbt_backtrace_display_current(); + } else { + xbt_assert(t_simdata->isused == 0, + "This task is still being used somewhere else. You cannot send it now. Go fix your code! (use --cfg=msg/debug_multiple_use:on to get the backtrace of the other process)"); + } + } - t_simdata->isused = 1; + if (msg_global->debug_multiple_use) + MSG_BT(t_simdata->isused, "Using Backtrace"); + else + t_simdata->isused = (void*)1; t_simdata->comm = NULL; msg_global->sent_msg++; @@ -430,12 +446,10 @@ msg_comm_t MSG_task_isend_internal(msg_task_t task, const char *alias, } #ifdef HAVE_TRACING - if (TRACE_is_enabled()) { - simcall_set_category(comm->s_comm, task->category); - } -#endif + if (TRACE_is_enabled()) { + simcall_set_category(act, task->category); + } -#ifdef HAVE_TRACING if (call_end) TRACE_msg_task_put_end(); #endif @@ -616,7 +630,10 @@ int MSG_comm_test(msg_comm_t comm) if (finished && comm->task_received != NULL) { /* I am the receiver */ - (*comm->task_received)->simdata->isused = 0; + simdata_task_t simdata = (*comm->task_received)->simdata; + if (msg_global->debug_multiple_use && simdata->isused!=0) + xbt_ex_free(*(xbt_ex_t*)simdata->isused); + simdata->isused = 0; } } CATCH(e) { @@ -690,7 +707,10 @@ int MSG_comm_testany(xbt_dynar_t comms) if (status == MSG_OK && comm->task_received != NULL) { /* I am the receiver */ - (*comm->task_received)->simdata->isused = 0; + simdata_task_t simdata = (*comm->task_received)->simdata; + if (msg_global->debug_multiple_use && simdata->isused!=0) + xbt_ex_free(*(xbt_ex_t*)simdata->isused); + simdata->isused = 0; } } @@ -723,7 +743,10 @@ msg_error_t MSG_comm_wait(msg_comm_t comm, double timeout) if (comm->task_received != NULL) { /* I am the receiver */ - (*comm->task_received)->simdata->isused = 0; + simdata_task_t simdata = (*comm->task_received)->simdata; + if (msg_global->debug_multiple_use && simdata->isused!=0) + xbt_ex_free(*(xbt_ex_t*)simdata->isused); + simdata->isused = 0; } /* FIXME: these functions are not traceable */ @@ -810,7 +833,10 @@ int MSG_comm_waitany(xbt_dynar_t comms) if (comm->task_received != NULL) { /* I am the receiver */ - (*comm->task_received)->simdata->isused = 0; + simdata_task_t simdata = (*comm->task_received)->simdata; + if (msg_global->debug_multiple_use && simdata->isused!=0) + xbt_ex_free(*(xbt_ex_t*)simdata->isused); + simdata->isused = 0; } return finished_index;