mirror of
https://github.com/edubart/otclient.git
synced 2025-10-20 06:23:26 +02:00
Fix memory leaks
* Fix recursive reference memory leak in UIWidget * Make Event/ScheduledEvent memory-leak safe * Fix exit crashs by freeing graphics resources before destroying GL context * Add many asserts to avoid any leak regression
This commit is contained in:
@@ -50,6 +50,9 @@ void UIManager::terminate()
|
||||
m_draggingWidget = nullptr;
|
||||
m_hoveredWidget = nullptr;
|
||||
m_pressedWidget = nullptr;
|
||||
m_styles.clear();
|
||||
m_destroyedWidgets.clear();
|
||||
m_checkEvent = nullptr;
|
||||
}
|
||||
|
||||
void UIManager::render(Fw::DrawPane drawPane)
|
||||
@@ -266,22 +269,19 @@ void UIManager::onWidgetDestroy(const UIWidgetPtr& widget)
|
||||
if(m_draggingWidget == widget)
|
||||
updateDraggingWidget(nullptr);
|
||||
|
||||
#ifdef DEBUG
|
||||
static UIWidgetList destroyedWidgets;
|
||||
static ScheduledEventPtr checkEvent;
|
||||
|
||||
if(widget == m_rootWidget)
|
||||
#ifndef DEBUG
|
||||
if(widget == m_rootWidget || !m_rootWidget)
|
||||
return;
|
||||
|
||||
destroyedWidgets.push_back(widget);
|
||||
m_destroyedWidgets.push_back(widget);
|
||||
|
||||
if(checkEvent && !checkEvent->isExecuted())
|
||||
if(m_checkEvent && !m_checkEvent->isExecuted())
|
||||
return;
|
||||
|
||||
checkEvent = g_eventDispatcher.scheduleEvent([] {
|
||||
m_checkEvent = g_eventDispatcher.scheduleEvent([] {
|
||||
g_lua.collectGarbage();
|
||||
UIWidgetList backupList = destroyedWidgets;
|
||||
destroyedWidgets.clear();
|
||||
UIWidgetList backupList = m_destroyedWidgets;
|
||||
m_destroyedWidgets.clear();
|
||||
g_eventDispatcher.scheduleEvent([backupList] {
|
||||
g_lua.collectGarbage();
|
||||
for(const UIWidgetPtr& widget : backupList) {
|
||||
|
@@ -82,6 +82,8 @@ private:
|
||||
Boolean<false> m_hoverUpdateScheduled;
|
||||
Boolean<false> m_drawDebugBoxes;
|
||||
std::unordered_map<std::string, OTMLNodePtr> m_styles;
|
||||
UIWidgetList m_destroyedWidgets;
|
||||
ScheduledEventPtr m_checkEvent;
|
||||
};
|
||||
|
||||
extern UIManager g_ui;
|
||||
|
@@ -46,6 +46,7 @@ UIWidget::UIWidget()
|
||||
|
||||
UIWidget::~UIWidget()
|
||||
{
|
||||
assert(!g_app->isTermianted());
|
||||
#ifdef DEBUG
|
||||
if(!m_destroyed)
|
||||
g_logger.warning(stdext::format("widget '%s' was not explicitly destroyed", m_id));
|
||||
|
Reference in New Issue
Block a user