From d1090ad7375e9ffbd83c87cb3b7622aead1084b3 Mon Sep 17 00:00:00 2001 From: mquinson Date: Wed, 25 May 2005 13:59:42 +0000 Subject: [PATCH] Start the implementation of start_time and kill_time in the msg deployment. First bad news, I had to change the prototype of MSG_process_create_with_arguments. But until we use an option set here, there is no way to let the code evolving without such breakage (TODO). Second bad news: I didn't manage to implement start_time, ie to let processes sleep an arbitrary amount of time even before running at the first place. Third bad news: kill_time implementation seems buggy: examples/gras/ping hangs when the client has kill_time=0.8, ie when it dies during its sleep. I suspect a bug somewhere in MSG_process_kill In summary, Arnaud, please heeeelp :-/ git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1296 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- include/msg/msg.h | 3 ++- src/msg/deployment.c | 8 ++++++-- src/msg/global.c | 24 ++++++++++++++++-------- src/msg/m_process.c | 15 +++++++++++---- src/msg/private.h | 1 + 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/include/msg/msg.h b/include/msg/msg.h index 6cf8df0d93..ecb2eacba2 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -51,7 +51,8 @@ m_process_t MSG_process_create(const char *name, m_host_t host); m_process_t MSG_process_create_with_arguments(const char *name, m_process_code_t code, void *data, - m_host_t host, int argc, char **argv); + m_host_t host, int argc, char **argv, + double start_time, double kill_time); void MSG_process_kill(m_process_t process); int MSG_process_killall(int reset_PIDs); MSG_error_t MSG_get_arguments(int *argc, char ***argv); diff --git a/src/msg/deployment.c b/src/msg/deployment.c index 4f61e3a4f5..87649dddae 100644 --- a/src/msg/deployment.c +++ b/src/msg/deployment.c @@ -16,7 +16,9 @@ static int parse_argc = -1 ; static char **parse_argv = NULL; static m_process_code_t parse_code = NULL; static m_host_t parse_host = NULL; - +static double start_time = 0.0; +static double kill_time = -1.0; + static void parse_process_init(void) { parse_host = MSG_get_host_by_name(A_process_host); @@ -28,6 +30,8 @@ static void parse_process_init(void) parse_argc++; parse_argv = xbt_realloc(parse_argv, (parse_argc) * sizeof(char *)); parse_argv[(parse_argc) - 1] = xbt_strdup(A_process_function); + surf_parse_get_double(&start_time,A_process_start_time); + surf_parse_get_double(&kill_time,A_process_kill_time); } static void parse_argument(void) @@ -40,7 +44,7 @@ static void parse_argument(void) static void parse_process_finalize(void) { MSG_process_create_with_arguments(parse_argv[0], parse_code, NULL, parse_host, - parse_argc,parse_argv); + parse_argc,parse_argv,start_time,kill_time); } /** \ingroup msg_easier_life diff --git a/src/msg/global.c b/src/msg/global.c index 9160e07c5d..f08dabb5d0 100644 --- a/src/msg/global.c +++ b/src/msg/global.c @@ -325,14 +325,22 @@ MSG_error_t MSG_main(void) while (1) { xbt_context_empty_trash(); while ((process = xbt_fifo_pop(msg_global->process_to_run))) { -/* fprintf(stderr,"-> %s (%d)\n",process->name, process->simdata->PID); */ - DEBUG3("Scheduling %s(%d) on %s", - process->name,process->simdata->PID, - process->simdata->host->name); - msg_global->current_process = process; - fflush(NULL); - xbt_context_schedule(process->simdata->context); - msg_global->current_process = NULL; + if (process->simdata->kill_time >= 0.0 && + process->simdata->kill_time < surf_get_clock()) { + INFO3("KILLING %s(%d) on %s (kill_time elapsed; too bad)", + process->name,process->simdata->PID, + process->simdata->host->name); + MSG_process_kill(process); + + } else { + DEBUG3("Scheduling %s(%d) on %s", + process->name,process->simdata->PID, + process->simdata->host->name); + msg_global->current_process = process; + fflush(NULL); + xbt_context_schedule(process->simdata->context); + msg_global->current_process = NULL; + } } DEBUG1("%lg : Calling surf_solve",MSG_getClock()); elapsed_time = surf_solve(); diff --git a/src/msg/m_process.c b/src/msg/m_process.c index c80cc6b7f8..21f8d36f8c 100644 --- a/src/msg/m_process.c +++ b/src/msg/m_process.c @@ -27,14 +27,14 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(m_process, msg, * \brief Creates and runs a new #m_process_t. * * Does exactly the same as #MSG_process_create_with_arguments but without - providing standard arguments (\a argc, \a argv). + providing standard arguments (\a argc, \a argv, \a start_time, \a kill_time). * \sa MSG_process_create_with_arguments */ m_process_t MSG_process_create(const char *name, m_process_code_t code, void *data, m_host_t host) { - return MSG_process_create_with_arguments(name, code, data, host, -1, NULL); + return MSG_process_create_with_arguments(name, code, data, host, -1, NULL, 0.0, -1.0); } static void MSG_process_cleanup(void *arg) @@ -80,7 +80,8 @@ static void MSG_process_cleanup(void *arg) */ m_process_t MSG_process_create_with_arguments(const char *name, m_process_code_t code, void *data, - m_host_t host, int argc, char **argv) + m_host_t host, int argc, char **argv, + double start_time, double kill_time) { simdata_process_t simdata = xbt_new0(s_simdata_process_t,1); m_process_t process = xbt_new0(s_m_process_t,1); @@ -94,6 +95,7 @@ m_process_t MSG_process_create_with_arguments(const char *name, simdata->waiting_task = NULL; simdata->argc = argc; simdata->argv = argv; + simdata->kill_time = kill_time; simdata->context = xbt_context_new(code, NULL, NULL, MSG_process_cleanup, process, simdata->argc, simdata->argv); @@ -119,7 +121,12 @@ m_process_t MSG_process_create_with_arguments(const char *name, msg_global->current_process = self; xbt_fifo_push(msg_global->process_list, process); - xbt_fifo_push(msg_global->process_to_run, process); + if (start_time == 0.0) { + xbt_fifo_push(msg_global->process_to_run, process); + } else { + /* FIXME: let the process sleep for the specified amount of time */ + xbt_fifo_push(msg_global->process_to_run, process); + } PAJE_PROCESS_NEW(process); diff --git a/src/msg/private.h b/src/msg/private.h index 2f196335a8..d93d251980 100644 --- a/src/msg/private.h +++ b/src/msg/private.h @@ -55,6 +55,7 @@ typedef struct simdata_process { char **argv; /* arguments table if any */ MSG_error_t last_errno; /* the last value returned by a MSG_function */ int paje_state; /* the number of state stacked with Paje */ + double kill_time; /* When to kill the process */ } s_simdata_process_t; /************************** Global variables ********************************/ -- 2.20.1