summaryrefslogtreecommitdiff
path: root/builtin/async_event.lua
blob: f4c7d24495672c58e7c87bd9cfd3967766a21f63 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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