Only create one alias metatable
[oweals/minetest.git] / builtin / async_event.lua
1 local tbl = engine or minetest
2
3 tbl.async_jobs = {}
4
5 if engine ~= nil then
6         function tbl.async_event_handler(jobid, serialized_retval)
7                 local retval = nil
8                 if serialized_retval ~= "ERROR" then
9                         retval= marshal.decode(serialized_retval)
10                 else
11                         tbl.log("error","Error fetching async result")
12                 end
13
14                 assert(type(tbl.async_jobs[jobid]) == "function")
15                 tbl.async_jobs[jobid](retval)
16                 tbl.async_jobs[jobid] = nil
17         end
18 else
19
20         minetest.register_globalstep(
21                 function(dtime)
22                         local list = tbl.get_finished_jobs()
23
24                         for i=1,#list,1 do
25                                 local retval = marshal.decode(list[i].retval)
26
27                                 assert(type(tbl.async_jobs[jobid]) == "function")
28                                 tbl.async_jobs[list[i].jobid](retval)
29                                 tbl.async_jobs[list[i].jobid] = nil
30                         end
31                 end)
32 end
33
34 function tbl.handle_async(fct, parameters, callback)
35
36         --serialize fct
37         local serialized_fct = marshal.encode(fct)
38
39         assert(marshal.decode(serialized_fct) ~= nil)
40
41         --serialize parameters
42         local serialized_params = marshal.encode(parameters)
43
44         if serialized_fct == nil or
45                 serialized_params == nil or
46                 serialized_fct:len() == 0 or
47                 serialized_params:len() == 0 then
48                 return false
49         end
50
51         local jobid = tbl.do_async_callback(    serialized_fct,
52                                                                                         serialized_fct:len(),
53                                                                                         serialized_params,
54                                                                                         serialized_params:len())
55
56         tbl.async_jobs[jobid] = callback
57
58         return true
59 end