1const builtin = @import("builtin");
2
3const std = @import("std");
4
5const symbol = @import("../../c.zig").symbol;
6const errno = @import("../../c.zig").errno;
7
8comptime {
9 if (builtin.target.isMuslLibC()) {
10 symbol(&madviseLinux, "madvise");
11 symbol(&madviseLinux, "__madvise");
12
13 symbol(&mincoreLinux, "mincore");
14
15 symbol(&mlockLinux, "mlock");
16 symbol(&mlockallLinux, "mlockall");
17
18 symbol(&mprotectLinux, "mprotect");
19 symbol(&mprotectLinux, "__mprotect");
20
21 symbol(&munlockLinux, "munlock");
22 symbol(&munlockallLinux, "munlockall");
23
24 symbol(&posix_madviseLinux, "posix_madvise");
25 }
26}
27
28fn madviseLinux(addr: *anyopaque, len: usize, advice: c_int) callconv(.c) c_int {
29 return errno(std.os.linux.madvise(@ptrCast(addr), len, @bitCast(advice)));
30}
31
32fn mincoreLinux(addr: *anyopaque, len: usize, vec: [*]u8) callconv(.c) c_int {
33 return errno(std.os.linux.mincore(@ptrCast(addr), len, vec));
34}
35
36fn mlockLinux(addr: *const anyopaque, len: usize) callconv(.c) c_int {
37 return errno(std.os.linux.mlock(@ptrCast(addr), len));
38}
39
40fn mlockallLinux(flags: c_int) callconv(.c) c_int {
41 return errno(std.os.linux.mlockall(@bitCast(flags)));
42}
43
44fn mprotectLinux(addr: *anyopaque, len: usize, prot: c_int) callconv(.c) c_int {
45 const page_size = std.heap.pageSize();
46 const start = std.mem.alignBackward(usize, @intFromPtr(addr), page_size);
47 const aligned_len = std.mem.alignForward(usize, len, page_size);
48 return errno(std.os.linux.mprotect(@ptrFromInt(start), aligned_len, @bitCast(prot)));
49}
50
51fn munlockLinux(addr: *const anyopaque, len: usize) callconv(.c) c_int {
52 return errno(std.os.linux.munlock(@ptrCast(addr), len));
53}
54
55fn munlockallLinux() callconv(.c) c_int {
56 return errno(std.os.linux.munlockall());
57}
58
59fn posix_madviseLinux(addr: *anyopaque, len: usize, advice: c_int) callconv(.c) c_int {
60 if (advice == std.os.linux.MADV.DONTNEED) return 0;
61 return @intCast(-@as(isize, @bitCast(std.os.linux.madvise(@ptrCast(addr), len, @bitCast(advice)))));
62}