Memory leak in RefreshMapper, fixes #5323

This commit is contained in:
heckflosse 2019-05-18 18:44:06 +02:00
parent 351f8f4e12
commit 159e1784f4
3 changed files with 32 additions and 28 deletions

View File

@ -19,12 +19,13 @@
*/ */
#include "eventmapper.h" #include "eventmapper.h"
#include "multilangmgr.h"
ProcEventMapper::ProcEventMapper() ProcEventMapper::ProcEventMapper()
{ {
for (int event = 0; event < rtengine::NUMOFEVENTS; ++event) { for (int event = 0; event < rtengine::NUMOFEVENTS; ++event) {
history_msgs_[event] = "HISTORY_MSG_" + std::to_string(event + 1); history_msgs_[event] = M("HISTORY_MSG_" + std::to_string(event + 1));
} }
} }
@ -38,16 +39,22 @@ ProcEventMapper *ProcEventMapper::getInstance()
rtengine::ProcEvent ProcEventMapper::newEvent(int action, const std::string &history_msg) rtengine::ProcEvent ProcEventMapper::newEvent(int action, const std::string &history_msg)
{ {
std::string eventkey = std::to_string(action) + history_msg;
const auto ret = events_.find(eventkey);
if (ret == events_.end()) {
rtengine::ProcEvent event = rtengine::RefreshMapper::getInstance()->newEvent(); rtengine::ProcEvent event = rtengine::RefreshMapper::getInstance()->newEvent();
rtengine::RefreshMapper::getInstance()->mapEvent(event, action); rtengine::RefreshMapper::getInstance()->mapEvent(event, action);
events_.emplace(std::move(eventkey), event);
if (history_msg.empty()) { if (history_msg.empty()) {
history_msgs_[event] = "HISTORY_MSG_" + std::to_string(event + 1); history_msgs_[event] = M("HISTORY_MSG_" + std::to_string(event + 1));
} else { } else {
history_msgs_[event] = history_msg; history_msgs_[event] = M(history_msg);
} }
return event; return event;
} else {
return ret->second;
}
} }

View File

@ -20,6 +20,7 @@
#pragma once #pragma once
#include <string> #include <string>
#include <map>
#include <unordered_map> #include <unordered_map>
#include "../rtengine/refreshmap.h" #include "../rtengine/refreshmap.h"
@ -34,4 +35,5 @@ private:
ProcEventMapper(); ProcEventMapper();
std::unordered_map<int, std::string> history_msgs_; std::unordered_map<int, std::string> history_msgs_;
std::map<std::string, rtengine::ProcEvent> events_;
}; };

View File

@ -225,15 +225,14 @@ void History::procParamsChanged(
return; return;
} }
selchangehist.block (true); selchangehist.block(true);
selchangebm.block (true); selchangebm.block(true);
if (ev == EvPhotoLoaded) { if (ev == EvPhotoLoaded) {
initHistory (); initHistory();
} }
// construct formatted list content // construct formatted list content
Glib::ustring text = M(ProcEventMapper::getInstance()->getHistoryMsg(ev));
Glib::RefPtr<Gtk::TreeSelection> selection = hTreeView->get_selection(); Glib::RefPtr<Gtk::TreeSelection> selection = hTreeView->get_selection();
Gtk::TreeModel::iterator iter = selection->get_selected(); Gtk::TreeModel::iterator iter = selection->get_selected();
@ -243,12 +242,12 @@ void History::procParamsChanged(
++iter; ++iter;
while (iter) { while (iter) {
iter = historyModel->erase (iter); iter = historyModel->erase(iter);
} }
} }
// lookup the last remaining item in the list // lookup the last remaining item in the list
int size = historyModel->children().size (); const int size = historyModel->children().size();
Gtk::TreeModel::Row row; Gtk::TreeModel::Row row;
if (size > 0) { if (size > 0) {
@ -258,47 +257,43 @@ void History::procParamsChanged(
// if there is no last item or its chev!=ev, create a new one // if there is no last item or its chev!=ev, create a new one
if (size == 0 || !row || row[historyColumns.chev] != ev || ev == EvProfileChanged) { if (size == 0 || !row || row[historyColumns.chev] != ev || ev == EvProfileChanged) {
Gtk::TreeModel::Row newrow = *(historyModel->append()); Gtk::TreeModel::Row newrow = *(historyModel->append());
newrow[historyColumns.text] = text; newrow[historyColumns.text] = ProcEventMapper::getInstance()->getHistoryMsg(ev);
newrow[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1); newrow[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1);
newrow[historyColumns.chev] = ev; newrow[historyColumns.chev] = ev;
newrow[historyColumns.params] = *params; newrow[historyColumns.params] = *params;
newrow[historyColumns.paramsEdited] = paramsEdited ? *paramsEdited : defParamsEdited; newrow[historyColumns.paramsEdited] = paramsEdited ? *paramsEdited : defParamsEdited;
if (ev != EvBookmarkSelected) { if (ev != EvBookmarkSelected) {
selection->select (newrow); selection->select(newrow);
} }
if (blistener && row && !blistenerLock) { if (blistener && row && !blistenerLock) {
blistener->historyBeforeLineChanged (row[historyColumns.params]); blistener->historyBeforeLineChanged(row[historyColumns.params]);
} else if (blistener && size == 0 && !blistenerLock) { } else if (blistener && size == 0 && !blistenerLock) {
blistener->historyBeforeLineChanged (newrow[historyColumns.params]); blistener->historyBeforeLineChanged(newrow[historyColumns.params]);
} }
} } else { // else just update it
// else just update it
else {
row[historyColumns.text] = text;
row[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1); row[historyColumns.value] = g_markup_escape_text(descr.c_str(), -1);
row[historyColumns.chev] = ev;
row[historyColumns.params] = *params; row[historyColumns.params] = *params;
row[historyColumns.paramsEdited] = paramsEdited ? *paramsEdited : defParamsEdited; row[historyColumns.paramsEdited] = paramsEdited ? *paramsEdited : defParamsEdited;
if (ev != EvBookmarkSelected) { if (ev != EvBookmarkSelected) {
selection->select (row); selection->select(row);
} }
} }
if (ev != EvBookmarkSelected) { if (ev != EvBookmarkSelected) {
bTreeView->get_selection()->unselect_all (); bTreeView->get_selection()->unselect_all();
} }
if (!selection->get_selected_rows().empty()) { if (!selection->get_selected_rows().empty()) {
std::vector<Gtk::TreeModel::Path> selp = selection->get_selected_rows(); std::vector<Gtk::TreeModel::Path> selp = selection->get_selected_rows();
hTreeView->scroll_to_row (*selp.begin()); hTreeView->scroll_to_row(*selp.begin());
} }
selchangehist.block (false); selchangehist.block(false);
selchangebm.block (false); selchangebm.block(false);
} }
void History::clearParamChanges () void History::clearParamChanges ()