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:
Eduardo Bart
2012-06-18 05:13:52 -03:00
parent f650b0e5bb
commit 1c7bbaea89
42 changed files with 326 additions and 81 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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));