Permalink
Browse files

Add rlimit value mapping from atom to integer

  • Loading branch information...
1 parent f60c211 commit d2c117e0f5d367ecc29541289ea2733643b3c40f @msantos committed Jun 30, 2012
Showing with 94 additions and 5 deletions.
  1. +29 −3 README.md
  2. +1 −1 c_src/perc.c
  3. +6 −1 src/perc.erl
  4. +58 −0 src/perc_rlimit.erl
View
@@ -22,6 +22,25 @@ perc is an Erlang interface for controlling Unix processes.
Types Pid = integer()
Resource = integer()
+ | rlimit_cpu
+ | rlimit_fsize
+ | rlimit_data
+ | rlimit_stack
+ | rlimit_core
+ | rlimit_rss
+ | rlimit_nproc
+ | rlimit_nofile
+ | rlimit_ofile
+ | rlimit_memlock
+ | rlimit_as
+ | rlimit_locks
+ | rlimit_sigpending
+ | rlimit_msgqueue
+ | rlimit_nice
+ | rlimit_rtprio
+ | rlimit_rttime
+ | rlimit_nlimits
+ | rlim_infinity
NewLimit = NewLimit1 = <<>> | binary()
OldLimit = OldLimit1 = <<>> | binary()
Error = unsupported | posix()
@@ -33,9 +52,10 @@ perc is an Erlang interface for controlling Unix processes.
empty binary for NewLimit or OldLimit indicates the caller is
not interested in these values.
- The binary size of NewLimit/OldLimit must otherwise match the
- size of a struct rlimit for the platform. struct rlimit is
- usually composed of two 8 byte values in native format.
+ The binary size of NewLimit/OldLimit must otherwise match the size
+ of a struct rlimit for the platform. struct rlimit is usually
+ composed of two 8 byte values in native format. To retrieve the
+ current settings, pass in a zero'ed 16 byte value.
## EXAMPLES
@@ -58,6 +78,10 @@ perc is an Erlang interface for controlling Unix processes.
### prlimit(2)
+ % Get the current value for rlimit_cpu
+ 1> perc:prlimit(0, rlimit_cpu, <<>>, <<0:128>>).
+ {ok,<<>>,<<"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ">>}
+
% Set RLIMIT_NOFILE (7) on the Erlang VM. Sets the current and max file descriptors
% to 8.
1> perc:prlimit(0, 7, <<8:8/native-unsigned-integer-unit:8, 8:8/native-unsigned-integer-unit:8>>, <<>>).
@@ -74,6 +98,8 @@ perc is an Erlang interface for controlling Unix processes.
* process lookup
+* atom rlimit\_\* constants only supported for 64-bit values
+
* Linux: add support for prctl(2)
* add support for getrlimit(2)/setrlimit(2)
View
@@ -138,7 +138,7 @@ nif_prlimit(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
static ErlNifFunc nif_funcs[] = {
{"kill", 2, nif_kill},
- {"prlimit", 4, nif_prlimit}
+ {"prlimit_nif", 4, nif_prlimit}
};
ERL_NIF_INIT(perc, nif_funcs, load, reload, upgrade, unload)
View
@@ -46,7 +46,12 @@ on_load() ->
kill(_,_) ->
erlang:error(not_implemented).
-prlimit(_,_,_,_) ->
+prlimit(Pid, Resource, New, Old) when is_atom(Resource) ->
+ prlimit(Pid, perc_rlimit:define(Resource), New, Old);
+prlimit(Pid, Resource, New, Old) ->
+ prlimit_nif(Pid, Resource, New, Old).
+
+prlimit_nif(_,_,_,_) ->
erlang:error(not_implemented).
progname() ->
View
@@ -0,0 +1,58 @@
+%% Copyright (c) 2012, Michael Santos <michael.santos@gmail.com>
+%% All rights reserved.
+%%
+%% Redistribution and use in source and binary forms, with or without
+%% modification, are permitted provided that the following conditions
+%% are met:
+%%
+%% Redistributions of source code must retain the above copyright
+%% notice, this list of conditions and the following disclaimer.
+%%
+%% Redistributions in binary form must reproduce the above copyright
+%% notice, this list of conditions and the following disclaimer in the
+%% documentation and/or other materials provided with the distribution.
+%%
+%% Neither the name of the author nor the names of its contributors
+%% may be used to endorse or promote products derived from this software
+%% without specific prior written permission.
+%%
+%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+%% "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+%% LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+%% FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+%% COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+%% INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+%% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+%% LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+%% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+%% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+%% ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+%% POSSIBILITY OF SUCH DAMAGE.
+-module(perc_rlimit).
+
+-export([
+ define/1
+ ]).
+
+
+% XXX 64 bit values only supported
+define(rlimit_cpu) -> 0;
+define(rlimit_fsize) -> 1;
+define(rlimit_data) -> 2;
+define(rlimit_stack) -> 3;
+define(rlimit_core) -> 4;
+define(rlimit_rss) -> 5;
+define(rlimit_nproc) -> 6;
+define(rlimit_nofile) -> 7;
+define(rlimit_ofile) -> define(rlimit_nofile);
+define(rlimit_memlock) -> 8;
+define(rlimit_as) -> 9;
+define(rlimit_locks) -> 10;
+define(rlimit_sigpending) -> 11;
+define(rlimit_msgqueue) -> 12;
+define(rlimit_nice) -> 13;
+define(rlimit_rtprio) -> 14;
+define(rlimit_rttime) -> 15;
+define(rlimit_nlimits) -> 16;
+define(rlim_infinity) -> 16#ffffffffffffffff;
+define(rlim64_infinity) -> define(rlim_infinity).

0 comments on commit d2c117e

Please sign in to comment.