chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sysv: require sysinit.service from all sysv services
[elogind.git]
/
manager.c
diff --git
a/manager.c
b/manager.c
index 4f389793559e77a28d57118babe9326d0a606c07..e9bd3669041ceec88a56f43cf9a121e6541cd53b 100644
(file)
--- a/
manager.c
+++ b/
manager.c
@@
-31,6
+31,7
@@
#include <sys/reboot.h>
#include <sys/ioctl.h>
#include <linux/kd.h>
#include <sys/reboot.h>
#include <sys/ioctl.h>
#include <linux/kd.h>
+#include <libcgroup.h>
#include "manager.h"
#include "hashmap.h"
#include "manager.h"
#include "hashmap.h"
@@
-39,6
+40,8
@@
#include "log.h"
#include "util.h"
#include "ratelimit.h"
#include "log.h"
#include "util.h"
#include "ratelimit.h"
+#include "cgroup.h"
+#include "mount-setup.h"
static int manager_setup_signals(Manager *m) {
sigset_t mask;
static int manager_setup_signals(Manager *m) {
sigset_t mask;
@@
-254,11
+257,14
@@
static int manager_find_paths(Manager *m) {
return 0;
}
return 0;
}
-
Manager* manager_new(void
) {
+
int manager_new(Manager **_m
) {
Manager *m;
Manager *m;
+ int r = -ENOMEM;
+
+ assert(_m);
if (!(m = new0(Manager, 1)))
if (!(m = new0(Manager, 1)))
- return
NULL
;
+ return
-ENOMEM
;
m->signal_watch.fd = m->mount_watch.fd = m->udev_watch.fd = m->epoll_fd = -1;
m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
m->signal_watch.fd = m->mount_watch.fd = m->udev_watch.fd = m->epoll_fd = -1;
m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
@@
-275,6
+281,9
@@
Manager* manager_new(void) {
if (!(m->watch_pids = hashmap_new(trivial_hash_func, trivial_compare_func)))
goto fail;
if (!(m->watch_pids = hashmap_new(trivial_hash_func, trivial_compare_func)))
goto fail;
+ if (!(m->cgroup_bondings = hashmap_new(string_hash_func, string_compare_func)))
+ goto fail;
+
if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
goto fail;
if ((m->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)
goto fail;
@@
-287,7
+296,7
@@
Manager* manager_new(void) {
log_debug("systemd running in %s mode.", manager_running_as_to_string(m->running_as));
log_debug("systemd running in %s mode.", manager_running_as_to_string(m->running_as));
- if (
manager_find_paths(m
) < 0)
+ if (
(r = manager_find_paths(m)
) < 0)
goto fail;
if (chdir("/") < 0)
goto fail;
if (chdir("/") < 0)
@@
-296,18
+305,25
@@
Manager* manager_new(void) {
/* Become a session leader if we aren't one yet. */
setsid();
/* Become a session leader if we aren't one yet. */
setsid();
- if (manager_setup_signals(m) < 0)
+ if ((r = manager_setup_signals(m)) < 0)
+ goto fail;
+
+ if ((r = mount_setup()) < 0)
+ goto fail;
+
+ if ((r = manager_setup_cgroup(m)) < 0)
goto fail;
/* FIXME: this should be called only when the D-Bus bus daemon is running */
goto fail;
/* FIXME: this should be called only when the D-Bus bus daemon is running */
- if (
bus_init(m
) < 0)
+ if (
(r = bus_init(m)
) < 0)
goto fail;
goto fail;
- return m;
+ *_m = m;
+ return 0;
fail:
manager_free(m);
fail:
manager_free(m);
- return
NULL
;
+ return
r
;
}
void manager_free(Manager *m) {
}
void manager_free(Manager *m) {
@@
-327,6
+343,8
@@
void manager_free(Manager *m) {
if (unit_vtable[c]->shutdown)
unit_vtable[c]->shutdown(m);
if (unit_vtable[c]->shutdown)
unit_vtable[c]->shutdown(m);
+ manager_shutdown_cgroup(m);
+
bus_done(m);
hashmap_free(m->units);
bus_done(m);
hashmap_free(m->units);
@@
-342,6
+360,12
@@
void manager_free(Manager *m) {
strv_free(m->unit_path);
strv_free(m->sysvinit_path);
strv_free(m->unit_path);
strv_free(m->sysvinit_path);
+ free(m->cgroup_controller);
+ free(m->cgroup_hierarchy);
+
+ assert(hashmap_isempty(m->cgroup_bondings));
+ hashmap_free(m->cgroup_bondings);
+
free(m);
}
free(m);
}