diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-07-01 00:03:57 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-07-01 00:18:00 +0200 |
commit | 6c12b52e19640747e96f89d85422941a23dc6b29 (patch) | |
tree | 735f7aa8c36d8e30827f36e3891032a92cab6f2d /src/shared | |
parent | a00963a2e4e98c0e4ef477b63b70c5e71d65fdc1 (diff) |
core: add new "scope" unit type for making a unit of pre-existing processes
"Scope" units are very much like service units, however with the
difference that they are created from pre-existing processes, rather
than processes that systemd itself forks off. This means they are
generated programmatically via the bus API as transient units rather
than from static configuration read from disk. Also, they do not provide
execution-time parameters, as at the time systemd adds the processes to
the scope unit they already exist and the parameters cannot be applied
anymore.
The primary benefit of this new unit type is to create arbitrary cgroups
for worker-processes forked off an existing service.
This commit also adds a a new mode to "systemd-run" to run the specified
processes in a scope rather then a transient service.
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/cgroup-util.c | 17 | ||||
-rw-r--r-- | src/shared/cgroup-util.h | 1 | ||||
-rw-r--r-- | src/shared/unit-name.c | 3 | ||||
-rw-r--r-- | src/shared/unit-name.h | 1 |
4 files changed, 21 insertions, 1 deletions
diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c index 5816b7d4d6..0e5da23ecd 100644 --- a/src/shared/cgroup-util.c +++ b/src/shared/cgroup-util.c @@ -1679,6 +1679,23 @@ int cg_attach_with_mask(CGroupControllerMask mask, const char *path, pid_t pid) return r; } +int cg_attach_many_with_mask(CGroupControllerMask mask, const char *path, Set* pids) { + Iterator i; + void *pidp; + int r = 0; + + SET_FOREACH(pidp, pids, i) { + pid_t pid = PTR_TO_LONG(pidp); + int k; + + k = cg_attach_with_mask(mask, path, pid); + if (k < 0) + r = k; + } + + return r; +} + int cg_migrate_with_mask(CGroupControllerMask mask, const char *from, const char *to) { CGroupControllerMask bit = 1; const char *n; diff --git a/src/shared/cgroup-util.h b/src/shared/cgroup-util.h index 9883d941c2..c781aabb22 100644 --- a/src/shared/cgroup-util.h +++ b/src/shared/cgroup-util.h @@ -127,6 +127,7 @@ int cg_slice_to_path(const char *unit, char **ret); int cg_create_with_mask(CGroupControllerMask mask, const char *path); int cg_attach_with_mask(CGroupControllerMask mask, const char *path, pid_t pid); +int cg_attach_many_with_mask(CGroupControllerMask mask, const char *path, Set* pids); int cg_migrate_with_mask(CGroupControllerMask mask, const char *from, const char *to); int cg_trim_with_mask(CGroupControllerMask mask, const char *path, bool delete_root); diff --git a/src/shared/unit-name.c b/src/shared/unit-name.c index bf1ab794a8..f2c30a6e4f 100644 --- a/src/shared/unit-name.c +++ b/src/shared/unit-name.c @@ -44,7 +44,8 @@ static const char* const unit_type_table[_UNIT_TYPE_MAX] = { [UNIT_TIMER] = "timer", [UNIT_SWAP] = "swap", [UNIT_PATH] = "path", - [UNIT_SLICE] = "slice" + [UNIT_SLICE] = "slice", + [UNIT_SCOPE] = "scope" }; DEFINE_STRING_TABLE_LOOKUP(unit_type, UnitType); diff --git a/src/shared/unit-name.h b/src/shared/unit-name.h index 922d75232d..88f2b83443 100644 --- a/src/shared/unit-name.h +++ b/src/shared/unit-name.h @@ -42,6 +42,7 @@ enum UnitType { UNIT_SWAP, UNIT_PATH, UNIT_SLICE, + UNIT_SCOPE, _UNIT_TYPE_MAX, _UNIT_TYPE_INVALID = -1 }; |