Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Detect when a task reaches a watch point.
authorthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 23 Jun 2006 14:59:53 +0000 (14:59 +0000)
committerthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 23 Jun 2006 14:59:53 +0000 (14:59 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2427 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/simdag/private.h
src/simdag/sd_global.c
src/simdag/sd_task.c
testsuite/simdag/sd_test.c

index c244198..d8bf9f7 100644 (file)
@@ -16,6 +16,7 @@ typedef struct SD_global {
   int workstation_count; /* number of workstations */
   xbt_dict_t links; /* link list */
   xbt_dynar_t tasks; /* task list */
+  int watch_point_reached; /* has a task just reached a watch point? */
   
   /* task state sets */
   xbt_swag_t not_scheduled_task_set;
@@ -23,6 +24,7 @@ typedef struct SD_global {
   xbt_swag_t running_task_set;
   xbt_swag_t done_task_set;
   xbt_swag_t failed_task_set;
+
 } s_SD_global_t, *SD_global_t;
 
 extern SD_global_t sd_global;
index 3314990..254f7c0 100644 (file)
@@ -16,6 +16,7 @@ void SD_init(int *argc, char **argv) {
   sd_global->workstation_count = 0;
   sd_global->links = xbt_dict_new();
   sd_global->tasks = xbt_dynar_new(sizeof(SD_task_t), NULL);
+  sd_global->watch_point_reached = 0;
 
   s_SD_task_t task;
   sd_global->not_scheduled_task_set = xbt_swag_new(xbt_swag_offset(task, state_hookup));
@@ -68,7 +69,6 @@ SD_task_t* SD_simulate(double how_long)
 
   double total_time = 0.0; /* we stop the simulation when total_time >= how_long */
   double elapsed_time = 0.0;
-  int watch_point_reached = 0;
   int i;
   SD_task_t task;
   surf_action_t surf_action;
@@ -76,7 +76,7 @@ SD_task_t* SD_simulate(double how_long)
   surf_solve(); /* Takes traces into account. Returns 0.0 */
 
   /* main loop */
-  while (elapsed_time >= 0.0 && total_time < how_long && !watch_point_reached) {
+  while (elapsed_time >= 0.0 && total_time < how_long && !sd_global->watch_point_reached) {
     for (i = 0 ; i < xbt_dynar_length(sd_global->tasks); i++) {
       xbt_dynar_get_cpy(sd_global->tasks, i, &task);
       printf("Examining task '%s'...\n", SD_task_get_name(task));
index 66de461..3ae2ab9 100644 (file)
@@ -66,7 +66,7 @@ e_SD_task_state_t SD_task_get_state(SD_task_t task) {
   return SD_FAILED;
 }
 
-/* Changes the state of a task and update the swags.
+/* Changes the state of a task. Update the swags and the flag sd_global->watch_point_reached.
  */
 static void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) {
   xbt_swag_remove(task, task->state_set);
@@ -86,6 +86,11 @@ static void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) {
   default: /* SD_FAILED */
     task->state_set = sd_global->failed_task_set;
   }
+
+  if (task->watch_points & new_state) {
+    printf("Watch point reached with task '%s' in state %d!\n", SD_task_get_name(task), new_state);
+    sd_global->watch_point_reached = 1;
+  }
 }
 
 /* Sets the data of a task.
index 384620c..9445658 100644 (file)
@@ -74,7 +74,9 @@ int main(int argc, char **argv) {
   SD_task_unwatch(taskA, SD_SCHEDULED);
   SD_task_watch(taskA, SD_DONE);
   SD_task_watch(taskA, SD_SCHEDULED);*/
-  
+
+  SD_task_watch(taskA, SD_SCHEDULED);
+
   /* let's launch the simulation! */
 
   int workstation_number = 2;
@@ -87,10 +89,10 @@ int main(int argc, char **argv) {
     };
   double rate = 1;
 
-  printf("Scheduling task A (state = %d)...\n", SD_task_get_state(taskA));
+  /*  printf("Scheduling task A (state = %d)...\n", SD_task_get_state(taskA));*/
   SD_task_schedule(taskA, workstation_number, workstation_list,
-      computation_amount, communication_amount, rate);
-  printf("Done. Task A state: %d\n", SD_task_get_state(taskA));
+                  computation_amount, communication_amount, rate);
+  /*  printf("Done. Task A state: %d\n", SD_task_get_state(taskA));*/
 
   printf("Launching simulation...\n");
   SD_simulate(100);