zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 6418284680920a19fd34ec1a10d79113a5bec75d (tree)
parent 36f1788762ef5584bd0ebf5cef85a99318230ac4
Author: xackus <14938807+xackus@users.noreply.github.com>
Date:   Sun,  1 Nov 2020 12:19:35 +0100

std: add {set,get}rlimit bits and improve test

Diffstat:
Mlib/std/os.zig | 2--
Mlib/std/os/bits/darwin.zig | 30++++++++++++++++++++++++++++++
Mlib/std/os/bits/dragonfly.zig | 33+++++++++++++++++++++++++++++++++
Mlib/std/os/bits/freebsd.zig | 36++++++++++++++++++++++++++++++++++++
Mlib/std/os/bits/netbsd.zig | 33+++++++++++++++++++++++++++++++++
Mlib/std/os/bits/openbsd.zig | 29+++++++++++++++++++++++++++++
Mlib/std/os/test.zig | 10++++++----
7 files changed, 167 insertions(+), 6 deletions(-)

diff --git a/lib/std/os.zig b/lib/std/os.zig @@ -5663,7 +5663,6 @@ pub fn prctl(option: i32, args: anytype) PrctlError!u31 { pub const GetrlimitError = UnexpectedError; pub fn getrlimit(resource: rlimit_resource) GetrlimitError!rlimit { - // TODO implement for systems other than linux and enable test var limits: rlimit = undefined; const rc = system.getrlimit(resource, &limits); switch (errno(rc)) { @@ -5677,7 +5676,6 @@ pub fn getrlimit(resource: rlimit_resource) GetrlimitError!rlimit { pub const SetrlimitError = error{PermissionDenied} || UnexpectedError; pub fn setrlimit(resource: rlimit_resource, limits: rlimit) SetrlimitError!void { - // TODO implement for systems other than linux and enable test const rc = system.setrlimit(resource, &limits); switch (errno(rc)) { 0 => return, diff --git a/lib/std/os/bits/darwin.zig b/lib/std/os/bits/darwin.zig @@ -1496,3 +1496,33 @@ pub const rusage = extern struct { nvcsw: isize, nivcsw: isize, }; + +pub const rlimit_resource = extern enum(c_int) { + CPU = 0, + FSIZE = 1, + DATA = 2, + STACK = 3, + CORE = 4, + AS = 5, + RSS = 5, + MEMLOCK = 6, + NPROC = 7, + NOFILE = 8, + + _, +}; + +pub const rlim_t = u64; + +/// No limit +pub const RLIM_INFINITY: rlim_t = (1 << 63) - 1; + +pub const RLIM_SAVED_MAX = RLIM_INFINITY; +pub const RLIM_SAVED_CUR = RLIM_INFINITY; + +pub const rlimit = extern struct { + /// Soft limit + cur: rlim_t, + /// Hard limit + max: rlim_t, +}; diff --git a/lib/std/os/bits/dragonfly.zig b/lib/std/os/bits/dragonfly.zig @@ -721,3 +721,36 @@ pub const Flock = extern struct { l_type: c_short, l_whence: c_short, }; + +pub const rlimit_resource = extern enum(c_int) { + CPU = 0, + FSIZE = 1, + DATA = 2, + STACK = 3, + CORE = 4, + RSS = 5, + MEMLOCK = 6, + NPROC = 7, + NOFILE = 8, + SBSIZE = 9, + AS = 10, + VMEM = 10, + POSIXLOCKS = 11, + + _, +}; + +pub const rlim_t = i64; + +/// No limit +pub const RLIM_INFINITY: rlim_t = (1 << 63) - 1; + +pub const RLIM_SAVED_MAX = RLIM_INFINITY; +pub const RLIM_SAVED_CUR = RLIM_INFINITY; + +pub const rlimit = extern struct { + /// Soft limit + cur: rlim_t, + /// Hard limit + max: rlim_t, +}; diff --git a/lib/std/os/bits/freebsd.zig b/lib/std/os/bits/freebsd.zig @@ -1358,3 +1358,39 @@ pub const IPPROTO_RESERVED_253 = 253; /// Reserved pub const IPPROTO_RESERVED_254 = 254; + +pub const rlimit_resource = extern enum(c_int) { + CPU = 0, + FSIZE = 1, + DATA = 2, + STACK = 3, + CORE = 4, + RSS = 5, + MEMLOCK = 6, + NPROC = 7, + NOFILE = 8, + SBSIZE = 9, + VMEM = 10, + AS = 10, + NPTS = 11, + SWAP = 12, + KQUEUES = 13, + UMTXP = 14, + + _, +}; + +pub const rlim_t = i64; + +/// No limit +pub const RLIM_INFINITY: rlim_t = (1 << 63) - 1; + +pub const RLIM_SAVED_MAX = RLIM_INFINITY; +pub const RLIM_SAVED_CUR = RLIM_INFINITY; + +pub const rlimit = extern struct { + /// Soft limit + cur: rlim_t, + /// Hard limit + max: rlim_t, +}; diff --git a/lib/std/os/bits/netbsd.zig b/lib/std/os/bits/netbsd.zig @@ -1169,3 +1169,36 @@ pub const IPPROTO_PFSYNC = 240; /// raw IP packet pub const IPPROTO_RAW = 255; + +pub const rlimit_resource = extern enum(c_int) { + CPU = 0, + FSIZE = 1, + DATA = 2, + STACK = 3, + CORE = 4, + RSS = 5, + MEMLOCK = 6, + NPROC = 7, + NOFILE = 8, + SBSIZE = 9, + AS = 10, + VMEM = 10, + NTHR = 11, + + _, +}; + +pub const rlim_t = u64; + +/// No limit +pub const RLIM_INFINITY: rlim_t = (1 << 63) - 1; + +pub const RLIM_SAVED_MAX = RLIM_INFINITY; +pub const RLIM_SAVED_CUR = RLIM_INFINITY; + +pub const rlimit = extern struct { + /// Soft limit + cur: rlim_t, + /// Hard limit + max: rlim_t, +}; diff --git a/lib/std/os/bits/openbsd.zig b/lib/std/os/bits/openbsd.zig @@ -1050,3 +1050,32 @@ pub const IPPROTO_PFSYNC = 240; /// raw IP packet pub const IPPROTO_RAW = 255; + +pub const rlimit_resource = extern enum(c_int) { + CPU, + FSIZE, + DATA, + STACK, + CORE, + RSS, + MEMLOCK, + NPROC, + NOFILE, + + _, +}; + +pub const rlim_t = u64; + +/// No limit +pub const RLIM_INFINITY: rlim_t = (1 << 63) - 1; + +pub const RLIM_SAVED_MAX = RLIM_INFINITY; +pub const RLIM_SAVED_CUR = RLIM_INFINITY; + +pub const rlimit = extern struct { + /// Soft limit + cur: rlim_t, + /// Hard limit + max: rlim_t, +}; diff --git a/lib/std/os/test.zig b/lib/std/os/test.zig @@ -593,11 +593,13 @@ test "fsync" { } test "getrlimit and setrlimit" { - // TODO enable for other systems when implemented - if (builtin.os.tag != .linux) { + if (!@hasDecl(os, "rlimit")) { return error.SkipZigTest; } - const cpuLimit = try os.getrlimit(.CPU); - try os.setrlimit(.CPU, cpuLimit); + inline for (std.meta.fields(os.rlimit_resource)) |field| { + const resource = @intToEnum(os.rlimit_resource, field.value); + const limit = try os.getrlimit(resource); + try os.setrlimit(resource, limit); + } }