Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
35d35cd692d7ad239053df8af22d3b5974f32de0
[simgrid.git] / examples / simdag / sd_test.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "simdag/simdag.h"
4 #include "xbt/ex.h"
5 #include "xbt/log.h"
6
7 XBT_LOG_NEW_DEFAULT_CATEGORY(sd_test,
8                              "Logging specific to this SimDag example");
9
10 int main(int argc, char **argv) {
11   
12   /* initialisation of SD */
13   SD_init(&argc, argv);
14
15   /*  xbt_log_control_set("sd.thres=debug");*/
16
17   if (argc < 2) {
18      INFO1("Usage: %s platform_file", argv[0]);
19      INFO1("example: %s sd_platform.xml", argv[0]);
20      exit(1);
21   }
22
23   /* creation of the environment */
24   char * platform_file = argv[1];
25   SD_create_environment(platform_file);
26
27   /* creation of the tasks and their dependencies */
28   SD_task_t taskA = SD_task_create("Task A", NULL, 10.0);
29   SD_task_t taskB = SD_task_create("Task B", NULL, 40.0);
30   SD_task_t taskC = SD_task_create("Task C", NULL, 30.0);
31   SD_task_t taskD = SD_task_create("Task D", NULL, 60.0);
32   
33   SD_task_dependency_add(NULL, NULL, taskB, taskA);
34   SD_task_dependency_add(NULL, NULL, taskC, taskA);
35   SD_task_dependency_add(NULL, NULL, taskD, taskB);
36   SD_task_dependency_add(NULL, NULL, taskD, taskC);
37   /*  SD_task_dependency_add(NULL, NULL, taskA, taskD); /\* deadlock */
38
39   /* let's launch the simulation! */
40
41   int workstation_number = 2;
42   SD_workstation_t *workstation_list = SD_workstation_get_list();
43   double computation_amount[] = {100, 200};
44   double communication_amount[] =
45     {
46       0, 30,
47       20, 0
48     };
49   double rate = 1;
50
51   SD_task_schedule(taskA, workstation_number, workstation_list,
52                    computation_amount, communication_amount, rate);
53   SD_task_schedule(taskB, workstation_number, workstation_list,
54                    computation_amount, communication_amount, rate);
55   SD_task_schedule(taskC, workstation_number, workstation_list,
56                    computation_amount, communication_amount, rate);
57   SD_task_schedule(taskD, workstation_number, workstation_list,
58                    computation_amount, communication_amount, rate);
59
60   SD_task_watch(taskC, SD_DONE);
61
62   SD_task_t *changed_tasks;
63   int i;
64
65   changed_tasks = SD_simulate(0.001);
66   
67   while (changed_tasks[0] != NULL) {
68     INFO0("Tasks whose state has changed:");
69     i = 0;
70     while(changed_tasks[i] != NULL) {
71       switch (SD_task_get_state(changed_tasks[i])) {
72       case SD_SCHEDULED:
73         INFO1("%s is scheduled.", SD_task_get_name(changed_tasks[i]));
74         break;
75       case SD_READY:
76         INFO1("%s is ready.", SD_task_get_name(changed_tasks[i]));
77         break;
78       case SD_RUNNING:
79         INFO1("%s is running.", SD_task_get_name(changed_tasks[i]));
80         break;
81       case SD_DONE:
82         INFO1("%s is done.", SD_task_get_name(changed_tasks[i]));
83         break;
84       case SD_FAILED:
85         INFO1("%s is failed.", SD_task_get_name(changed_tasks[i]));
86         break;
87       default:
88         INFO1("Unknown status for %s", SD_task_get_name(changed_tasks[i]));
89         break;
90       }
91       i++;
92     }
93     free(changed_tasks);
94     changed_tasks = SD_simulate(100);
95   }
96
97   free(changed_tasks);
98
99   SD_task_destroy(taskA);
100   SD_task_destroy(taskB);
101   SD_task_destroy(taskC);
102   SD_task_destroy(taskD);
103   SD_exit();
104   return 0;
105 }