Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Start the implementation of start_time and kill_time in the msg deployment.
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 25 May 2005 13:59:42 +0000 (13:59 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 25 May 2005 13:59:42 +0000 (13:59 +0000)
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
src/msg/deployment.c
src/msg/global.c
src/msg/m_process.c
src/msg/private.h

index 6cf8df0..ecb2eac 100644 (file)
@@ -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);
 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);
index 4f61e3a..87649dd 100644 (file)
@@ -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 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);
@@ -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);
   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)
@@ -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,
 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
index 9160e07..f08dabb 100644 (file)
@@ -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))) {
   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();
index c80cc6b..21f8d36 100644 (file)
@@ -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 
  * \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)
@@ -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_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);
@@ -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->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);
@@ -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);
   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);
 
index 2f19633..d93d251 100644 (file)
@@ -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 */
   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 ********************************/