chiark / gitweb /
2f7912d262439d46f4668eb9566802345ff2f485
[elogind.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 }