Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Document the new mkfile buildin command
[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                 xbt_os_sem_acquire(jobs_sem);\r
68                 unit_run(unit, mutex);\r
69         }\r
70 \r
71         return 0;\r
72 }\r
73 \r
74 int\r
75 units_join_all(units_t units)\r
76 {\r
77         unit_t unit;\r
78         unsigned int i;\r
79         \r
80         if(!units)\r
81                 return EINVAL;\r
82                 \r
83         if(!xbt_dynar_length(units->items))\r
84                 return EAGAIN;\r
85 \r
86         xbt_dynar_foreach(units->items, i, unit)\r
87         {\r
88                 if(unit->thread)\r
89                         xbt_os_thread_join(unit->thread, NULL);\r
90         }\r
91 \r
92         return 0;\r
93 }\r
94 \r
95 int\r
96 units_interrupt_all(units_t units)\r
97 {\r
98         unit_t unit;\r
99         unsigned int i;\r
100         \r
101         if(!units)\r
102                 return EINVAL;\r
103 \r
104         if(!xbt_dynar_length(units->items))\r
105                 return EAGAIN;\r
106 \r
107         xbt_dynar_foreach(units->items, i, unit)\r
108         {\r
109                 if(!(unit->successeded) && !(unit->interrupted))\r
110                         unit_interrupt(unit);\r
111                 else\r
112                 {\r
113                         if(!unit->released && unit->sem)\r
114                         {\r
115                                 unit->released = 1;\r
116                                 xbt_os_sem_release(unit->sem);\r
117                         }\r
118                 }\r
119                         \r
120         }\r
121         \r
122         return 0;\r
123 }\r
124 \r
125 int\r
126 units_summuarize(units_t units)\r
127 {\r
128         unit_t unit;\r
129         unsigned int i;\r
130 \r
131         if(!units)\r
132                 return EINVAL;\r
133 \r
134         if(!xbt_dynar_length(units->items))\r
135                 return EAGAIN;\r
136 \r
137         xbt_dynar_foreach(units->items, i, unit)\r
138         {\r
139                 unit_summuarize(unit);\r
140         }\r
141         \r
142         return 0;\r
143         \r
144 }\r
145 \r
146 int\r
147 units_reset_all(units_t units)\r
148 {\r
149         unit_t unit;\r
150         unsigned int i;\r
151         \r
152         if(!units)\r
153                 return EINVAL;\r
154         \r
155         if(!xbt_dynar_length(units->items))\r
156                 return EAGAIN;\r
157 \r
158         xbt_dynar_foreach(units->items, i, unit)\r
159         {\r
160                 unit_reset(unit);\r
161         }\r
162         return 0;\r
163 }\r
164 \r
165 int\r
166 units_free(void** unitsptr)\r
167 {\r
168         if(!(*unitsptr))\r
169                 return EINVAL;\r
170         \r
171         if((*((units_t*)unitsptr))->items)\r
172                 xbt_dynar_free(&((*((units_t*)unitsptr))->items));\r
173                 \r
174         free(*unitsptr);\r
175         *unitsptr = NULL;\r
176         \r
177         return 0;\r
178 }\r
179 \r