]> git.ipfire.org Git - thirdparty/systemd.git/blob - job.c
first try at implementing job creation
[thirdparty/systemd.git] / job.c
1 /*-*- Mode: C; c-basic-offset: 8 -*-*/
2
3 #include <assert.h>
4
5 #include "macro.h"
6 #include "job.h"
7
8 Job* job_new(Manager *m, JobType type, Name *name) {
9 Job *j;
10
11 assert(m);
12 assert(type < _JOB_TYPE_MAX);
13 assert(name);
14
15 if (!(j = new0(Job, 1)))
16 return NULL;
17
18 j->manager = m;
19 j->id = m->current_job_id++;
20 j->type = type;
21 j->name = name;
22
23 /* We don't link it here, that's what job_link() is for */
24
25 return j;
26 }
27
28 void job_free(Job *j) {
29 assert(j);
30
31 /* Detach from next 'bigger' objects */
32
33 if (j->linked) {
34 if (j->name->meta.job == j)
35 j->name->meta.job = NULL;
36
37 hashmap_remove(j->manager->jobs, UINT32_TO_PTR(j->id));
38 }
39
40 hashmap_remove(j->manager->jobs_to_add, j->name);
41 set_remove(j->manager->jobs_to_remove, j);
42
43 /* Free data and next 'smaller' objects */
44 free(j);
45 }
46
47 void job_dump(Job *j, FILE*f) {
48
49 static const char* const job_type_table[_JOB_TYPE_MAX] = {
50 [JOB_START] = "start",
51 [JOB_STOP] = "stop",
52 [JOB_VERIFY_STARTED] = "verify-started",
53 [JOB_RELOAD] = "reload",
54 [JOB_RESTART] = "restart",
55 [JOB_TRY_RESTART] = "try-restart",
56 [JOB_RESTART_FINISH] = "restart-finish"
57 };
58
59 static const char* const job_state_table[_JOB_STATE_MAX] = {
60 [JOB_WAITING] = "waiting",
61 [JOB_RUNNING] = "running",
62 [JOB_DONE] = "done"
63 };
64
65 assert(j);
66 assert(f);
67
68 fprintf(f, "Job %u (%s) → %s in state %s\n",
69 j->id,
70 name_id(j->name),
71 job_type_table[j->type],
72 job_state_table[j->state]);
73 }