Mercurial > sci
annotate sciworkerd/sciworkerd.c @ 27:dae2de19ca5d
misc: switch to JSON everywhere
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 03 Aug 2022 15:18:09 +0200 |
parents | 34cbbd215ef7 |
children | e52c762d8ba8 |
rev | line source |
---|---|
19 | 1 #include <errno.h> |
2 #include <poll.h> | |
3 #include <signal.h> | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
4 #include <stdint.h> |
19 | 5 #include <string.h> |
6 #include <time.h> | |
7 | |
8 #include <utlist.h> | |
9 | |
10 #include "apic.h" | |
11 #include "log.h" | |
12 #include "sciworkerd.h" | |
13 #include "task.h" | |
14 #include "util.h" | |
15 | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
16 #define TAG "sciworkerd: " |
19 | 17 |
18 struct taskentry { | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
19 intmax_t job_id; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
20 char *tag; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
21 char *project_name; |
19 | 22 struct task *task; |
23 struct taskentry *next; | |
24 }; | |
25 | |
26 static struct taskentry *taskpending; | |
27 static struct taskentry *tasks; | |
28 static struct taskentry *taskfinished; | |
29 static int run = 1; | |
30 | |
31 struct sciworkerd sciworkerd = { | |
32 .fetchinterval = 300, | |
33 .maxjobs = 4, | |
34 .timeout = 600 | |
35 }; | |
36 | |
37 static inline void | |
38 taskentry_free(struct taskentry *entry) | |
39 { | |
40 if (task_status(entry->task) == TASKSTATUS_RUNNING) { | |
41 if (task_kill(entry->task) == 0) | |
42 task_wait(entry->task); | |
43 } | |
44 | |
45 task_free(entry->task); | |
46 free(entry); | |
47 } | |
48 | |
49 static void | |
50 stop(int sign) | |
51 { | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
52 log_info(TAG "exiting on signal %d", sign); |
19 | 53 run = 0; |
54 } | |
55 | |
56 static inline int | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
57 pending(intmax_t job_id) |
19 | 58 { |
59 const struct taskentry *iter; | |
60 | |
61 LL_FOREACH(taskpending, iter) | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
62 if (iter->job_id == job_id) |
19 | 63 return 1; |
64 | |
65 return 0; | |
66 } | |
67 | |
68 static inline void | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
69 queue(intmax_t id, const char *tag, const char *project_name) |
19 | 70 { |
71 struct taskentry *tk; | |
72 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
73 log_info(TAG "queued job build (%d) for tag %s", id, tag); |
19 | 74 |
75 tk = util_calloc(1, sizeof (*tk)); | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
76 tk->job_id = id; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
77 tk->tag = util_strdup(tag); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
78 tk->project_name = util_strdup(project_name); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
79 tk->task = task_new(tag); |
19 | 80 LL_APPEND(taskpending, tk); |
81 } | |
82 | |
83 static void | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
84 merge(json_t *jobs) |
19 | 85 { |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
86 json_int_t id; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
87 json_t *val; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
88 const char *tag, *project_name; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
89 size_t total = 0, i; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
90 int parse; |
19 | 91 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
92 json_array_foreach(jobs, i, val) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
93 parse = json_unpack(val, "{sI ss ss}", |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
94 "id", &id, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
95 "tag", &tag, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
96 "project_name", &project_name |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
97 ); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
98 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
99 if (parse < 0) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
100 log_warn(TAG "unable to parse job"); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
101 continue; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
102 } |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
103 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
104 if (!pending(id)) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
105 queue(id, tag, project_name); |
20 | 106 total++; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
107 } |
20 | 108 } |
19 | 109 |
20 | 110 log_info(TAG "added %zu new pending tasks", total); |
19 | 111 } |
112 | |
113 /* | |
114 * Fetch jobs periodically, depending on the user setting. | |
115 */ | |
116 static void | |
117 fetch_jobs(void) | |
118 { | |
119 static time_t startup; | |
120 time_t now; | |
20 | 121 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
122 json_t *jobs; |
19 | 123 |
124 if (difftime((now = time(NULL)), startup) >= sciworkerd.fetchinterval) { | |
125 startup = now; | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
126 log_info(TAG "fetching jobs"); |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
127 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
128 if (!(jobs = apic_job_todo(&req, sciworkerd.name))) |
19 | 129 log_warn(TAG "unable to fetch jobs: %s", req.error); |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
130 else { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
131 merge(jobs); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
132 json_decref(jobs); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
133 } |
19 | 134 } |
135 } | |
136 | |
137 static inline size_t | |
138 count(const struct taskentry *head) | |
139 { | |
140 const struct taskentry *iter; | |
141 size_t tot = 0; | |
142 | |
143 LL_FOREACH(head, iter) | |
144 tot++; | |
145 | |
146 return tot; | |
147 } | |
148 | |
149 /* | |
150 * Start a task. We fetch its script code and then create the task with that | |
151 * script. | |
152 */ | |
153 static int | |
154 start(struct taskentry *entry) | |
155 { | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
156 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
157 json_t *doc; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
158 const char *script; |
19 | 159 pid_t pid; |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
160 int ret = -1; |
19 | 161 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
162 if (!(doc = apic_project_find(&req, entry->project_name))) |
19 | 163 return log_warn(TAG "unable to fetch project, dropping task"), -1; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
164 if (json_unpack(doc, "{ss}", "script", &script) < 0) { |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
165 json_decref(doc); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
166 return log_warn(TAG "invalid project JSON object"), -1; |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
167 } |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
168 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
169 if (task_setup(entry->task, script) < 0) |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
170 log_warn(TAG "unable to setup script code: %s, dropping task", strerror(errno)); |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
171 else if ((pid = task_start(entry->task)) < 0) |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
172 log_warn(TAG "unable to spawn task process: %s", strerror(errno)); |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
173 else { |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
174 log_info(TAG "task %lld spawned", (long long int)pid); |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
175 ret = 0; |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
176 } |
19 | 177 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
178 json_decref(doc); |
19 | 179 |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
180 return ret; |
19 | 181 } |
182 | |
183 static inline void | |
184 delete(struct taskentry *entry) | |
185 { | |
186 LL_DELETE(taskpending, entry); | |
187 task_free(entry->task); | |
188 free(entry); | |
189 } | |
190 | |
191 static void | |
192 start_all(void) | |
193 { | |
194 size_t running = count(tasks); | |
195 struct taskentry *entry; | |
196 | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
197 while (running < sciworkerd.maxjobs && (entry = taskpending)) { |
19 | 198 if (start(entry) < 0) |
199 delete(entry); | |
200 else { | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
201 running++; |
19 | 202 LL_DELETE(taskpending, entry); |
203 LL_APPEND(tasks, entry); | |
204 } | |
205 } | |
206 } | |
207 | |
208 static void | |
209 process_all(void) | |
210 { | |
211 struct taskentry *iter, *next; | |
212 struct taskcode code; | |
213 struct pollfd *fds; | |
214 size_t fdsz, i = 0; | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
215 pid_t pid; |
19 | 216 int ret; |
217 | |
218 /* First, read every pipes. */ | |
219 if (!(fdsz = count(tasks))) | |
220 return; | |
221 | |
222 fds = util_calloc(fdsz, sizeof (*fds)); | |
223 | |
224 for (iter = tasks; iter; iter = iter->next) | |
225 task_prepare(iter->task, &fds[i++]); | |
226 | |
227 if (poll(fds, fdsz, 5000) < 0) | |
228 log_warn("poll: %s", strerror(errno)); | |
229 | |
230 for (iter = tasks, i = 0; i < fdsz; ++i) { | |
231 next = iter->next; | |
232 | |
233 /* | |
234 * 0: EOF [wait] | |
235 * -1: error [kill + wait] | |
236 * >0: keep going [nothing] | |
237 */ | |
238 if ((ret = task_sync(iter->task, &fds[i])) < 0) { | |
239 log_warn(TAG "pipe error: %s, killing task", strerror(errno)); | |
240 | |
241 if (task_kill(iter->task) < 0) | |
242 log_warn(TAG "task kill error: %s", strerror(errno)); | |
243 } | |
244 | |
245 /* Now wait for the task to complete. */ | |
246 if (ret <= 0) { | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
247 pid = task_pid(iter->task); |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
248 |
19 | 249 if (task_wait(iter->task) < 0) |
250 log_warn(TAG "task wait error: %s", strerror(errno)); | |
251 else { | |
252 code = task_code(iter->task); | |
253 | |
254 switch (task_status(iter->task)) { | |
255 case TASKSTATUS_EXITED: | |
256 log_info(TAG "task %lld exited with code %d", | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
257 (long long int)pid, code.exitcode); |
19 | 258 break; |
259 case TASKSTATUS_KILLED: | |
260 log_info(TAG "task %lld killed with signal %d", | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
261 (long long int)pid, code.sigcode); |
19 | 262 break; |
263 default: | |
264 break; | |
265 } | |
266 } | |
267 | |
268 /* Remove that task and push to the outgoing queue. */ | |
269 LL_DELETE(tasks, iter); | |
270 LL_APPEND(taskfinished, iter); | |
271 } | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
272 |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
273 iter = next; |
19 | 274 } |
275 | |
276 free(fds); | |
277 } | |
278 | |
279 /* | |
280 * Kill all tasks that have been running for too long. | |
281 */ | |
282 static void | |
283 ghost_all(void) | |
284 { | |
285 struct taskentry *iter, *tmp; | |
286 | |
287 LL_FOREACH_SAFE(tasks, iter, tmp) { | |
288 if (difftime(time(NULL), task_uptime(iter->task)) < sciworkerd.timeout) | |
289 continue; | |
290 | |
291 /* Do not attempt to wait if kill failed to avoid lock. */ | |
292 log_info(TAG "task timeout, killing"); | |
293 | |
294 if (task_kill(iter->task) == 0) | |
295 task_wait(iter->task); | |
296 | |
297 LL_DELETE(tasks, iter); | |
298 LL_APPEND(taskfinished, iter); | |
299 } | |
300 } | |
301 | |
302 static int | |
303 publish(struct taskentry *iter) | |
304 { | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
305 struct apic req; |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
306 json_t *obj; |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
307 int ret = 0; |
19 | 308 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
309 obj = json_pack("{sI ss ss si si}", |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
310 "job_id", iter->job_id, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
311 "worker_name", sciworkerd.name, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
312 "console", task_console(iter->task), |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
313 "exitcode", task_code(iter->task).exitcode, |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
314 "sigcode", task_code(iter->task).sigcode |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
315 ); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
316 |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
317 if (apic_jobresult_add(&req, obj) < 0) { |
19 | 318 log_warn(TAG "unable to publish task: %s", req.error); |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
319 ret = -1; |
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
320 } |
19 | 321 |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
322 json_decref(obj); |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
323 |
19 | 324 return ret; |
325 } | |
326 | |
327 static void | |
328 publish_all(void) | |
329 { | |
330 struct taskentry *iter, *tmp; | |
331 | |
332 LL_FOREACH_SAFE(taskfinished, iter, tmp) { | |
333 if (publish(iter) == 0) { | |
334 LL_DELETE(taskfinished, iter); | |
335 taskentry_free(iter); | |
336 } | |
337 } | |
338 } | |
339 | |
340 void | |
341 sciworkerd_init(void) | |
342 { | |
343 struct sigaction sa = {0}; | |
344 | |
345 log_open("sigworkerd"); | |
346 | |
27
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
347 if (strlen(sciworkerd.name) == 0) |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
348 log_die(TAG "no worker name defined"); |
dae2de19ca5d
misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents:
24
diff
changeset
|
349 |
19 | 350 sigemptyset(&sa.sa_mask); |
351 sa.sa_handler = stop; | |
352 | |
23
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
353 util_strlcpy(apiconf.baseurl, sciworkerd.url, sizeof (apiconf.baseurl)); |
2cb228f23f53
misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents:
20
diff
changeset
|
354 |
19 | 355 if (sigaction(SIGINT, &sa, NULL) < 0 || sigaction(SIGTERM, &sa, NULL) < 0) |
356 log_die(TAG "sigaction: %s", strerror(errno)); | |
357 } | |
358 | |
359 void | |
360 sciworkerd_run(void) | |
361 { | |
362 while (run) { | |
363 fetch_jobs(); | |
24
34cbbd215ef7
misc: add basic support for jobresults
David Demelier <markand@malikania.fr>
parents:
23
diff
changeset
|
364 start_all(); |
19 | 365 process_all(); |
366 ghost_all(); | |
367 publish_all(); | |
368 } | |
369 } | |
370 | |
371 void | |
372 sciworkerd_finish(void) | |
373 { | |
374 struct taskentry *iter, *tmp; | |
375 | |
376 LL_FOREACH_SAFE(taskpending, iter, tmp) | |
377 taskentry_free(iter); | |
378 LL_FOREACH_SAFE(tasks, iter, tmp) | |
379 taskentry_free(iter); | |
380 LL_FOREACH_SAFE(taskfinished, iter, tmp) | |
381 taskentry_free(iter); | |
382 } |