Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Implement functions SD_get_amount, SD_get_remaining_amount, SD_watch and SD_unwatch
authorthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 21 Jun 2006 09:46:18 +0000 (09:46 +0000)
committerthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 21 Jun 2006 09:46:18 +0000 (09:46 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2416 48e7efb5-ca39-0410-a469-dd3cf9ba447f

include/simdag/datatypes.h
src/simdag/private.h
src/simdag/sd_task.c
testsuite/simdag/sd_test.c

index 894e214..bbd5f15 100644 (file)
@@ -19,10 +19,11 @@ typedef struct SD_workstation {
 
 /* Task state */
 typedef enum {
-  SD_SCHEDULED,
-  SD_RUNNING,
-  SD_DONE,
-  SD_FAILED
+  SD_NOT_SCHEDULED = 0, /* 0 because SD_NOT_SCHEDULED is not a valid state for SD_watch and SD_unwatch */
+  SD_SCHEDULED =     0x0001,
+  SD_RUNNING =       0x0002,
+  SD_DONE =          0x0004,
+  SD_FAILED =        0x0008 
 } SD_task_state_t;
 
 /* Task */
index e115ebd..209556f 100644 (file)
@@ -4,6 +4,7 @@
 #include "xbt/dict.h"
 #include "simdag/simdag.h"
 #include "simdag/datatypes.h"
+#include "surf/surf.h"
 
 #define CHECK_INIT_DONE() xbt_assert0(sd_global != NULL, "SD_init not called yet")
 
@@ -31,9 +32,12 @@ typedef struct SD_workstation_data {
 typedef struct SD_task_data {
   char *name;
   SD_task_state_t state;
-  /*double amount;
-    double remaining_amount;*/
-  /* TODO: dependencies + watch */
+  double amount;
+  surf_action_t surf_action;
+  unsigned short watch_points;
+
+  /*  double remaining_amount;*/
+  /* TODO: dependencies */
 } s_SD_task_data_t;
 
 /* Private functions */
index ea0d862..6368c70 100644 (file)
@@ -7,17 +7,20 @@
 SD_task_t SD_task_create(const char *name, void *data, double amount) {
   CHECK_INIT_DONE();
   xbt_assert0(name != NULL, "name is NULL !");
-  xbt_assert0(amount >= 0, "amount must be positive"); /* or amount > 0 ? */
+  xbt_assert0(amount > 0, "amount must be positive");
 
   SD_task_data_t sd_data = xbt_new0(s_SD_task_data_t, 1); /* task private data */
   sd_data->name = xbt_strdup(name);
-  sd_data->state = SD_SCHEDULED; /* not sure */
+  sd_data->state = SD_NOT_SCHEDULED;
+  sd_data->amount = amount;
+  sd_data->surf_action = NULL;
+  sd_data->watch_points = 0;
 
   SD_task_t task = xbt_new0(s_SD_task_t, 1);
   task->sd_data = sd_data; /* private data */
   task->data = data; /* user data */
 
-  /* TODO: dependencies + watch */
+  /* TODO: dependencies */
 
   return task;
 }
@@ -63,20 +66,19 @@ const char* SD_task_get_name(SD_task_t task) {
 double SD_task_get_amount(SD_task_t task) {
   CHECK_INIT_DONE();
   xbt_assert0(task, "Invalid parameter");
-
-  /* TODO */
-  return 0;
-  /*return task->amount;*/
+  return task->sd_data->amount;
 }
 
 /* Returns the remaining computing amount of a task.
  */
 double SD_task_get_remaining_amount(SD_task_t task) {
   CHECK_INIT_DONE();
-  xbt_assert0(task, "Invalid parameter")
-
-  /* TODO (surf encapsulation) */;
-  return 0;
+  xbt_assert0(task, "Invalid parameter");
+  SD_task_data_t sd_data = task->sd_data;
+  if (sd_data->surf_action == NULL)
+    return sd_data->amount;
+  else
+    return sd_data->surf_action->remains;
 }
 
 /* Adds a dependency between two tasks.
@@ -95,7 +97,7 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst) {
   /* TODO */
 }
 
-/* Returns the state of a task: SD_SCHEDULED, SD_RUNNING, SD_DONE or SD_FAILED.
+/* Returns the state of a task: SD_NOT_SCHEDULED, SD_SCHEDULED, SD_RUNNING, SD_DONE or SD_FAILED.
  */
 SD_task_state_t SD_task_get_state(SD_task_t task) {
   CHECK_INIT_DONE();
@@ -103,14 +105,32 @@ SD_task_state_t SD_task_get_state(SD_task_t task) {
   return task->sd_data->state;
 }
 
+/* temporary function for debugging */
+void __SD_print_watch_points(SD_task_t task) {
+  static const int state_masks[] = {SD_SCHEDULED, SD_RUNNING, SD_DONE, SD_FAILED};
+  static const char* state_names[] = {"scheduled", "running", "done", "failed"};
+
+  printf("Task '%s' watch points (%x): ", task->sd_data->name, task->sd_data->watch_points);
+
+  int i;
+  for (i = 0; i < 4; i++) {
+    if (task->sd_data->watch_points & state_masks[i])
+      printf("%s ", state_names[i]);
+      
+  }
+  printf("\n");
+}
+
 /* Adds a watch point to a task.
    SD_simulate will stop as soon as the state of this task is the one given in argument.
    Watch point is then automatically removed.
  */
-void  SD_task_watch(SD_task_t task, SD_task_state_t state) {
+void SD_task_watch(SD_task_t task, SD_task_state_t state) {
   CHECK_INIT_DONE();
   xbt_assert0(task, "Invalid parameter");
-  /* TODO */
+
+  task->sd_data->watch_points = task->sd_data->watch_points | state;
+  __SD_print_watch_points(task);
 }
 
 /* Removes a watch point from a task.
@@ -118,7 +138,9 @@ void  SD_task_watch(SD_task_t task, SD_task_state_t state) {
 void SD_task_unwatch(SD_task_t task, SD_task_state_t state) {
   CHECK_INIT_DONE();
   xbt_assert0(task, "Invalid parameter");
-  /* TODO */
+  
+  task->sd_data->watch_points = task->sd_data->watch_points & ~state;
+  __SD_print_watch_points(task);
 }
 
 /* Unschedules a task.
@@ -135,7 +157,7 @@ void SD_task_unschedule(SD_task_t task) {
 void SD_task_destroy(SD_task_t task) {
   CHECK_INIT_DONE();
   xbt_free(task->sd_data->name);
-
-  /* TODO: dependencies + watch */
+  xbt_free(task->sd_data);
+  /* TODO: dependencies */
   xbt_free(task);
 }
index cf0b64a..c55ea76 100644 (file)
@@ -26,8 +26,15 @@ int main(int argc, char **argv) {
   SD_create_environment(platform_file);
 
   /* creation of the tasks and their dependencies */
-  
+  SD_task_t task1 = SD_task_create("Task 1", NULL, 10.0);
 
+  /* watch points */
+  SD_task_watch(task1, SD_SCHEDULED);
+  SD_task_watch(task1, SD_DONE);
+  SD_task_unwatch(task1, SD_SCHEDULED);
+  SD_task_watch(task1, SD_DONE);
+  SD_task_watch(task1, SD_SCHEDULED);
+  
   /* let's launch the simulation! */
   SD_simulate(100);