]> git.lizzy.rs Git - dragonfireclient.git/blob - builtin/common/async_event.lua
minetest.deserialize: Throw error when argument not string (#5738)
[dragonfireclient.git] / builtin / common / async_event.lua
1
2 core.async_jobs = {}
3
4 local function handle_job(jobid, serialized_retval)
5         local retval = core.deserialize(serialized_retval)
6         assert(type(core.async_jobs[jobid]) == "function")
7         core.async_jobs[jobid](retval)
8         core.async_jobs[jobid] = nil
9 end
10
11 if core.register_globalstep then
12         core.register_globalstep(function(dtime)
13                 for i, job in ipairs(core.get_finished_jobs()) do
14                         handle_job(job.jobid, job.retval)
15                 end
16         end)
17 else
18         core.async_event_handler = handle_job
19 end
20
21 function core.handle_async(func, parameter, callback)
22         -- Serialize function
23         local serialized_func = string.dump(func)
24
25         assert(serialized_func ~= nil)
26
27         -- Serialize parameters
28         local serialized_param = core.serialize(parameter)
29
30         if serialized_param == nil then
31                 return false
32         end
33
34         local jobid = core.do_async_callback(serialized_func, serialized_param)
35
36         core.async_jobs[jobid] = callback
37
38         return true
39 end
40