| 1 | const builtin = @import("builtin"); |
| 2 | |
| 3 | const std = @import("std"); |
| 4 | |
| 5 | const symbol = @import("../../c.zig").symbol; |
| 6 | const errno = @import("../../c.zig").errno; |
| 7 | |
| 8 | comptime { |
| 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 | |
| 28 | fn 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 | |
| 32 | fn mincoreLinux(addr: *anyopaque, len: usize, vec: [*]u8) callconv(.c) c_int { |
| 33 | return errno(std.os.linux.mincore(@ptrCast(addr), len, vec)); |
| 34 | } |
| 35 | |
| 36 | fn mlockLinux(addr: *const anyopaque, len: usize) callconv(.c) c_int { |
| 37 | return errno(std.os.linux.mlock(@ptrCast(addr), len)); |
| 38 | } |
| 39 | |
| 40 | fn mlockallLinux(flags: c_int) callconv(.c) c_int { |
| 41 | return errno(std.os.linux.mlockall(@bitCast(flags))); |
| 42 | } |
| 43 | |
| 44 | fn 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 | |
| 51 | fn munlockLinux(addr: *const anyopaque, len: usize) callconv(.c) c_int { |
| 52 | return errno(std.os.linux.munlock(@ptrCast(addr), len)); |
| 53 | } |
| 54 | |
| 55 | fn munlockallLinux() callconv(.c) c_int { |
| 56 | return errno(std.os.linux.munlockall()); |
| 57 | } |
| 58 | |
| 59 | fn 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 | } |