From 913f7d045020f7f3301201cf69e1d788439d8886 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 6 Nov 2019 15:08:29 -0500 Subject: [PATCH] improve the start code for evented I/O When evented I/O is being used, prevent event loop from terminating at least until main() has returned. --- lib/std/special/start.zig | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/std/special/start.zig b/lib/std/special/start.zig index 7738c00d1a..5c4d77b694 100644 --- a/lib/std/special/start.zig +++ b/lib/std/special/start.zig @@ -202,8 +202,8 @@ inline fn initEventLoopAndCallMain() u8 { defer loop.deinit(); var result: u8 = undefined; - var frame: @Frame(callMain) = undefined; - _ = @asyncCall(&frame, &result, callMain); + var frame: @Frame(callMainAsync) = undefined; + _ = @asyncCall(&frame, &result, callMainAsync, loop); loop.run(); return result; } @@ -214,6 +214,13 @@ inline fn initEventLoopAndCallMain() u8 { return @inlineCall(callMain); } +fn callMainAsync(loop: *std.event.Loop) u8 { + // This prevents the event loop from terminating at least until main() has returned. + loop.beginOneEvent(); + defer loop.finishOneEvent(); + return callMain(); +} + // This is not marked inline because it is called with @asyncCall when // there is an event loop. fn callMain() u8 {