@@ -92,6 +92,8 @@ pub fn isSupported(op_types: []const Operation) bool {
92
92
.poll , .child_exit = > .POLL_ADD , // 5.1 (child_exit uses waitid if available 6.5)
93
93
.read_tty , .read , .wait_event_source = > .READ , // 5.6
94
94
.write , .notify_event_source = > .WRITE , // 5.6
95
+ .readv = > .READV , // 5.6
96
+ .writev = > .WRITEV , // 5.6
95
97
.accept = > .ACCEPT , // 5.5
96
98
.connect = > .CONNECT , // 5.5
97
99
.recv = > .RECV , // 5.6
@@ -224,14 +226,14 @@ pub fn complete(self: *@This(), mode: aio.CompletionMode, handler: anytype) aio.
224
226
op .out_socket = self .ops .getOne (.out_result , id ).cast (* std .posix .socket_t );
225
227
break :blk uring_handle_completion (tag , op , undefined , cqe );
226
228
},
227
- inline .read , .read_tty , .recv , .recv_msg = > | tag | blk : {
229
+ inline .read , .readv , . read_tty , .recv , .recv_msg = > | tag | blk : {
228
230
var op : Operation .map .getAssertContains (tag ) = undefined ;
229
231
op .out_id = self .ops .getOne (.out_id , id );
230
232
op .out_error = @ptrCast (self .ops .getOne (.out_error , id ));
231
233
op .out_read = self .ops .getOne (.out_result , id ).cast (* usize );
232
234
break :blk uring_handle_completion (tag , op , undefined , cqe );
233
235
},
234
- inline .write , .send , .send_msg , .splice = > | tag | blk : {
236
+ inline .write , .writev , . send , .send_msg , .splice = > | tag | blk : {
235
237
var op : Operation .map .getAssertContains (tag ) = undefined ;
236
238
op .out_id = self .ops .getOne (.out_id , id );
237
239
op .out_error = @ptrCast (self .ops .getOne (.out_error , id ));
@@ -453,6 +455,13 @@ fn uring_queue(io: *std.os.linux.IoUring, comptime op_type: Operation, op: Opera
453
455
.read_tty = > try io .read (user_data , op .tty .handle , .{ .buffer = op .buffer }, 0 ),
454
456
.read = > try io .read (user_data , op .file .handle , .{ .buffer = op .buffer }, op .offset ),
455
457
.write = > try io .write (user_data , op .file .handle , op .buffer , op .offset ),
458
+ .readv = > blk : {
459
+ const sqe = try io .get_sqe ();
460
+ sqe .prep_readv (op .file .handle , op .iov , op .offset );
461
+ sqe .user_data = user_data ;
462
+ break :blk sqe ;
463
+ },
464
+ .writev = > try io .writev (user_data , op .file .handle , op .iov , op .offset ),
456
465
.accept = > try io .accept (user_data , op .socket , op .out_addr , op .inout_addrlen , 0 ),
457
466
.connect = > try io .connect (user_data , op .socket , op .addr , op .addrlen ),
458
467
.bind = > blk : {
@@ -596,7 +605,7 @@ fn uring_handle_completion(comptime op_type: Operation, op: Operation.map.getAss
596
605
.CANCELED = > error .Canceled ,
597
606
else = > std .posix .unexpectedErrno (err ),
598
607
},
599
- .read_tty , .read = > switch (err ) {
608
+ .read_tty , .read , .readv = > switch (err ) {
600
609
.SUCCESS , .INTR , .INVAL , .FAULT , .AGAIN , .ISDIR = > unreachable ,
601
610
.CANCELED = > error .Canceled ,
602
611
.BADF = > error .NotOpenForReading ,
@@ -611,7 +620,7 @@ fn uring_handle_completion(comptime op_type: Operation, op: Operation.map.getAss
611
620
.OPNOTSUPP = > error .OperationNotSupported ,
612
621
else = > std .posix .unexpectedErrno (err ),
613
622
},
614
- .write = > switch (err ) {
623
+ .write , .writev = > switch (err ) {
615
624
.SUCCESS , .INTR , .INVAL , .FAULT , .AGAIN , .DESTADDRREQ = > unreachable ,
616
625
.CANCELED = > error .Canceled ,
617
626
.DQUOT = > error .DiskQuota ,
@@ -977,8 +986,8 @@ fn uring_handle_completion(comptime op_type: Operation, op: Operation.map.getAss
977
986
.poll = > {},
978
987
.accept = > op .out_socket .* = cqe .res ,
979
988
.connect , .bind , .listen = > {},
980
- .read_tty , .read , .recv , .recv_msg = > op .out_read .* = @intCast (cqe .res ),
981
- .write , .send , .send_msg , .splice = > if (op .out_written ) | w | {
989
+ .read_tty , .read , .readv , . recv , .recv_msg = > op .out_read .* = @intCast (cqe .res ),
990
+ .write , .writev , . send , .send_msg , .splice = > if (op .out_written ) | w | {
982
991
w .* = @intCast (cqe .res );
983
992
},
984
993
.shutdown = > {},
0 commit comments