diff --git a/examples/nsex.erl b/examples/nsex.erl index 7f5c307..a50f119 100644 --- a/examples/nsex.erl +++ b/examples/nsex.erl @@ -23,14 +23,14 @@ start() -> {ok, Drv} = alcove_drv:start([{exec, "sudo"}]), case alcove_cgroup:supported(Drv) of true -> - ok = alcove_cgroup:create(Drv, [], <<"alcove">>), - {ok,1} = alcove_cgroup:set(Drv, [], <<"cpuset">>, <<"alcove">>, + [ok] = alcove_cgroup:create(Drv, [], [<<"alcove">>]), + {ok,1} = alcove_cgroup:set(Drv, [], <<"cpuset">>, [<<"alcove">>], <<"cpuset.cpus">>, <<"0">>), - {ok,1} = alcove_cgroup:set(Drv, [], <<"cpuset">>, <<"alcove">>, + {ok,1} = alcove_cgroup:set(Drv, [], <<"cpuset">>, [<<"alcove">>], <<"cpuset.mems">>, <<"0">>), - alcove_cgroup:set(Drv, [], <<"memory">>, <<"alcove">>, + alcove_cgroup:set(Drv, [], <<"memory">>, [<<"alcove">>], <<"memory.memsw.limit_in_bytes">>, <<"16m">>), - {ok,3} = alcove_cgroup:set(Drv, [], <<"memory">>, <<"alcove">>, + {ok,3} = alcove_cgroup:set(Drv, [], <<"memory">>, [<<"alcove">>], <<"memory.limit_in_bytes">>, <<"16m">>), Drv; false -> @@ -66,7 +66,7 @@ argv([Arg0, Args]) -> {Path, Progname, Args}. setlimits(Drv, Child) -> - {ok,_} = alcove_cgroup:set(Drv, [], <<>>, <<"alcove">>, + {ok,_} = alcove_cgroup:set(Drv, [], <<>>, [<<"alcove">>], <<"tasks">>, integer_to_list(Child)). chroot(Drv, Child, Path) -> diff --git a/examples/tcplxc.erl b/examples/tcplxc.erl index 5d94763..1c8de4b 100644 --- a/examples/tcplxc.erl +++ b/examples/tcplxc.erl @@ -108,7 +108,7 @@ clone(Drv, _Options) -> clone_init(Drv, Child, _Options) -> case alcove_cgroup:supported(Drv) of true -> - {ok,_} = alcove_cgroup:set(Drv, [], <<>>, <<"alcove">>, + {ok,_} = alcove_cgroup:set(Drv, [], <<>>, [<<"alcove">>], <<"tasks">>, integer_to_list(Child)); false -> ok @@ -271,14 +271,14 @@ chroot_init() -> cgroup_init(Drv) -> case alcove_cgroup:supported(Drv) of true -> - ok = alcove_cgroup:create(Drv, [], <<"alcove">>), - alcove_cgroup:set(Drv, [], <<"cpuset">>, <<"alcove">>, + [ok] = alcove_cgroup:create(Drv, [], [<<"alcove">>]), + alcove_cgroup:set(Drv, [], <<"cpuset">>, [<<"alcove">>], <<"cpuset.cpus">>, <<"0">>), - alcove_cgroup:set(Drv, [], <<"cpuset">>, <<"alcove">>, + alcove_cgroup:set(Drv, [], <<"cpuset">>, [<<"alcove">>], <<"cpuset.mems">>, <<"0">>), - alcove_cgroup:set(Drv, [], <<"memory">>, <<"alcove">>, + alcove_cgroup:set(Drv, [], <<"memory">>, [<<"alcove">>], <<"memory.memsw.limit_in_bytes">>, <<"16m">>), - alcove_cgroup:set(Drv, [], <<"memory">>, <<"alcove">>, + alcove_cgroup:set(Drv, [], <<"memory">>, [<<"alcove">>], <<"memory.limit_in_bytes">>, <<"16m">>); false -> ok diff --git a/src/alcove_cgroup.erl b/src/alcove_cgroup.erl index 85a825c..4b0c98d 100644 --- a/src/alcove_cgroup.erl +++ b/src/alcove_cgroup.erl @@ -20,6 +20,7 @@ -export([get/5, set/6]). -export([is_file/3, is_dir/3]). -export([mounts/1, mounts/2]). +-export([join/2,relpath/1,expand/1]). supported(Drv) -> supported(Drv, []). @@ -50,8 +51,11 @@ supported(Drv, Pids) -> create(Drv) -> create(Drv, []). create(Drv, Pids) -> - create(Drv, Pids, <<"alcove">>). -create(Drv, Pids, Namespace) -> + create(Drv, Pids, [<<"alcove">>]). +create(Drv, Pids, Namespaces) -> + [ create_1(Drv, Pids, Namespace) || Namespace <- expand(Namespaces) ]. + +create_1(Drv, Pids, Namespace) -> Fun = fun(Cgroup, _Acc) -> Path = join(Cgroup, Namespace), case alcove:mkdir(Drv, Pids, Path, 8#755) of @@ -60,12 +64,12 @@ create(Drv, Pids, Namespace) -> Error -> Error end end, - fold(Drv, <<>>, <<>>, Fun, []). + fold(Drv, <<>>, [], Fun, []). destroy(Drv) -> destroy(Drv, []). destroy(Drv, Pids) -> - destroy(Drv, Pids, <<"alcove">>). + destroy(Drv, Pids, [<<"alcove">>]). destroy(Drv, Pids, Namespace) -> Fun = fun(Cgroup, _Acc) -> Path = join(Cgroup, Namespace), @@ -75,18 +79,18 @@ destroy(Drv, Pids, Namespace) -> Error -> Error end end, - fold(Drv, <<>>, <<>>, Fun, []). + fold(Drv, <<>>, [], Fun, []). set(Drv, Pids, MntOpt, Namespace, Key, Value) -> Fun = fun(Cgroup, _Acc) -> - File = join(Cgroup, Key), + File = join(Cgroup, [Key]), write(Drv, Pids, File, Value) end, fold(Drv, MntOpt, Namespace, Fun, []). get(Drv, Pids, MntOpt, Namespace, Key) -> Fun = fun(Cgroup, _Acc) -> - File = join(Cgroup, Key), + File = join(Cgroup, [Key]), read(Drv, Pids, File) end, fold(Drv, MntOpt, Namespace, Fun, []). @@ -218,12 +222,13 @@ join(Cgroup, Path) -> filename:join([Cgroup|relpath(Path)]). relpath(Path) -> - case filename:split(Path) of - [Root|Rest] when Root =:= "/"; Root =:= <<"/">> -> - Rest; - Rest -> - Rest - end. + lists:flatmap(fun(N) -> case filename:split(maybe_binary(N)) of + [Root|Rest] when Root =:= "/"; Root =:= <<"/">> -> + Rest; + Rest -> + Rest + end + end, Path). foreach([]) -> true; @@ -232,3 +237,11 @@ foreach([Fun|Funs]) -> true -> foreach(Funs); false -> false end. + +% [<<"a">>, <<"b">>, <<"c">>] -> +% [[<<"a">>], [<<"a">>,<<"b">>], [<<"a">>,<<"b">>,<<"c">>]] +expand(Path) -> + [ element(1, lists:split(X, Path)) || X <- lists:seq(1, length(Path)) ]. + +maybe_binary(N) when is_binary(N) -> N; +maybe_binary(N) when is_list(N) -> list_to_binary(N).