From d8e0207b9a2b3a38a68f6fec3633622b2b2b761d Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Fri, 28 Apr 2017 21:22:23 +0200 Subject: [PATCH] Fixed memory leak in IdleRegister::destroy --- rtgui/guiutils.cc | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index 01e95132b..977c07f42 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -43,20 +43,25 @@ IdleRegister::~IdleRegister() destroy(); } + +namespace { + +struct DataWrapper { + IdleRegister* const self; + GSourceFunc function; + gpointer data; +}; + +} // namespace + void IdleRegister::add(GSourceFunc function, gpointer data, gint priority) { - struct DataWrapper { - IdleRegister* const self; - GSourceFunc function; - gpointer data; - }; - const auto dispatch = [](gpointer data) -> gboolean { DataWrapper* const data_wrapper = static_cast(data); if (!data_wrapper->function(data_wrapper->data)) { data_wrapper->self->mutex.lock(); - g_source_remove(data_wrapper->self->ids[data_wrapper]); + //g_source_remove(data_wrapper->self->ids[data_wrapper]); data_wrapper->self->ids.erase(data_wrapper); data_wrapper->self->mutex.unlock(); @@ -83,6 +88,8 @@ void IdleRegister::destroy() mutex.lock(); for (const auto id : ids) { g_source_remove(id.second); + DataWrapper *w = static_cast(id.first); + delete w; } mutex.unlock(); }