aboutsummaryrefslogtreecommitdiffstats
path: root/util/async.lua
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2018-03-22 07:56:01 +0000
committerMatthew Wild <mwild1@gmail.com>2018-03-22 07:56:01 +0000
commit38ac92b0df128fea95cb790f2920d747045598df (patch)
tree4f94912e6ab5403a1322045f6b9e55d5b59404dc /util/async.lua
parentb48a2409e74c7396ab1fcaf81f7ca17881612857 (diff)
downloadprosody-38ac92b0df128fea95cb790f2920d747045598df.tar.gz
prosody-38ac92b0df128fea95cb790f2920d747045598df.zip
util.async: Add once() to create temporary runners
Diffstat (limited to 'util/async.lua')
-rw-r--r--util/async.lua22
1 files changed, 21 insertions, 1 deletions
diff --git a/util/async.lua b/util/async.lua
index 1930d1a9..8e75a524 100644
--- a/util/async.lua
+++ b/util/async.lua
@@ -219,4 +219,24 @@ local function ready()
return pcall(checkthread);
end
-return { ready = ready, waiter = waiter, guarder = guarder, runner = runner };
+local once; -- forward declaration
+do
+ local once_watchers = {
+ error = function (_, err)
+ error(err);
+ end;
+ };
+ local function once_runner(func) func(); end
+ function once(func)
+ local r = runner(func, once_watchers);
+ return r:run(func);
+ end
+end
+
+return {
+ once = once;
+ ready = ready;
+ waiter = waiter;
+ guarder = guarder;
+ runner = runner
+};