Diff

util/async.lua @ 11961:542a9a503073

util.async: Add sleep() method with configurable scheduling backend No scheduler set by default, so it will error (we plan to initialize it in util.startup). We wanted to avoid a hard dependency on util.timer (which in turn depends on network backends, etc.), and we didn't add timer.sleep() because we didn't want to add a hard dependency on util.async for things that don't need it.
author Matthew Wild <mwild1@gmail.com>
date Mon, 29 Nov 2021 14:11:24 +0000
parent 10931:558f0555ba02
child 11962:9a70a543c727
line wrap: on
line diff
--- a/util/async.lua	Mon Nov 29 02:13:45 2021 +0100
+++ b/util/async.lua	Mon Nov 29 14:11:24 2021 +0000
@@ -11,6 +11,9 @@
 	return thread;
 end
 
+-- Configurable functions
+local schedule_task = nil; -- schedule_task(seconds, callback)
+
 local function runner_from_thread(thread)
 	local level = 0;
 	-- Find the 'level' of the top-most function (0 == current level, 1 == caller, ...)
@@ -118,6 +121,15 @@
 	end;
 end
 
+local function sleep(seconds)
+	if not schedule_task then
+		error("async.sleep() is not available - configure schedule function");
+	end
+	local wait, done = waiter();
+	schedule_task(seconds, done);
+	wait();
+end
+
 local runner_mt = {};
 runner_mt.__index = runner_mt;
 
@@ -272,4 +284,7 @@
 	runner = runner;
 	wait = wait_for; -- COMPAT w/trunk pre-0.12
 	wait_for = wait_for;
+	sleep = sleep;
+
+	set_schedule_function = function (new_schedule_function) schedule_task = new_schedule_function; end;
 };