From c37bc9147594049df23c16805c3feeb2f133769d Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 11 Jun 2021 12:54:02 +0200 Subject: [PATCH 1/3] Unregister LUA widgets when the factory is destoyed Resolves #183 --- radio/src/gui/colorlcd/widget.cpp | 6 ++++++ radio/src/gui/colorlcd/widget.h | 1 + radio/src/lua/widgets.cpp | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/radio/src/gui/colorlcd/widget.cpp b/radio/src/gui/colorlcd/widget.cpp index b6e3afb9c..350762fd8 100644 --- a/radio/src/gui/colorlcd/widget.cpp +++ b/radio/src/gui/colorlcd/widget.cpp @@ -196,6 +196,12 @@ void registerWidget(const WidgetFactory * factory) getRegisteredWidgets().push_back(factory); } +void unregisterWidget(const WidgetFactory * factory) +{ + TRACE("unregister widget %s", factory->getName()); + getRegisteredWidgets().remove(factory); +} + const WidgetFactory * getWidgetFactory(const char * name) { auto it = getRegisteredWidgets().cbegin(); diff --git a/radio/src/gui/colorlcd/widget.h b/radio/src/gui/colorlcd/widget.h index 1656af236..1b2a56c9f 100644 --- a/radio/src/gui/colorlcd/widget.h +++ b/radio/src/gui/colorlcd/widget.h @@ -114,6 +114,7 @@ class Widget : public Button }; void registerWidget(const WidgetFactory * factory); +void unregisterWidget(const WidgetFactory * factory); class WidgetFactory { diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index 1ffe6d182..38cfb596c 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -225,6 +225,11 @@ class LuaWidgetFactory: public WidgetFactory { } + ~LuaWidgetFactory() + { + unregisterWidget(this); + } + Widget * create(FormGroup * parent, const rect_t & rect, Widget::PersistentData * persistentData, bool init=true) const override { if (lsWidgets == 0) return 0; From 78915daf950c248b28626564814aa466dd0b3ab0 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 11 Jun 2021 16:35:57 +0200 Subject: [PATCH 2/3] Fixed memory leak: widget factories need to be deleted in opentxClose() --- radio/src/gui/colorlcd/widget.h | 2 ++ radio/src/lua/lua_api.h | 3 +++ radio/src/lua/widgets.cpp | 10 ++++++++++ radio/src/opentx.cpp | 2 ++ 4 files changed, 17 insertions(+) diff --git a/radio/src/gui/colorlcd/widget.h b/radio/src/gui/colorlcd/widget.h index 1b2a56c9f..7906e1a61 100644 --- a/radio/src/gui/colorlcd/widget.h +++ b/radio/src/gui/colorlcd/widget.h @@ -126,6 +126,8 @@ class WidgetFactory registerWidget(this); } + virtual ~WidgetFactory() {} + inline const char * getName() const { return name; diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index 2860e470c..36f658d1a 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -187,6 +187,9 @@ void registerBitmapClass(lua_State * L); void luaSetInstructionsLimit(lua_State* L, int count); int luaLoadScriptFileToState(lua_State * L, const char * filename, const char * mode); +// Unregister LUA widget factories +void luaUnregisterWidgets(); + #if LCD_W > 350 #define RADIO_TOOL_NAME_MAXLEN 40 #else diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index 38cfb596c..b1d0bc489 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -512,3 +512,13 @@ void luaInitThemesAndWidgets() luaDoGc(lsWidgets, true); } } + +void luaUnregisterWidgets() +{ + std::list regWidgets(getRegisteredWidgets()); + for (auto w : regWidgets) { + if (dynamic_cast(w)) { + delete w; + } + } +} diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 79ded3d83..4d8cf4d76 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1518,6 +1518,8 @@ void opentxClose(uint8_t shutdown) //TODO: In fact we want only to empty the trash (private method) MainWindow::instance()->run(); + + luaUnregisterWidgets(); luaClose(&lsWidgets); #endif From c28f61c646215feca3b757520a5eaea4aba53c39 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 12 Jun 2021 07:52:20 +0200 Subject: [PATCH 3/3] Reload LUA widgets before resuming the UI --- radio/src/opentx.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 4d8cf4d76..923ebb6a0 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1521,6 +1521,7 @@ void opentxClose(uint8_t shutdown) luaUnregisterWidgets(); luaClose(&lsWidgets); + lsWidgets = 0; #endif #if defined(SDCARD) @@ -1534,6 +1535,11 @@ void opentxResume() TRACE("opentxResume"); sdMount(); +#if defined(COLORLCD) + // reload widgets + luaInitThemesAndWidgets(); +#endif + storageReadAll(); #if defined(COLORLCD)