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
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);
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);
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);
static char **parse_argv = NULL;
static m_process_code_t parse_code = NULL;
static m_host_t parse_host = NULL;
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);
static void parse_process_init(void)
{
parse_host = MSG_get_host_by_name(A_process_host);
parse_argc++;
parse_argv = xbt_realloc(parse_argv, (parse_argc) * sizeof(char *));
parse_argv[(parse_argc) - 1] = xbt_strdup(A_process_function);
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)
}
static void parse_argument(void)
static void parse_process_finalize(void)
{
MSG_process_create_with_arguments(parse_argv[0], parse_code, NULL, parse_host,
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
}
/** \ingroup msg_easier_life
while (1) {
xbt_context_empty_trash();
while ((process = xbt_fifo_pop(msg_global->process_to_run))) {
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();
}
DEBUG1("%lg : Calling surf_solve",MSG_getClock());
elapsed_time = surf_solve();
* \brief Creates and runs a new #m_process_t.
*
* Does exactly the same as #MSG_process_create_with_arguments but without
* \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)
{
* \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)
}
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_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);
{
simdata_process_t simdata = xbt_new0(s_simdata_process_t,1);
m_process_t process = xbt_new0(s_m_process_t,1);
simdata->waiting_task = NULL;
simdata->argc = argc;
simdata->argv = argv;
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);
simdata->context = xbt_context_new(code, NULL, NULL,
MSG_process_cleanup, process,
simdata->argc, simdata->argv);
msg_global->current_process = self;
xbt_fifo_push(msg_global->process_list, process);
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);
PAJE_PROCESS_NEW(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 */
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 ********************************/
} s_simdata_process_t;
/************************** Global variables ********************************/