X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c6367952505ec169142f91d8e97fddb9eaa0cc5a..1d093eb0c576e2f7a1d6c7a707ee55026aca3915:/src/simix/smx_process.c diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 936f38527d..18eb439fe4 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -32,18 +32,19 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_process, simix, */ smx_process_t SIMIX_process_create(const char *name, smx_process_code_t code, void *data, - smx_host_t host) + const char * hostname, void * clean_process_function) { - return SIMIX_process_create_with_arguments(name, code, data, host, -1, NULL); + return SIMIX_process_create_with_arguments(name, code, data, hostname, -1, NULL, clean_process_function); } -static void SIMIX_process_cleanup(void *arg) +void SIMIX_process_cleanup(void *arg) { xbt_swag_remove(arg, simix_global->process_list); xbt_swag_remove(arg, simix_global->process_to_run); xbt_swag_remove(arg, ((smx_process_t) arg)->simdata->host->simdata->process_list); free(((smx_process_t) arg)->name); ((smx_process_t) arg)->name = NULL; + free(((smx_process_t) arg)->simdata); ((smx_process_t) arg)->simdata = NULL; free(arg); @@ -75,11 +76,12 @@ static void SIMIX_process_cleanup(void *arg) */ smx_process_t SIMIX_process_create_with_arguments(const char *name, smx_process_code_t code, void *data, - smx_host_t host, int argc, char **argv) + const char * hostname, int argc, char **argv, void * clean_process_function) { - simdata_process_t simdata = xbt_new0(s_simdata_process_t,1); + smx_simdata_process_t simdata = xbt_new0(s_smx_simdata_process_t,1); smx_process_t process = xbt_new0(s_smx_process_t,1); smx_process_t self = NULL; + smx_host_t host = SIMIX_host_get_by_name(hostname); xbt_assert0(((code != NULL) && (host != NULL)), "Invalid parameters"); /* Simulator Data */ @@ -87,16 +89,17 @@ smx_process_t SIMIX_process_create_with_arguments(const char *name, simdata->host = host; simdata->argc = argc; simdata->argv = argv; - simdata->context = xbt_context_new(code, NULL, NULL, - SIMIX_process_cleanup, process, - simdata->argc, simdata->argv); - - if((self=simix_global->current_process)) { - //simdata->PPID = MSG_process_get_PID(self); - } else { - // simdata->PPID = -1; - } - simdata->last_errno=SIMIX_OK; + if (clean_process_function) { + simdata->context = xbt_context_new(code, NULL, NULL, + clean_process_function, process, + simdata->argc, simdata->argv); + } + else { + simdata->context = xbt_context_new(code, NULL, NULL, + SIMIX_process_cleanup, process, + simdata->argc, simdata->argv); + } + //simdata->last_errno=SIMIX_OK; /* Process structure */ @@ -104,21 +107,24 @@ smx_process_t SIMIX_process_create_with_arguments(const char *name, process->simdata = simdata; process->data = data; - xbt_swag_insert_at_head(process, host->simdata->process_list); + xbt_swag_insert(process, host->simdata->process_list); /* *************** FIX du current_process !!! *************** */ self = simix_global->current_process; xbt_context_start(process->simdata->context); simix_global->current_process = self; - xbt_swag_insert_at_head(process,simix_global->process_list); + xbt_swag_insert(process,simix_global->process_list); DEBUG2("Inserting %s(%s) in the to_run list",process->name, host->name); - xbt_swag_insert_at_head(process,simix_global->process_to_run); + xbt_swag_insert(process,simix_global->process_to_run); return process; } + + + /** \ingroup m_process_management * \param process poor victim * @@ -127,13 +133,19 @@ smx_process_t SIMIX_process_create_with_arguments(const char *name, void SIMIX_process_kill(smx_process_t process) { //int i; - simdata_process_t p_simdata = process->simdata; + smx_simdata_process_t p_simdata = process->simdata; //simdata_host_t h_simdata= p_simdata->host->simdata; //int _cursor; //smx_process_t proc = NULL; DEBUG2("Killing %s on %s",process->name, p_simdata->host->name); + if (p_simdata->mutex) { + xbt_swag_remove(process,p_simdata->mutex->sleeping); + } + if (p_simdata->cond) { + xbt_swag_remove(process,p_simdata->cond->sleeping); + } /* if(p_simdata->waiting_task) { @@ -161,7 +173,7 @@ void SIMIX_process_kill(smx_process_t process) */ xbt_swag_remove(process,simix_global->process_to_run); xbt_swag_remove(process,simix_global->process_list); - xbt_context_free(process->simdata->context); + xbt_context_kill(process->simdata->context); if(process==SIMIX_process_self()) { /* I just killed myself */ @@ -169,29 +181,6 @@ void SIMIX_process_kill(smx_process_t process) } } -/** \ingroup m_process_management - * \brief Migrates an agent to another location. - * - * This functions checks whether \a process and \a host are valid pointers - and change the value of the #m_host_t on which \a process is running. - */ -SIMIX_error_t SIMIX_process_change_host(smx_process_t process, smx_host_t host) -{ - simdata_process_t simdata = NULL; - - /* Sanity check */ - - xbt_assert0(((process) && (process->simdata) - && (host)), "Invalid parameters"); - simdata = process->simdata; - - xbt_swag_remove(process,simdata->host->simdata->process_list); - simdata->host = host; - xbt_swag_insert_at_head(process,host->simdata->process_list); - - return SIMIX_OK; -} - /** \ingroup m_process_management * \brief Return the user data of a #m_process_t. * @@ -211,14 +200,14 @@ void *SIMIX_process_get_data(smx_process_t process) * This functions checks whether \a process is a valid pointer or not and set the user data associated to \a process if it is possible. */ -SIMIX_error_t SIMIX_process_set_data(smx_process_t process,void *data) +void SIMIX_process_set_data(smx_process_t process,void *data) { xbt_assert0((process != NULL), "Invalid parameters"); xbt_assert0((process->data == NULL), "Data already set"); process->data = data; - return SIMIX_OK; + return ; } /** \ingroup m_process_management @@ -232,59 +221,9 @@ smx_host_t SIMIX_process_get_host(smx_process_t process) { xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters"); - return (((simdata_process_t) process->simdata)->host); + return (process->simdata->host); } -/** \ingroup m_process_management - * - * \brief Return a #m_process_t given its PID. - * - * This functions search in the list of all the created m_process_t for a m_process_t - whose PID is equal to \a PID. If no host is found, \c NULL is returned. - Note that the PID are uniq in the whole simulation, not only on a given host. - */ -/* -m_process_t MSG_process_from_PID(int PID) -{ - xbt_fifo_item_t i = NULL; - m_process_t process = NULL; - - xbt_fifo_foreach(msg_global->process_list,i,process,m_process_t) { - if(MSG_process_get_PID(process) == PID) return process; - } - return NULL; -} -*/ - -/** \ingroup m_process_management - * \brief Returns the process ID of \a process. - * - * This functions checks whether \a process is a valid pointer or not - and return its PID. - */ -/* -int MSG_process_get_PID(m_process_t process) -{ - xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters"); - - return (((simdata_process_t) process->simdata)->PID); -} -*/ -/** \ingroup m_process_management - * \brief Returns the process ID of the parent of \a process. - * - * This functions checks whether \a process is a valid pointer or not - and return its PID. Returns -1 if the agent has not been created by - another agent. - */ -/* -int MSG_process_get_PPID(m_process_t process) -{ - xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters"); - - return (((simdata_process_t) process->simdata)->PPID); -} -*/ /** \ingroup m_process_management * \brief Return the name of an agent. * @@ -298,29 +237,6 @@ const char *SIMIX_process_get_name(smx_process_t process) return (process->name); } -/** \ingroup m_process_management - * \brief Return the PID of the current agent. - * - * This functions returns the PID of the currently running #m_process_t. - */ -/* -int MSG_process_self_PID(void) -{ - return (MSG_process_get_PID(MSG_process_self())); -} -*/ -/** \ingroup m_process_management - * \brief Return the PPID of the current agent. - * - * This functions returns the PID of the parent of the currently - * running #m_process_t. - */ -/* -int MSG_process_self_PPID(void) -{ - return (MSG_process_get_PPID(MSG_process_self())); -} -*/ /** \ingroup m_process_management * \brief Return the current agent. * @@ -337,55 +253,54 @@ smx_process_t SIMIX_process_self(void) * This functions suspend the process by suspending the task on which * it was waiting for the completion. */ -SIMIX_error_t SIMIX_process_suspend(smx_process_t process) +void SIMIX_process_suspend(smx_process_t process) { -/* - simdata_process_t simdata = NULL; - simdata_task_t simdata_task = NULL; - - XBT_IN2("(%p(%s))", process, process->name); - + smx_simdata_process_t simdata = NULL; + xbt_assert0(((process) && (process->simdata)), "Invalid parameters"); - PAJE_PROCESS_PUSH_STATE(process,"S",NULL); - if(process!=SIMIX_process_self()) { simdata = process->simdata; - xbt_assert0(simdata->waiting_task,"Process not waiting for anything else. Weird !"); - - simdata_task = simdata->waiting_task->simdata; - - simdata->suspended = 1; - if(simdata->blocked) { - XBT_OUT; - return SIMIX_OK; - } - - xbt_assert0(((simdata_task->compute)||(simdata_task->comm))&& - !((simdata_task->compute)&&(simdata_task->comm)), - "Got a problem in deciding which action to choose !"); - simdata->suspended = 1; - if(simdata_task->compute) - surf_workstation_resource->common_public->suspend(simdata_task->compute); - else - surf_workstation_resource->common_public->suspend(simdata_task->comm); - } else { - m_task_t dummy = MSG_TASK_UNINITIALIZED; - dummy = MSG_task_create("suspended", 0.0, 0, NULL); - - simdata = process->simdata; - simdata->suspended = 1; - __MSG_task_execute(process,dummy); - surf_workstation_resource->common_public->suspend(dummy->simdata->compute); - __MSG_wait_for_computation(process,dummy); - simdata->suspended = 0; - - MSG_task_destroy(dummy); + if (simdata->mutex) { + /* process blocked on a mutex, only set suspend=1 */ + simdata->suspended = 1; + } + else if (simdata->cond){ + /* process blocked cond, suspend all actions */ + + /* temporaries variables */ + smx_cond_t c; + xbt_fifo_item_t i; + smx_action_t act; + + simdata->suspended = 1; + c = simdata->cond; + xbt_fifo_foreach(c->actions,i,act, smx_action_t) { + surf_workstation_resource->common_public->suspend(act->simdata->surf_action); + } + } + else { + simdata->suspended = 1; + } } - XBT_OUT; - */ - return SIMIX_OK; + else { + /* process executing, I can create an action and suspend it */ + process->simdata->suspended = 1; + smx_action_t dummy; + smx_cond_t cond; + char name[] = "dummy"; + + cond = SIMIX_cond_init(); + dummy = SIMIX_action_execute(SIMIX_process_get_host(process), name, 0); + surf_workstation_resource->common_public->set_priority(dummy->simdata->surf_action,0.0); + SIMIX_register_condition_to_action(dummy,cond); + SIMIX_register_action_to_condition(dummy,cond); + __SIMIX_cond_wait(cond); + //SIMIX_action_destroy(dummy); + //SIMIX_cond_destroy(cond); + } + return ; } /** \ingroup m_process_management @@ -394,52 +309,41 @@ SIMIX_error_t SIMIX_process_suspend(smx_process_t process) * This functions resume a suspended process by resuming the task on * which it was waiting for the completion. */ -SIMIX_error_t SIMIX_process_resume(smx_process_t process) +void SIMIX_process_resume(smx_process_t process) { -/* - simdata_process_t simdata = NULL; - simdata_task_t simdata_task = NULL; + smx_simdata_process_t simdata = NULL; xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters"); CHECK_HOST(); - XBT_IN2("(%p(%s))", process, process->name); - if(process == SIMIX_process_self()) { - XBT_OUT; - SIMIX_RETURN(SIMIX_OK); + return; } simdata = process->simdata; - - if(simdata->blocked) { - PAJE_PROCESS_POP_STATE(process); - - simdata->suspended = 0; *//* He'll wake up by itself */ - /*XBT_OUT; - SIMIX_RETURN(SIMIX_OK); - } - - if(!(simdata->waiting_task)) { - xbt_assert0(0,"Process not waiting for anything else. Weird !"); - XBT_OUT; - return SIMIX_WARNING; - } - simdata_task = simdata->waiting_task->simdata; - - - if(simdata_task->compute) { - surf_workstation_resource->common_public->resume(simdata_task->compute); - PAJE_PROCESS_POP_STATE(process); - } - else { - PAJE_PROCESS_POP_STATE(process); - surf_workstation_resource->common_public->resume(simdata_task->comm); + if(simdata->mutex) { + DEBUG0("Resume process blocked on a mutex"); + simdata->suspended = 0; /* He'll wake up by itself */ + return; } + else if (simdata->cond) { + DEBUG0("Resume process blocked on a conditional"); + /* temporaries variables */ + smx_cond_t c; + xbt_fifo_item_t i; + smx_action_t act; + simdata->suspended = 0; + c = simdata->cond; + xbt_fifo_foreach(c->actions,i,act, smx_action_t) { + surf_workstation_resource->common_public->resume(act->simdata->surf_action); + } + return; + } + else { + simdata->suspended = 0; + xbt_swag_insert(process,simix_global->process_to_run); + } - XBT_OUT; - */ - SIMIX_RETURN(SIMIX_OK); } /** \ingroup m_process_management @@ -455,75 +359,5 @@ int SIMIX_process_is_suspended(smx_process_t process) return (process->simdata->suspended); } -int __SIMIX_process_block(double max_duration, const char *info) -{ -/* - smx_process_t process = SIMIX_process_self(); - m_task_t dummy = SIMIX_TASK_UNINITIALIZED; - char blocked_name[512]; - snprintf(blocked_name,512,"blocked [%s] (%s:%s)", - info, process->name, process->simdata->host->name); - - XBT_IN1(": max_duration=%g",max_duration); - - dummy = MSG_task_create(blocked_name, 0.0, 0, NULL); - - PAJE_PROCESS_PUSH_STATE(process,"B",NULL); - - process->simdata->blocked=1; - __MSG_task_execute(process,dummy); - surf_workstation_resource->common_public->suspend(dummy->simdata->compute); - if(max_duration>=0) - surf_workstation_resource->common_public->set_max_duration(dummy->simdata->compute, - max_duration); - __MSG_wait_for_computation(process,dummy); - MSG_task_destroy(dummy); - process->simdata->blocked=0; - - if(process->simdata->suspended) { - DEBUG0("I've been suspended in the meantime"); - SIMIX_process_suspend(process); - DEBUG0("I've been resumed, let's keep going"); - } - - PAJE_PROCESS_POP_STATE(process); - - XBT_OUT; - */ - return 1; -} - -SIMIX_error_t __SIMIX_process_unblock(smx_process_t process) -{ -/* - simdata_process_t simdata = NULL; - simdata_task_t simdata_task = NULL; - - xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters"); - CHECK_HOST(); - XBT_IN2(": %s unblocking %s", SIMIX_process_self()->name,process->name); - simdata = process->simdata; - if(!(simdata->waiting_task)) { - xbt_assert0(0,"Process not waiting for anything else. Weird !"); - XBT_OUT; - return SIMIX_WARNING; - } - simdata_task = simdata->waiting_task->simdata; - - xbt_assert0(simdata->blocked,"Process not blocked"); - - surf_workstation_resource->common_public->resume(simdata_task->compute); - - XBT_OUT; -*/ - SIMIX_RETURN(SIMIX_OK); -} - -int __SIMIX_process_isBlocked(smx_process_t process) -{ - xbt_assert0(((process != NULL) && (process->simdata)), "Invalid parameters"); - - return (process->simdata->blocked); -}