From bc0e8773d2e63e3583ee49c2dd6ba2e726770157 Mon Sep 17 00:00:00 2001 From: bjcscat Date: Tue, 16 Jul 2024 10:26:04 -0500 Subject: [PATCH 1/2] fixed tests being in the wrong files --- tests/task/defer.luau | 18 +++++++++++++----- tests/task/delay.luau | 20 ++++++-------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/task/defer.luau b/tests/task/defer.luau index 847efd2a..43ac892a 100644 --- a/tests/task/defer.luau +++ b/tests/task/defer.luau @@ -41,21 +41,29 @@ end) task.wait() assert(flag3 == 3, "Defer should run after spawned threads") --- Delay should be able to be nested +-- Defer should be able to be nested local flag4: boolean = false -task.delay(0.05, function() +task.defer(function() local function nested3() - task.delay(0.05, function() + task.defer(function() + task.wait(0.05) flag4 = true end) end local function nested2() - task.delay(0.05, nested3) + task.defer(function() + task.wait(0.05) + nested3() + end) end local function nested1() - task.delay(0.05, nested2) + task.defer(function() + task.wait(0.05) + nested2() + end) end + task.wait(0.05) nested1() end) task.wait(0.25) diff --git a/tests/task/delay.luau b/tests/task/delay.luau index c9d764dd..930e7f76 100644 --- a/tests/task/delay.luau +++ b/tests/task/delay.luau @@ -28,33 +28,25 @@ assert(flag, "Delay should work with yielding (1)") task.wait(0.1) assert(not flag2, "Delay should work with yielding (2)") --- Defer should be able to be nested +-- Delay should be able to be nested local flag4: boolean = false -task.defer(function() +task.delay(0.05, function() local function nested3() - task.defer(function() - task.wait(0.05) + task.delay(0.05, function() flag4 = true end) end local function nested2() - task.defer(function() - task.wait(0.05) - nested3() - end) + task.delay(0.05, nested3) end local function nested1() - task.defer(function() - task.wait(0.05) - nested2() - end) + task.delay(0.05, nested2) end - task.wait(0.05) nested1() end) task.wait(0.25) -assert(flag4, "Defer should work with nesting") +assert(flag4, "Delay should work with nesting") -- Varargs should get passed correctly From df4ba68cafe68054f9ef4bebbf0aa31ae5c4db4d Mon Sep 17 00:00:00 2001 From: bjcscat Date: Tue, 16 Jul 2024 10:26:21 -0500 Subject: [PATCH 2/2] fix the scheduler running forever on specific async tasks --- crates/mlua-luau-scheduler/src/scheduler.rs | 37 ++++++++++++--------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/crates/mlua-luau-scheduler/src/scheduler.rs b/crates/mlua-luau-scheduler/src/scheduler.rs index 31f699ed..4024a2f3 100644 --- a/crates/mlua-luau-scheduler/src/scheduler.rs +++ b/crates/mlua-luau-scheduler/src/scheduler.rs @@ -8,7 +8,7 @@ use std::{ thread::panicking, }; -use futures_lite::prelude::*; +use futures_lite::{future::yield_now, prelude::*}; use mlua::prelude::*; use async_executor::{Executor, LocalExecutor}; @@ -369,23 +369,28 @@ impl<'lua> Scheduler<'lua> { // 5 let mut num_processed = 0; - let span_tick = trace_span!("Scheduler::tick"); - let fut_tick = async { - local_exec.tick().await; - // NOTE: Try to do as much work as possible instead of just a single tick() - num_processed += 1; - while local_exec.try_tick() { - num_processed += 1; - } - }; + // let span_tick = trace_span!("Scheduler::tick"); + // let fut_tick = async { + // local_exec.tick().await; + // // NOTE: Try to do as much work as possible instead of just a single tick() + // num_processed += 1; + // while local_exec.try_tick() { + // num_processed += 1; + // } + // }; + local_exec + .run( + fut_exit.or(fut_spawn).or(fut_defer).or(fut_futs).or(async { + local_exec.tick().await; // weird but is required to preserve scheduler ordering + + if !local_exec.is_empty() { + yield_now().await; + } + }), // .or(fut_tick.instrument(span_tick.or_current())), + ) + .await; // 1 + 2 + 3 + 4 + 5 - fut_exit - .or(fut_spawn) - .or(fut_defer) - .or(fut_futs) - .or(fut_tick.instrument(span_tick.or_current())) - .await; // Check if we should exit if self.exit.get().is_some() {