windows: only create io completion port once

This commit is contained in:
Andrew Kelley 2018-08-09 20:12:46 -04:00
parent b219feb3f1
commit 26a842c264
2 changed files with 14 additions and 9 deletions

View File

@ -113,6 +113,8 @@ pub async fn pwriteWindows(loop: *Loop, fd: os.FileHandle, data: []const u8, off
},
};
const completion_key = @ptrToInt(&resume_node.base);
// TODO support concurrent async ops on the file handle
// we can do this by ignoring completion key and using @fieldParentPtr with the *Overlapped
_ = try os.windowsCreateIoCompletionPort(fd, loop.os_data.io_port, completion_key, undefined);
var overlapped = windows.OVERLAPPED{
.Internal = 0,
@ -247,6 +249,8 @@ pub async fn preadWindows(loop: *Loop, fd: os.FileHandle, data: []u8, offset: u6
},
};
const completion_key = @ptrToInt(&resume_node.base);
// TODO support concurrent async ops on the file handle
// we can do this by ignoring completion key and using @fieldParentPtr with the *Overlapped
_ = try os.windowsCreateIoCompletionPort(fd, loop.os_data.io_port, completion_key, undefined);
var overlapped = windows.OVERLAPPED{
.Internal = 0,
@ -831,8 +835,7 @@ pub fn Watch(comptime V: type) type {
var it = self.os_data.dir_table.iterator();
while (it.next()) |entry| {
allocator.free(entry.key);
// TODO why does freeing this memory crash the test?
//allocator.destroy(entry.value);
allocator.destroy(entry.value);
}
self.os_data.dir_table.deinit();
self.channel.destroy();
@ -1100,13 +1103,15 @@ pub fn Watch(comptime V: type) type {
};
var event_buf: [4096]u8 align(@alignOf(windows.FILE_NOTIFY_INFORMATION)) = undefined;
// TODO handle this error not in the channel but in the setup
_ = os.windowsCreateIoCompletionPort(
dir_handle, self.channel.loop.os_data.io_port, completion_key, undefined,
) catch |err| {
await (async self.channel.put(err) catch unreachable);
return;
};
while (true) {
_ = os.windowsCreateIoCompletionPort(
dir_handle, self.channel.loop.os_data.io_port, completion_key, undefined,
) catch |err| {
await (async self.channel.put(err) catch unreachable);
return;
};
{
// TODO only 1 beginOneEvent for the whole coroutine
self.channel.loop.beginOneEvent();
@ -1343,7 +1348,6 @@ async fn testFsWatch(loop: *Loop) !void {
WatchEventId.CloseWrite => {},
WatchEventId.Delete => @panic("wrong event"),
}
const contents_updated = try await try async readFile(loop, file_path, 1024 * 1024);
assert(mem.eql(u8, contents_updated,
\\line 1

View File

@ -220,6 +220,7 @@ pub fn windowsCreateIoCompletionPort(file_handle: windows.HANDLE, existing_compl
const handle = windows.CreateIoCompletionPort(file_handle, existing_completion_port, completion_key, concurrent_thread_count) orelse {
const err = windows.GetLastError();
switch (err) {
windows.ERROR.INVALID_PARAMETER => unreachable,
else => return os.unexpectedErrorWindows(err),
}
};