fn operate(userdata: ?*anyopaque, operation: Io.Operation) Io.Cancelable!Io.Operation.Result {
const t: *Threaded = @ptrCast(@alignCast(userdata));
switch (operation) {
.file_read_streaming => |o| return .{
.file_read_streaming = fileReadStreaming(t, o.file, o.data) catch |err| switch (err) {
error.Canceled => |e| return e,
else => |e| e,
},
},
.file_write_streaming => |o| return .{
.file_write_streaming = fileWriteStreaming(t, o.file, o.header, o.data, o.splat) catch |err| switch (err) {
error.Canceled => |e| return e,
else => |e| e,
},
},
.device_io_control => |*o| return .{ .device_io_control = try deviceIoControl(o) },
.net_receive => |*o| return .{ .net_receive = o: {
if (!have_networking) break :o .{ error.NetworkDown, 0 };
if (is_windows) break :o netReceiveWindows(t, o.socket_handle, o.message_buffer, o.data_buffer, o.flags);
netReceivePosix(o.socket_handle, &o.message_buffer[0], o.data_buffer, o.flags, false) catch |err| switch (err) {
error.Canceled => |e| return e,
error.WouldBlock => unreachable,
else => |e| break :o .{ e, 0 },
};
break :o .{ null, 1 };
} },
.net_send => |*o| return .{
.net_send = o: {
if (!have_networking) break :o .{ error.NetworkDown, 0 };
if (is_windows) break :o netSendWindows(t, o.socket_handle, o.messages, o.flags);
const send_err, const sent = netSendPosix(t, o.socket_handle, o.messages, o.flags, false);
if (send_err) |err| switch (err) {
error.Canceled => |e| if (sent == 0) {
return e;
} else {
// Leave the `error.Canceled` for later, but don't try to send any more messages.
recancelInner();
break :o .{ null, sent };
},
error.WouldBlock => unreachable,
else => |e| break :o .{ e, sent },
};
break :o .{ null, sent };
},
},
.net_read => |o| return .{
.net_read = netRead(o.socket_handle, o.data) catch |err| switch (err) {
error.Canceled => |e| return e,
else => |e| e,
},
},
.net_write => |o| return .{
.net_write = (if (is_windows)
netWriteWindows(o.socket_handle, o.header, o.data, o.splat)
else
netWritePosix(o.socket_handle, o.header, o.data, o.splat)) catch |err| switch (err) {
error.Canceled => |e| return e,
else => |e| e,
},
},
}
}