mirror of
https://github.com/ziglang/zig.git
synced 2025-02-09 06:00:40 +00:00
pwrite
Signed-off-by: Loris Cro <kappaloris@gmail.com>
This commit is contained in:
parent
18f6629bd8
commit
7a07c62a07
@ -1020,9 +1020,43 @@ pub const Loop = struct {
|
||||
}
|
||||
}
|
||||
|
||||
/// Performs an async `os.pwrite` using a separate thread.
|
||||
/// `fd` must block and not return EAGAIN.
|
||||
pub fn pwrite(self: *Loop, fd: os.fd_t, bytes: []const u8, offset: u64, simulate_evented: bool) os.PWriteError!usize {
|
||||
if (simulate_evented) {
|
||||
var req_node = Request.Node{
|
||||
.data = .{
|
||||
.msg = .{
|
||||
.pwrite = .{
|
||||
.fd = fd,
|
||||
.bytes = bytes,
|
||||
.offset = offset,
|
||||
.result = undefined,
|
||||
},
|
||||
},
|
||||
.finish = .{ .TickNode = .{ .data = @frame() } },
|
||||
},
|
||||
};
|
||||
suspend {
|
||||
self.posixFsRequest(&req_node);
|
||||
}
|
||||
return req_node.data.msg.pwrite.result;
|
||||
} else {
|
||||
while (true) {
|
||||
return os.pwrite(fd, bytes, offset) catch |err| switch (err) {
|
||||
error.WouldBlock => {
|
||||
self.waitUntilFdWritable(fd);
|
||||
continue;
|
||||
},
|
||||
else => return err,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Performs an async `os.pwritev` using a separate thread.
|
||||
/// `fd` must block and not return EAGAIN.
|
||||
pub fn pwritev(self: *Loop, fd: os.fd_t, iov: []const os.iovec_const, offset: u64) os.WriteError!usize {
|
||||
pub fn pwritev(self: *Loop, fd: os.fd_t, iov: []const os.iovec_const, offset: u64) os.PWriteError!usize {
|
||||
var req_node = Request.Node{
|
||||
.data = .{
|
||||
.msg = .{
|
||||
@ -1194,6 +1228,9 @@ pub const Loop = struct {
|
||||
.writev => |*msg| {
|
||||
msg.result = os.writev(msg.fd, msg.iov);
|
||||
},
|
||||
.pwrite => |*msg| {
|
||||
msg.result = os.pwrite(msg.fd, msg.bytes, msg.offset);
|
||||
},
|
||||
.pwritev => |*msg| {
|
||||
msg.result = os.pwritev(msg.fd, msg.iov, msg.offset);
|
||||
},
|
||||
@ -1263,6 +1300,7 @@ pub const Loop = struct {
|
||||
readv: ReadV,
|
||||
write: Write,
|
||||
writev: WriteV,
|
||||
pwrite: PWrite,
|
||||
pwritev: PWriteV,
|
||||
pread: PRead,
|
||||
preadv: PReadV,
|
||||
@ -1306,6 +1344,15 @@ pub const Loop = struct {
|
||||
pub const Error = os.WriteError;
|
||||
};
|
||||
|
||||
pub const PWrite = struct {
|
||||
fd: os.fd_t,
|
||||
bytes: []const u8,
|
||||
offset: usize,
|
||||
result: Error!usize,
|
||||
|
||||
pub const Error = os.PWriteError;
|
||||
};
|
||||
|
||||
pub const PWriteV = struct {
|
||||
fd: os.fd_t,
|
||||
iov: []const os.iovec_const,
|
||||
|
@ -566,10 +566,12 @@ pub const File = struct {
|
||||
pub fn pwrite(self: File, bytes: []const u8, offset: u64) PWriteError!usize {
|
||||
if (is_windows) {
|
||||
return windows.WriteFile(self.handle, bytes, offset, self.intended_io_mode);
|
||||
} else if (self.capable_io_mode != self.intended_io_mode) {
|
||||
return std.event.Loop.instance.?.pwrite(self.handle, bytes, offset);
|
||||
} else {
|
||||
}
|
||||
|
||||
if (self.intended_io_mode == .blocking) {
|
||||
return os.pwrite(self.handle, bytes, offset);
|
||||
} else {
|
||||
return std.event.Loop.instance.?.pwrite(self.handle, bytes, offset, self.capable_io_mode != self.intended_io_mode);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -875,12 +875,7 @@ pub fn pwrite(fd: fd_t, bytes: []const u8, offset: u64) PWriteError!usize {
|
||||
EINTR => continue,
|
||||
EINVAL => unreachable,
|
||||
EFAULT => unreachable,
|
||||
EAGAIN => if (std.event.Loop.instance) |loop| {
|
||||
loop.waitUntilFdWritable(fd);
|
||||
continue;
|
||||
} else {
|
||||
return error.WouldBlock;
|
||||
},
|
||||
EAGAIN => return error.WouldBlock,
|
||||
EBADF => return error.NotOpenForWriting, // Can be a race condition.
|
||||
EDESTADDRREQ => unreachable, // `connect` was never called.
|
||||
EDQUOT => return error.DiskQuota,
|
||||
|
Loading…
Reference in New Issue
Block a user