diff --git a/lib/std/os/bits/linux.zig b/lib/std/os/bits/linux.zig index 8d3d5c49a3cc..d08718f2e4db 100644 --- a/lib/std/os/bits/linux.zig +++ b/lib/std/os/bits/linux.zig @@ -2244,3 +2244,24 @@ pub const MADV_COLD = 20; pub const MADV_PAGEOUT = 21; pub const MADV_HWPOISON = 100; pub const MADV_SOFT_OFFLINE = 101; + +pub const POSIX_FADV_NORMAL = 0; +pub const POSIX_FADV_RANDOM = 1; +pub const POSIX_FADV_SEQUENTIAL = 2; +pub const POSIX_FADV_WILLNEED = 3; +pub usingnamespace switch (builtin.arch) { + .s390x => if (@typeInfo(usize).Int.bits == 64) + struct { + pub const POSIX_FADV_DONTNEED = 6; + pub const POSIX_FADV_NOREUSE = 7; + } + else + struct { + pub const POSIX_FADV_DONTNEED = 4; + pub const POSIX_FADV_NOREUSE = 5; + }, + else => struct { + pub const POSIX_FADV_DONTNEED = 4; + pub const POSIX_FADV_NOREUSE = 5; + }, +}; diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 035cdabe631d..ea82d4218e19 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -1386,6 +1386,31 @@ pub fn madvise(address: [*]u8, len: usize, advice: u32) usize { return syscall3(.madvise, @ptrToInt(address), len, advice); } +pub fn posix_fadvise(fd: fd_t, offset: off_t, len: off_t, advice: usize) usize { + if (@hasField(SYS, "fadvise64_64")) { + const offset_halves = splitValue64(@bitCast(u64, offset)); + const length_halves = splitValue64(@bitCast(u64, len)); + + return syscall6( + .fadvise64_64, + @bitCast(usize, @as(isize, fd)), + offset_halves[0], + offset_halves[1], + length_halves[0], + length_halves[1], + advice, + ); + } else { + return syscall4( + .fadvise64, + @bitCast(usize, @as(isize, fd)), + @bitCast(usize, offset), + @bitCast(usize, len), + advice, + ); + } +} + test { if (builtin.os.tag == .linux) { _ = @import("linux/test.zig"); diff --git a/lib/std/os/linux/test.zig b/lib/std/os/linux/test.zig index 039678e40579..94bbe0cbc77a 100644 --- a/lib/std/os/linux/test.zig +++ b/lib/std/os/linux/test.zig @@ -108,3 +108,22 @@ test "user and group ids" { expectEqual(linux.getauxval(elf.AT_EUID), linux.geteuid()); expectEqual(linux.getauxval(elf.AT_EGID), linux.getegid()); } + +test "posix_fadvise" { + const tmp_file_name = "temp_posix_fadvise.txt"; + var file = try fs.cwd().createFile(tmp_file_name, .{}); + defer { + file.close(); + fs.cwd().deleteFile(tmp_file_name) catch {}; + } + + const stat = try file.stat(); + + const ret = linux.posix_fadvise( + file.handle, + 0, + @bitCast(i64, stat.size), + linux.POSIX_FADV_SEQUENTIAL, + ); + expectEqual(@as(usize, 0), ret); +}