summaryrefslogtreecommitdiff
path: root/mesecons_luacontroller
diff options
context:
space:
mode:
authorJeija <norrepli@gmail.com>2015-10-18 11:28:35 +0200
committerJeija <norrepli@gmail.com>2015-10-18 11:28:35 +0200
commitb89fe524693296be57400f4ae74ef27bd7cc46d3 (patch)
tree9df8d2e853969e8c6cc7399b628c42e798da9894 /mesecons_luacontroller
parent97f7b5745f8914178adbfce65bc339c366cb4a17 (diff)
downloadmesecons-b89fe524693296be57400f4ae74ef27bd7cc46d3.tar
mesecons-b89fe524693296be57400f4ae74ef27bd7cc46d3.tar.gz
mesecons-b89fe524693296be57400f4ae74ef27bd7cc46d3.tar.bz2
mesecons-b89fe524693296be57400f4ae74ef27bd7cc46d3.tar.xz
mesecons-b89fe524693296be57400f4ae74ef27bd7cc46d3.zip
Luacontroller: Add configurable size limit for mem table, 100kBytes by default, fixes #240
If size limit is exceeded, the luacontroller overheats. Overheating will cause the memory to be erased.
Diffstat (limited to 'mesecons_luacontroller')
-rw-r--r--mesecons_luacontroller/init.lua43
1 files changed, 25 insertions, 18 deletions
diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua
index d10fd20..bbbd280 100644
--- a/mesecons_luacontroller/init.lua
+++ b/mesecons_luacontroller/init.lua
@@ -163,19 +163,18 @@ end
-----------------
-- Overheating --
-----------------
-
-local function overheat_off(pos)
- mesecon.receptor_off(pos, mesecon.rules.flat)
+local function burn_controller(pos)
+ local node = minetest.get_node(pos)
+ node.name = BASENAME.."_burnt"
+ minetest.swap_node(pos, node)
+ minetest.get_meta(pos):set_string("lc_memory", "");
+ -- Wait for pending operations
+ minetest.after(0.2, mesecon.receptor_off, pos, mesecon.rules.flat)
end
-
local function overheat(pos, meta)
if mesecon.do_overheat(pos) then -- If too hot
- local node = minetest.get_node(pos)
- node.name = BASENAME.."_burnt"
- minetest.swap_node(pos, node)
- -- Wait for pending operations
- minetest.after(0.2, overheat_off, pos)
+ burn_controller(pos)
return true
end
end
@@ -379,12 +378,17 @@ local function load_memory(meta)
end
-local function save_memory(meta, mem)
- meta:set_string("lc_memory",
- minetest.serialize(
- remove_functions(mem)
- )
- )
+local function save_memory(pos, meta, mem)
+ local memstring = minetest.serialize(remove_functions(mem))
+ local memsize_max = mesecon.setting("luacontroller_memsize", 100000)
+
+ if (#memstring <= memsize_max) then
+ meta:set_string("lc_memory", memstring)
+ else
+ print("Error: Luacontroller memory overflow. "..memsize_max.." bytes available, "
+ ..#memstring.." required. Controller overheats.")
+ burn_controller(pos)
+ end
end
@@ -412,15 +416,17 @@ local function run(pos, event)
return "Ports set are invalid."
end
- save_memory(meta, env.mem)
-
-- Actually set the ports
set_port_states(pos, env.port)
+
+ -- Save memory. This may burn the luacontroller if a memory overflow occurs.
+ save_memory(pos, meta, env.mem)
end
mesecon.queue:add_function("lc_interrupt", function (pos, luac_id, iid)
- -- There is no luacontroller anymore / it has been reprogrammed / replaced
+ -- There is no luacontroller anymore / it has been reprogrammed / replaced / burnt
if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end
+ if (minetest.registered_nodes[minetest.get_node(pos).name].is_burnt) then return end
run(pos, {type="interrupt", iid = iid})
end)
@@ -595,6 +601,7 @@ minetest.register_node(BASENAME .. "_burnt", {
"jeija_microcontroller_sides.png"
},
inventory_image = "jeija_luacontroller_burnt_top.png",
+ is_burnt = true,
paramtype = "light",
groups = {dig_immediate=2, not_in_creative_inventory=1},
drop = BASENAME.."0000",