Merge pull request #6841 from ifreund/fix-event-loop

std/event: fix poll error set handling
master
Andrew Kelley 2020-10-29 14:41:18 -04:00 committed by GitHub
commit 844eb932f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 7 additions and 6 deletions

View File

@ -467,6 +467,7 @@ pub const Loop = struct {
}};
_ = os.poll(&pfd, -1) catch |poll_err| switch (poll_err) {
error.SystemResources,
error.NetworkSubsystemFailed,
error.Unexpected,
=> {
// Even poll() didn't work. The best we can do now is sleep for a
@ -772,7 +773,7 @@ pub const Loop = struct {
self.delay_queue.waiters.insert(&entry);
// Speculatively wake up the timer thread when we add a new entry.
// If the timer thread is sleeping on a longer entry, we need to
// If the timer thread is sleeping on a longer entry, we need to
// interrupt it so that our entry can be expired in time.
self.delay_queue.event.set();
}
@ -784,7 +785,7 @@ pub const Loop = struct {
thread: *std.Thread,
event: std.AutoResetEvent,
is_running: bool,
/// Initialize the delay queue by spawning the timer thread
/// and starting any timer resources.
fn init(self: *DelayQueue) !void {
@ -799,7 +800,7 @@ pub const Loop = struct {
};
}
/// Entry point for the timer thread
/// Entry point for the timer thread
/// which waits for timer entries to expire and reschedules them.
fn run(self: *DelayQueue) void {
const loop = @fieldParentPtr(Loop, "delay_queue", self);
@ -847,12 +848,12 @@ pub const Loop = struct {
const entry = self.peekExpiringEntry() orelse return null;
if (entry.expires > now)
return null;
assert(self.entries.remove(&entry.node));
return entry;
}
/// Returns an estimate for the amount of time
/// Returns an estimate for the amount of time
/// to wait until the next waiting entry expires.
fn nextExpire(self: *Waiters) ?u64 {
const entry = self.peekExpiringEntry() orelse return null;