From 4bf27174249ffe081bbfd78f39d14391c194a76a Mon Sep 17 00:00:00 2001 From: Quinton Miller Date: Tue, 2 May 2023 09:20:57 +0800 Subject: [PATCH] Fix `-Dpreview_mt` infinite loop on Windows --- src/crystal/scheduler.cr | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/crystal/scheduler.cr b/src/crystal/scheduler.cr index 61df03294875..0667626f787e 100644 --- a/src/crystal/scheduler.cr +++ b/src/crystal/scheduler.cr @@ -73,7 +73,7 @@ class Crystal::Scheduler {% end %} {% if flag?(:preview_mt) %} - @fiber_channel = Crystal::FiberChannel.new + private getter(fiber_channel : Crystal::FiberChannel) { Crystal::FiberChannel.new } @free_stacks = Deque(Void*).new {% end %} @lock = Crystal::SpinLock.new @@ -199,6 +199,7 @@ class Crystal::Scheduler end def run_loop + fiber_channel = self.fiber_channel loop do @lock.lock if runnable = @runnables.shift? @@ -208,7 +209,7 @@ class Crystal::Scheduler else @sleeping = true @lock.unlock - fiber = @fiber_channel.receive + fiber = fiber_channel.receive @lock.lock @sleeping = false @@ -222,7 +223,7 @@ class Crystal::Scheduler def send_fiber(fiber : Fiber) @lock.lock if @sleeping - @fiber_channel.send(fiber) + fiber_channel.send(fiber) else @runnables << fiber end