Commit ca012e5b69

Jan Hendrik Farr <kernel@jfarr.cc>
2024-06-16 03:29:34
std.posix: read on timerfd can return error.Canceled
1 parent 6976a5d
Changed files (4)
lib
src
lib/compiler/fmt.zig
@@ -185,6 +185,7 @@ const FmtError = error{
     BrokenPipe,
     Unexpected,
     WouldBlock,
+    Canceled,
     FileClosed,
     DestinationAddressRequired,
     DiskQuota,
lib/std/zig/system.zig
@@ -1141,6 +1141,7 @@ fn preadAtLeast(file: fs.File, buf: []u8, offset: u64, min_read_len: usize) !usi
         const len = file.pread(buf[i..], offset + i) catch |err| switch (err) {
             error.OperationAborted => unreachable, // Windows-only
             error.WouldBlock => unreachable, // Did not request blocking mode
+            error.Canceled => unreachable, // timerfd is unseekable
             error.NotOpenForReading => unreachable,
             error.SystemResources => return error.SystemResources,
             error.IsDir => return error.UnableToReadElfFile,
lib/std/posix.zig
@@ -791,6 +791,10 @@ pub const ReadError = error{
     /// and reading from the file descriptor would block.
     WouldBlock,
 
+    /// reading a timerfd with CANCEL_ON_SET will lead to this error
+    /// when the clock goes through a discontinuous change
+    Canceled,
+
     /// In WASI, this error occurs when the file descriptor does
     /// not hold the required rights to read from it.
     AccessDenied,
@@ -851,6 +855,7 @@ pub fn read(fd: fd_t, buf: []u8) ReadError!usize {
             .INVAL => unreachable,
             .FAULT => unreachable,
             .AGAIN => return error.WouldBlock,
+            .CANCELED => return error.Canceled,
             .BADF => return error.NotOpenForReading, // Can be a race condition.
             .IO => return error.InputOutput,
             .ISDIR => return error.IsDir,
src/link.zig
@@ -350,6 +350,7 @@ pub const File = struct {
         SocketNotConnected,
         NotOpenForReading,
         WouldBlock,
+        Canceled,
         AccessDenied,
         Unexpected,
         DiskQuota,