Fixed memory leak in IdleRegister::destroy

This commit is contained in:
Alberto Griggio
2017-04-28 21:22:23 +02:00
parent 5d4bd4b352
commit d8e0207b9a

View File

@@ -43,20 +43,25 @@ IdleRegister::~IdleRegister()
destroy(); destroy();
} }
void IdleRegister::add(GSourceFunc function, gpointer data, gint priority)
{ namespace {
struct DataWrapper {
struct DataWrapper {
IdleRegister* const self; IdleRegister* const self;
GSourceFunc function; GSourceFunc function;
gpointer data; gpointer data;
}; };
} // namespace
void IdleRegister::add(GSourceFunc function, gpointer data, gint priority)
{
const auto dispatch = [](gpointer data) -> gboolean { const auto dispatch = [](gpointer data) -> gboolean {
DataWrapper* const data_wrapper = static_cast<DataWrapper*>(data); DataWrapper* const data_wrapper = static_cast<DataWrapper*>(data);
if (!data_wrapper->function(data_wrapper->data)) { if (!data_wrapper->function(data_wrapper->data)) {
data_wrapper->self->mutex.lock(); 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->ids.erase(data_wrapper);
data_wrapper->self->mutex.unlock(); data_wrapper->self->mutex.unlock();
@@ -83,6 +88,8 @@ void IdleRegister::destroy()
mutex.lock(); mutex.lock();
for (const auto id : ids) { for (const auto id : ids) {
g_source_remove(id.second); g_source_remove(id.second);
DataWrapper *w = static_cast<DataWrapper *>(id.first);
delete w;
} }
mutex.unlock(); mutex.unlock();
} }