From 96e155ad28d2c9903409dd6432dec2dcfbc55733 Mon Sep 17 00:00:00 2001 From: alegrand Date: Mon, 11 Dec 2006 13:45:25 +0000 Subject: [PATCH 1/1] Major bug fix. Some situations were not handled in MSG_process_kill. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2959 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/msg/m_process.c | 52 ++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/msg/m_process.c b/src/msg/m_process.c index 3ecbc09eec..06f85c3810 100644 --- a/src/msg/m_process.c +++ b/src/msg/m_process.c @@ -144,8 +144,8 @@ void MSG_process_kill(m_process_t process) int _cursor; m_process_t proc = NULL; -/* fprintf(stderr,"Killing %s(%d) on %s.\n",process->name, */ -/* p_simdata->PID,p_simdata->host->name); */ + DEBUG3("Killing %s(%d) on %s",process->name, p_simdata->PID, + p_simdata->host->name); for (i=0; imax_channel; i++) { if (h_simdata->sleeping[i] == process) { @@ -153,34 +153,38 @@ void MSG_process_kill(m_process_t process) break; } } - if (i==msg_global->max_channel) { - if(p_simdata->waiting_task) { - xbt_dynar_foreach(p_simdata->waiting_task->simdata->sleeping,_cursor,proc) { - if(proc==process) - xbt_dynar_remove_at(p_simdata->waiting_task->simdata->sleeping,_cursor,&proc); - } - if(p_simdata->waiting_task->simdata->compute) - surf_workstation_resource->common_public-> - action_free(p_simdata->waiting_task->simdata->compute); - else if (p_simdata->waiting_task->simdata->comm) { - surf_workstation_resource->common_public-> - action_change_state(p_simdata->waiting_task->simdata->comm,SURF_ACTION_FAILED); - surf_workstation_resource->common_public-> - action_free(p_simdata->waiting_task->simdata->comm); - } else - CRITICAL0("UNKNOWN STATUS. Please report this bug."); - } else { /* Must be trying to put a task somewhere */ - if(process==MSG_process_self()) { - return; - } else { - CRITICAL0("UNKNOWN STATUS. Please report this bug."); - } + + if(p_simdata->waiting_task) { + xbt_dynar_foreach(p_simdata->waiting_task->simdata->sleeping,_cursor,proc) { + if(proc==process) + xbt_dynar_remove_at(p_simdata->waiting_task->simdata->sleeping,_cursor,&proc); + } + if(p_simdata->waiting_task->simdata->compute) + surf_workstation_resource->common_public-> + action_free(p_simdata->waiting_task->simdata->compute); + else if (p_simdata->waiting_task->simdata->comm) { + surf_workstation_resource->common_public-> + action_change_state(p_simdata->waiting_task->simdata->comm,SURF_ACTION_FAILED); + surf_workstation_resource->common_public-> + action_free(p_simdata->waiting_task->simdata->comm); + } else { + xbt_die("UNKNOWN STATUS. Please report this bug."); } } + if ((i==msg_global->max_channel) && (process!=MSG_process_self()) && + (!p_simdata->waiting_task)) { + xbt_die("UNKNOWN STATUS. Please report this bug."); + } + xbt_fifo_remove(msg_global->process_to_run,process); xbt_fifo_remove(msg_global->process_list,process); xbt_context_free(process->simdata->context); + + if(process==MSG_process_self()) { + /* I just killed myself */ + xbt_context_yield(); + } } /** \ingroup m_process_management -- 2.20.1