commit 0e124a7a07ccef32b7c2f8e5694c3839c5727c16
parent d5bad368c580097dc1816146da1e8d704c29e733
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date: Tue, 25 Feb 2025 20:11:36 +0000
Basic reload by rebuilding the whole state
Diffstat:
1 file changed, 38 insertions(+), 2 deletions(-)
diff --git a/mqttagent.go b/mqttagent.go
@@ -218,8 +218,27 @@ func mqttRead(client *mqtt.Client, toLua chan<- MqttMessage, id int) {
}
func reload(oldL *lua.LState, agent MqttAgent, main_script string) *lua.LState {
- log.Println("Reload is not implemented yet")
- return oldL
+ log.Println("Reloading", main_script)
+ newL := lua.NewState()
+ agent.Setup(newL)
+ registerMqttClientType(newL)
+ registerTimerType(newL)
+
+ stateReloadBegin(oldL, newL)
+
+ if err := newL.DoFile(main_script); err != nil {
+ log.Println("Reload failed:", err)
+ cleanupClients(newL)
+ agent.Teardown(newL)
+ newL.Close()
+ return oldL
+ } else {
+ cleanupClients(oldL)
+ agent.Teardown(oldL)
+ oldL.Close()
+ log.Println("Reload successful")
+ return newL
+ }
}
func dup(src []byte) []byte {
@@ -257,6 +276,23 @@ func registerState(L *lua.LState, clientPrefix string, toLua chan<- MqttMessage)
L.SetGlobal("reload", L.NewFunction(requestReload))
}
+func stateReloadBegin(oldL, newL *lua.LState) {
+ oldSt := oldL.GetGlobal(luaStateName).(*lua.LTable)
+ toLua := oldL.RawGetInt(oldSt, keyChanToLua).(*lua.LUserData).Value.(chan<- MqttMessage)
+ clientPrefix := oldL.RawGetInt(oldSt, keyClientPrefix)
+ nextId := oldL.RawGetInt(oldSt, keyClientNextId)
+
+ st := newL.NewTable()
+ newL.RawSetInt(st, keyChanToLua, newUserData(newL, toLua))
+ newL.RawSetInt(st, keyClientPrefix, clientPrefix)
+ newL.RawSetInt(st, keyClientNextId, nextId)
+ newL.RawSetInt(st, keyCfgMap, newUserData(newL, make(mqttConfigMap)))
+ newL.RawSetInt(st, keyCnxTable, newL.NewTable())
+ newL.RawSetInt(st, keyTimerTable, newL.NewTable())
+ newL.SetGlobal(luaStateName, st)
+ newL.SetGlobal("reload", newL.NewFunction(requestReload))
+}
+
func stateValue(L *lua.LState, key int) lua.LValue {
st := L.GetGlobal(luaStateName)
return L.RawGetInt(st.(*lua.LTable), key)