Add shutdown hook interface to Lua API
authorMatthew I <matttpt@gmail.com>
Sat, 8 Sep 2012 18:44:26 +0000 (14:44 -0400)
committerPerttu Ahola <celeron55@gmail.com>
Fri, 30 Nov 2012 17:26:51 +0000 (19:26 +0200)
Scripts can call minetest.register_on_shutdown() to register a
shutdown hook.

Document that minetest.register_on_shutdown() callbacks may not be run

If the server crashes, it is unlikely that callbacks registered using
minetest.register_on_shutdown() will be called.

builtin/misc_register.lua
doc/lua_api.txt
src/scriptapi.cpp
src/scriptapi.h
src/server.cpp

index 77c594de2c9e8a217be01e18572cee3184f220b8..f9c06a02a3ac7796bf047f6cd8d4fc709062089f 100644 (file)
@@ -303,6 +303,7 @@ end
 
 minetest.registered_on_chat_messages, minetest.register_on_chat_message = make_registration()
 minetest.registered_globalsteps, minetest.register_globalstep = make_registration()
+minetest.registered_on_shutdown, minetest.register_on_shutdown = make_registration()
 minetest.registered_on_punchnodes, minetest.register_on_punchnode = make_registration()
 minetest.registered_on_placenodes, minetest.register_on_placenode = make_registration()
 minetest.registered_on_dignodes, minetest.register_on_dignode = make_registration()
index 550716cefd557f426d39a8c735b5d792ed7b57e9..e32efc6df888cb257d9713a582ac073cba4e2705 100644 (file)
@@ -792,6 +792,11 @@ minetest.register_craft(recipe)
 Global callback registration functions: (Call these only at load time)
 minetest.register_globalstep(func(dtime))
 ^ Called every server step, usually interval of 0.05s
+minetest.register_on_shutdown(func())
+^ Called before server shutdown
+^ WARNING: If the server terminates abnormally (i.e. crashes), the registered
+           callbacks WILL LIKELY NOT BE RUN.  Data should be saved at
+           semi-frequent intervals as well as on server shutdown.
 minetest.register_on_placenode(func(pos, newnode, placer, oldnode))
 ^ Called when a node has been placed
 ^ Deprecated: Use on_construct or after_place_node in node definition instead
index 91100d3115e56f0eaa4766cf19244e0c546f773d..e5815c4620dd57cd1bcea72c14c88a6d8c40d867 100644 (file)
@@ -5576,6 +5576,19 @@ bool scriptapi_on_chat_message(lua_State *L, const std::string &name,
        return ate;
 }
 
+void scriptapi_on_shutdown(lua_State *L)
+{
+       realitycheck(L);
+       assert(lua_checkstack(L, 20));
+       StackUnroller stack_unroller(L);
+
+       // Get registered shutdown hooks
+       lua_getglobal(L, "minetest");
+       lua_getfield(L, -1, "registered_on_shutdown");
+       // Call callbacks
+       scriptapi_run_callbacks(L, 0, RUN_CALLBACKS_MODE_FIRST);
+}
+
 void scriptapi_on_newplayer(lua_State *L, ServerActiveObject *player)
 {
        realitycheck(L);
index 144cb3bc6d556c59b08ec5f38871fc62ed0d5ea1..d71b8fe41e412ccabfdc41e603df97c51ec3f5f9 100644 (file)
@@ -55,6 +55,9 @@ void scriptapi_environment_step(lua_State *L, float dtime);
 void scriptapi_environment_on_generated(lua_State *L, v3s16 minp, v3s16 maxp,
                u32 blockseed);
 
+/* server */
+void scriptapi_on_shutdown(lua_State *L);
+
 /* misc */
 void scriptapi_on_newplayer(lua_State *L, ServerActiveObject *player);
 void scriptapi_on_dieplayer(lua_State *L, ServerActiveObject *player);
index 961bdeaf92f1aacba8767137a7e3641c8eeac652..67c1ce9270748783b09958121acd8c1e0e3ea96c 100644 (file)
@@ -1112,6 +1112,11 @@ Server::~Server()
                        {}
                }
        }
+
+       /*
+               Execute script shutdown hooks
+       */
+       scriptapi_on_shutdown(m_lua);
        
        {
                JMutexAutoLock envlock(m_env_mutex);