| ... | @@ -415,10 +415,10 @@ pub const IO_Uring = struct { | ... | @@ -415,10 +415,10 @@ pub const IO_Uring = struct { |
| 415 | | 415 | |
| 416 | /// Queues (but does not submit) an SQE to perform a `splice(2)` | 416 | /// Queues (but does not submit) an SQE to perform a `splice(2)` |
| 417 | /// Either `fd_in` or `fd_out` must be a pipe. | 417 | /// Either `fd_in` or `fd_out` must be a pipe. |
| 418 | /// If `fd_in` refers to a pipe, `off_in` is ignored and must be set to -1. | 418 | /// If `fd_in` refers to a pipe, `off_in` is ignored and must be set to std.math.maxInt(u64). |
| 419 | /// If `fd_in` does not refer to a pipe and `off_in` is -1, then `len` are read | 419 | /// If `fd_in` does not refer to a pipe and `off_in` is maxInt(u64), then `len` are read |
| 420 | /// from `fd_in` starting from the file offset, which is incremented by the number of bytes read. | 420 | /// from `fd_in` starting from the file offset, which is incremented by the number of bytes read. |
| 421 | /// If `fd_in` does not refer to a pipe and `off_in` is not -1, then the starting offset of `fd_in` will be `off_in`. | 421 | /// If `fd_in` does not refer to a pipe and `off_in` is not maxInt(u64), then the starting offset of `fd_in` will be `off_in`. |
| 422 | /// This splice operation can be used to implement sendfile by splicing to an intermediate pipe first, | 422 | /// This splice operation can be used to implement sendfile by splicing to an intermediate pipe first, |
| 423 | /// then splice to the final destination. In fact, the implementation of sendfile in kernel uses splice internally. | 423 | /// then splice to the final destination. In fact, the implementation of sendfile in kernel uses splice internally. |
| 424 | /// | 424 | /// |
| ... | @@ -427,7 +427,7 @@ pub const IO_Uring = struct { | ... | @@ -427,7 +427,7 @@ pub const IO_Uring = struct { |
| 427 | /// See https://github.com/axboe/liburing/issues/291 | 427 | /// See https://github.com/axboe/liburing/issues/291 |
| 428 | /// | 428 | /// |
| 429 | /// Returns a pointer to the SQE so that you can further modify the SQE for advanced use cases. | 429 | /// Returns a pointer to the SQE so that you can further modify the SQE for advanced use cases. |
| 430 | pub fn splice(self: *IO_Uring, user_data: u64, fd_in: os.fd_t, off_in: i64, fd_out: os.fd_t, off_out: i64, len: usize) !*linux.io_uring_sqe { | 430 | pub fn splice(self: *IO_Uring, user_data: u64, fd_in: os.fd_t, off_in: u64, fd_out: os.fd_t, off_out: u64, len: usize) !*linux.io_uring_sqe { |
| 431 | const sqe = try self.get_sqe(); | 431 | const sqe = try self.get_sqe(); |
| 432 | io_uring_prep_splice(sqe, fd_in, off_in, fd_out, off_out, len); | 432 | io_uring_prep_splice(sqe, fd_in, off_in, fd_out, off_out, len); |
| 433 | sqe.user_data = user_data; | 433 | sqe.user_data = user_data; |
| ... | @@ -1268,9 +1268,9 @@ pub fn io_uring_prep_write(sqe: *linux.io_uring_sqe, fd: os.fd_t, buffer: []cons | ... | @@ -1268,9 +1268,9 @@ pub fn io_uring_prep_write(sqe: *linux.io_uring_sqe, fd: os.fd_t, buffer: []cons |
| 1268 | io_uring_prep_rw(.WRITE, sqe, fd, @intFromPtr(buffer.ptr), buffer.len, offset); | 1268 | io_uring_prep_rw(.WRITE, sqe, fd, @intFromPtr(buffer.ptr), buffer.len, offset); |
| 1269 | } | 1269 | } |
| 1270 | | 1270 | |
| 1271 | pub fn io_uring_prep_splice(sqe: *linux.io_uring_sqe, fd_in: os.fd_t, off_in: i64, fd_out: os.fd_t, off_out: i64, len: usize) void { | 1271 | pub fn io_uring_prep_splice(sqe: *linux.io_uring_sqe, fd_in: os.fd_t, off_in: u64, fd_out: os.fd_t, off_out: u64, len: usize) void { |
| 1272 | io_uring_prep_rw(.SPLICE, sqe, fd_out, undefined, len, @bitCast(off_out)); | 1272 | io_uring_prep_rw(.SPLICE, sqe, fd_out, undefined, len, off_out); |
| 1273 | sqe.addr = @bitCast(off_in); | 1273 | sqe.addr = off_in; |
| 1274 | sqe.splice_fd_in = fd_in; | 1274 | sqe.splice_fd_in = fd_in; |
| 1275 | } | 1275 | } |
| 1276 | | 1276 | |
| ... | @@ -1888,17 +1888,17 @@ test "splice/read" { | ... | @@ -1888,17 +1888,17 @@ test "splice/read" { |
| 1888 | _ = try file_src.write(&buffer_write); | 1888 | _ = try file_src.write(&buffer_write); |
| 1889 | | 1889 | |
| 1890 | var fds = try os.pipe(); | 1890 | var fds = try os.pipe(); |
| 1891 | const pipe_offset: i64 = -1; | 1891 | const pipe_offset: u64 = std.math.maxInt(u64); |
| 1892 | | 1892 | |
| 1893 | const sqe_splice_to_pipe = try ring.splice(0x11111111, fd_src, 0, fds[1], pipe_offset, buffer_write.len); | 1893 | const sqe_splice_to_pipe = try ring.splice(0x11111111, fd_src, 0, fds[1], pipe_offset, buffer_write.len); |
| 1894 | try testing.expectEqual(linux.IORING_OP.SPLICE, sqe_splice_to_pipe.opcode); | 1894 | try testing.expectEqual(linux.IORING_OP.SPLICE, sqe_splice_to_pipe.opcode); |
| 1895 | try testing.expectEqual(@as(u64, 0), sqe_splice_to_pipe.addr); | 1895 | try testing.expectEqual(@as(u64, 0), sqe_splice_to_pipe.addr); |
| 1896 | try testing.expectEqual(@as(u64, @bitCast((pipe_offset))), sqe_splice_to_pipe.off); | 1896 | try testing.expectEqual(pipe_offset, sqe_splice_to_pipe.off); |
| 1897 | sqe_splice_to_pipe.flags |= linux.IOSQE_IO_LINK; | 1897 | sqe_splice_to_pipe.flags |= linux.IOSQE_IO_LINK; |
| 1898 | | 1898 | |
| 1899 | const sqe_splice_from_pipe = try ring.splice(0x22222222, fds[0], pipe_offset, fd_dst, 10, buffer_write.len); | 1899 | const sqe_splice_from_pipe = try ring.splice(0x22222222, fds[0], pipe_offset, fd_dst, 10, buffer_write.len); |
| 1900 | try testing.expectEqual(linux.IORING_OP.SPLICE, sqe_splice_from_pipe.opcode); | 1900 | try testing.expectEqual(linux.IORING_OP.SPLICE, sqe_splice_from_pipe.opcode); |
| 1901 | try testing.expectEqual(@as(u64, @bitCast(pipe_offset)), sqe_splice_from_pipe.addr); | 1901 | try testing.expectEqual(pipe_offset, sqe_splice_from_pipe.addr); |
| 1902 | try testing.expectEqual(@as(u64, 10), sqe_splice_from_pipe.off); | 1902 | try testing.expectEqual(@as(u64, 10), sqe_splice_from_pipe.off); |
| 1903 | sqe_splice_from_pipe.flags |= linux.IOSQE_IO_LINK; | 1903 | sqe_splice_from_pipe.flags |= linux.IOSQE_IO_LINK; |
| 1904 | | 1904 | |