Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
a9f67c98cef7b61c827d49f6ed266a27b656853f
[simgrid.git] / tools / tesh2 / src / units.c
1 #include <units.h>\r
2 #include <unit.h>\r
3 #include <fstreams.h>\r
4 \r
5 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);\r
6 \r
7 units_t\r
8 units_new(runner_t runner, fstreams_t fstreams)\r
9 {\r
10         fstream_t fstream;\r
11         unsigned int i;\r
12         unit_t unit;\r
13         \r
14         units_t units =  xbt_new0(s_units_t, 1);\r
15 \r
16         units->items = xbt_dynar_new(sizeof(unit_t), (void_f_pvoid_t)unit_free);\r
17 \r
18         xbt_dynar_foreach(fstreams->items, i, fstream)\r
19         {\r
20                 unit = unit_new(runner, NULL, NULL, fstream);\r
21                 xbt_dynar_push(units->items, &unit);\r
22         }\r
23         \r
24         return units;\r
25 }\r
26 \r
27 \r
28 int\r
29 units_is_empty(units_t units)\r
30 {\r
31         if(!units)\r
32         {\r
33                 errno = EINVAL;\r
34                 return 0;\r
35         }\r
36         \r
37         return (0 == xbt_dynar_length(units->items));\r
38 }\r
39 \r
40 int\r
41 units_get_size(units_t units)\r
42 {\r
43         if(!units)\r
44         {\r
45                 errno = EINVAL;\r
46                 return -1;\r
47         }\r
48 \r
49         return xbt_dynar_length(units->items);\r
50 }\r
51 \r
52 \r
53 int\r
54 units_run_all(units_t units, xbt_os_mutex_t mutex)\r
55 {\r
56         unit_t unit;\r
57         unsigned int i;\r
58         \r
59         if(!units)\r
60                 return EINVAL;\r
61                 \r
62         if(!xbt_dynar_length(units->items))\r
63                 return EAGAIN;\r
64 \r
65         xbt_dynar_foreach(units->items, i, unit)\r
66         {\r
67                 unit_run(unit, mutex);\r
68         }\r
69 \r
70         return 0;\r
71 }\r
72 \r
73 int\r
74 units_join_all(units_t units)\r
75 {\r
76         unit_t unit;\r
77         unsigned int i;\r
78         \r
79         if(!units)\r
80                 return EINVAL;\r
81                 \r
82         if(!xbt_dynar_length(units->items))\r
83                 return EAGAIN;\r
84 \r
85         xbt_dynar_foreach(units->items, i, unit)\r
86         {\r
87                 if(unit->thread)\r
88                         xbt_os_thread_join(unit->thread, NULL);\r
89         }\r
90 \r
91         return 0;\r
92 }\r
93 \r
94 int\r
95 units_interrupt_all(units_t units)\r
96 {\r
97         unit_t unit;\r
98         unsigned int i;\r
99         \r
100         if(!units)\r
101                 return EINVAL;\r
102 \r
103         if(!xbt_dynar_length(units->items))\r
104                 return EAGAIN;\r
105 \r
106         xbt_dynar_foreach(units->items, i, unit)\r
107         {\r
108                 if(!(unit->successeded) && !(unit->interrupted))\r
109                         unit_interrupt(unit);\r
110                 else\r
111                 {\r
112                         if(!unit->released && unit->sem)\r
113                         {\r
114                                 unit->released = 1;\r
115                                 xbt_os_sem_release(unit->sem);\r
116                         }\r
117                 }\r
118                         \r
119         }\r
120         \r
121         return 0;\r
122 }\r
123 \r
124 int\r
125 units_summuarize(units_t units)\r
126 {\r
127         unit_t unit;\r
128         unsigned int i;\r
129 \r
130         if(!units)\r
131                 return EINVAL;\r
132 \r
133         if(!xbt_dynar_length(units->items))\r
134                 return EAGAIN;\r
135 \r
136         xbt_dynar_foreach(units->items, i, unit)\r
137         {\r
138                 unit_summuarize(unit);\r
139         }\r
140         \r
141         return 0;\r
142         \r
143 }\r
144 \r
145 int\r
146 units_reset_all(units_t units)\r
147 {\r
148         unit_t unit;\r
149         unsigned int i;\r
150         \r
151         if(!units)\r
152                 return EINVAL;\r
153         \r
154         if(!xbt_dynar_length(units->items))\r
155                 return EAGAIN;\r
156 \r
157         xbt_dynar_foreach(units->items, i, unit)\r
158         {\r
159                 unit_reset(unit);\r
160         }\r
161         return 0;\r
162 }\r
163 \r
164 int\r
165 units_free(void** unitsptr)\r
166 {\r
167         if(!(*unitsptr))\r
168                 return EINVAL;\r
169         \r
170         if((*((units_t*)unitsptr))->items)\r
171                 xbt_dynar_free(&((*((units_t*)unitsptr))->items));\r
172                 \r
173         free(*unitsptr);\r
174         *unitsptr = NULL;\r
175         \r
176         return 0;\r
177 }\r
178 \r