*/
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);
*/
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 */
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 */
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
*
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) {
*/
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 */
}
}
-/** \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.
*
* 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
{
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.
*
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.
*
* 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
* 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
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);
-}