aboutsummaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorShadowNinja <shadowninja@minetest.net>2014-04-15 13:41:07 -0400
committerShadowNinja <shadowninja@minetest.net>2014-04-27 16:15:53 -0400
commit6ab3b4c83856b5c8a1a526c0e4dc55babe79d50d (patch)
tree90e64f78dd3ceac12dbb21ac6b045500de0ca603 /builtin
parentdb4ea4658c58772ee447ff0eff8bb39b692081ec (diff)
downloadminetest-6ab3b4c83856b5c8a1a526c0e4dc55babe79d50d.tar.gz
minetest-6ab3b4c83856b5c8a1a526c0e4dc55babe79d50d.tar.bz2
minetest-6ab3b4c83856b5c8a1a526c0e4dc55babe79d50d.zip
Remove dependency on marshal and many other async changes
This makes a number of changes: * Remove the dependency on marshal by using string.dump and loadstring. * Use lua_tolstring rather than having Lua functions pass string lengths to C++. * Move lua_api/l_async_events.* to cpp_api/s_async.*, where it belongs. * Make AsyncWorkerThread a child of ScriptApiBase, this removes some duplicate functionality. * Don't wait for async threads to shut down. (Is this safe? Might result in corruption if the thread is writing to a file.) * Pop more unused items from the stack * Code style fixes * Other misc changes
Diffstat (limited to 'builtin')
-rw-r--r--builtin/async_env.lua24
-rw-r--r--builtin/async_event.lua66
2 files changed, 39 insertions, 51 deletions
diff --git a/builtin/async_env.lua b/builtin/async_env.lua
index afc69219c..cdcb82ee3 100644
--- a/builtin/async_env.lua
+++ b/builtin/async_env.lua
@@ -1,19 +1,21 @@
-engine.log("info","Initializing Asynchronous environment")
+engine.log("info", "Initializing Asynchronous environment")
+local tbl = engine or minetest
+minetest = tbl
+dofile(SCRIPTDIR .. DIR_DELIM .. "serialize.lua")
dofile(SCRIPTDIR .. DIR_DELIM .. "misc_helpers.lua")
-function engine.job_processor(serialized_function, serialized_data)
+function tbl.job_processor(serialized_func, serialized_param)
+ local func = loadstring(serialized_func)
+ local param = tbl.deserialize(serialized_param)
+ local retval = nil
- local fct = marshal.decode(serialized_function)
- local params = marshal.decode(serialized_data)
- local retval = marshal.encode(nil)
-
- if fct ~= nil and type(fct) == "function" then
- local result = fct(params)
- retval = marshal.encode(result)
+ if type(func) == "function" then
+ retval = tbl.serialize(func(param))
else
- engine.log("error","ASYNC WORKER: unable to deserialize function")
+ tbl.log("error", "ASYNC WORKER: Unable to deserialize function")
end
- return retval,retval:len()
+ return retval or tbl.serialize(nil)
end
+
diff --git a/builtin/async_event.lua b/builtin/async_event.lua
index f4c7d2449..2c3fb8fa7 100644
--- a/builtin/async_event.lua
+++ b/builtin/async_event.lua
@@ -1,59 +1,45 @@
local tbl = engine or minetest
+local SCRIPTDIR = SCRIPTDIR or tbl.get_scriptdir()
+minetest = tbl
+dofile(SCRIPTDIR .. DIR_DELIM .. "serialize.lua")
+
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
+local function handle_job(jobid, serialized_retval)
+ local retval = tbl.deserialize(serialized_retval)
+ assert(type(tbl.async_jobs[jobid]) == "function")
+ tbl.async_jobs[jobid](retval)
+ tbl.async_jobs[jobid] = nil
+end
- assert(type(tbl.async_jobs[jobid]) == "function")
- tbl.async_jobs[jobid](retval)
- tbl.async_jobs[jobid] = nil
- end
+if engine ~= nil then
+ tbl.async_event_handler = handle_job
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)
+ minetest.register_globalstep(function(dtime)
+ for i, job in ipairs(tbl.get_finished_jobs()) do
+ handle_job(job.jobid, job.retval)
+ end
+ end)
end
-function tbl.handle_async(fct, parameters, callback)
-
- --serialize fct
- local serialized_fct = marshal.encode(fct)
+function tbl.handle_async(func, parameter, callback)
+ -- Serialize function
+ local serialized_func = string.dump(func)
- assert(marshal.decode(serialized_fct) ~= nil)
+ assert(serialized_func ~= nil)
- --serialize parameters
- local serialized_params = marshal.encode(parameters)
+ -- Serialize parameters
+ local serialized_param = tbl.serialize(parameter)
- if serialized_fct == nil or
- serialized_params == nil or
- serialized_fct:len() == 0 or
- serialized_params:len() == 0 then
+ if serialized_param == nil then
return false
end
- local jobid = tbl.do_async_callback( serialized_fct,
- serialized_fct:len(),
- serialized_params,
- serialized_params:len())
+ local jobid = tbl.do_async_callback(serialized_func, serialized_param)
tbl.async_jobs[jobid] = callback
return true
end
+