summaryrefslogtreecommitdiff
path: root/builtin/async_event.lua
diff options
context:
space:
mode:
Diffstat (limited to 'builtin/async_event.lua')
-rw-r--r--builtin/async_event.lua59
1 files changed, 59 insertions, 0 deletions
diff --git a/builtin/async_event.lua b/builtin/async_event.lua
new file mode 100644
index 000000000..f4c7d2449
--- /dev/null
+++ b/builtin/async_event.lua
@@ -0,0 +1,59 @@
+local tbl = engine or minetest
+
+tbl.async_jobs = {}
+
+if engine ~= nil then
+ function tbl.async_event_handler(jobid, serialized_retval)
+ local retval = nil
+ if serialized_retval ~= "ERROR" then
+ retval= marshal.decode(serialized_retval)
+ else
+ tbl.log("error","Error fetching async result")
+ end
+
+ assert(type(tbl.async_jobs[jobid]) == "function")
+ tbl.async_jobs[jobid](retval)
+ tbl.async_jobs[jobid] = nil
+ end
+else
+
+ minetest.register_globalstep(
+ function(dtime)
+ local list = tbl.get_finished_jobs()
+
+ for i=1,#list,1 do
+ local retval = marshal.decode(list[i].retval)
+
+ assert(type(tbl.async_jobs[jobid]) == "function")
+ tbl.async_jobs[list[i].jobid](retval)
+ tbl.async_jobs[list[i].jobid] = nil
+ end
+ end)
+end
+
+function tbl.handle_async(fct, parameters, callback)
+
+ --serialize fct
+ local serialized_fct = marshal.encode(fct)
+
+ assert(marshal.decode(serialized_fct) ~= nil)
+
+ --serialize parameters
+ local serialized_params = marshal.encode(parameters)
+
+ if serialized_fct == nil or
+ serialized_params == nil or
+ serialized_fct:len() == 0 or
+ serialized_params:len() == 0 then
+ return false
+ end
+
+ local jobid = tbl.do_async_callback( serialized_fct,
+ serialized_fct:len(),
+ serialized_params,
+ serialized_params:len())
+
+ tbl.async_jobs[jobid] = callback
+
+ return true
+end