From 35704b5ad4241167afead2c66771e5f4f9e20981 Mon Sep 17 00:00:00 2001 From: Andrew Gardner Date: Tue, 4 Jun 2013 06:37:27 +0000 Subject: [PATCH] Qt Debugger: The MAME memory tracking system no longer double-frees closed QT windows. Also fixes the font segfault on exit again. (nw, but thanks Carl) --- src/osd/sdl/debugqt.c | 61 ++++++++++++++++++------------- src/osd/sdl/debugqtdasmwindow.c | 7 ++++ src/osd/sdl/debugqtdasmwindow.h | 2 +- src/osd/sdl/debugqtlogwindow.c | 7 ++++ src/osd/sdl/debugqtlogwindow.h | 2 +- src/osd/sdl/debugqtmainwindow.c | 8 ++++ src/osd/sdl/debugqtmainwindow.h | 2 +- src/osd/sdl/debugqtmemorywindow.c | 7 ++++ src/osd/sdl/debugqtmemorywindow.h | 2 +- src/osd/sdl/debugqtview.c | 5 ++- src/osd/sdl/debugqtwindow.c | 9 +++-- src/osd/sdl/debugqtwindow.h | 3 +- 12 files changed, 80 insertions(+), 35 deletions(-) diff --git a/src/osd/sdl/debugqt.c b/src/osd/sdl/debugqt.c index 5d2dea41bfe..3e567778015 100644 --- a/src/osd/sdl/debugqt.c +++ b/src/osd/sdl/debugqt.c @@ -11,6 +11,10 @@ #if !defined(NO_DEBUGGER) +#define NO_MEM_TRACKING + +#include + #include #include @@ -47,7 +51,7 @@ MainWindow* mainQtWindow = NULL; //============================================================ // Global variable used to feed the xml configuration callbacks -simple_list xmlConfigurations; +std::vector xmlConfigurations; static void xml_configuration_load(running_machine &machine, int config_type, xml_data_node *parentnode) @@ -60,23 +64,24 @@ static void xml_configuration_load(running_machine &machine, int config_type, xm if (parentnode == NULL) return; - xmlConfigurations.reset(); + for (int i = 0; i < xmlConfigurations.size(); i++) + delete xmlConfigurations[i]; + xmlConfigurations.clear(); // Configuration load xml_data_node* wnode = NULL; for (wnode = xml_get_sibling(parentnode->child, "window"); wnode != NULL; wnode = xml_get_sibling(wnode->next, "window")) { - WindowQtConfig* config = NULL; WindowQtConfig::WindowType type = (WindowQtConfig::WindowType)xml_get_attribute_int(wnode, "type", WindowQtConfig::WIN_TYPE_UNKNOWN); switch (type) { - case WindowQtConfig::WIN_TYPE_MAIN: config = &xmlConfigurations.append(*global_alloc(MainWindowQtConfig)); break; - case WindowQtConfig::WIN_TYPE_MEMORY: config = &xmlConfigurations.append(*global_alloc(MemoryWindowQtConfig)); break; - case WindowQtConfig::WIN_TYPE_DASM: config = &xmlConfigurations.append(*global_alloc(DasmWindowQtConfig)); break; - case WindowQtConfig::WIN_TYPE_LOG: config = &xmlConfigurations.append(*global_alloc(LogWindowQtConfig)); break; - default: break; + case WindowQtConfig::WIN_TYPE_MAIN: xmlConfigurations.push_back(new MainWindowQtConfig()); break; + case WindowQtConfig::WIN_TYPE_MEMORY: xmlConfigurations.push_back(new MemoryWindowQtConfig()); break; + case WindowQtConfig::WIN_TYPE_DASM: xmlConfigurations.push_back(new DasmWindowQtConfig()); break; + case WindowQtConfig::WIN_TYPE_LOG: xmlConfigurations.push_back(new LogWindowQtConfig()); break; + default: continue; } - config->recoverFromXmlNode(wnode); + xmlConfigurations.back()->recoverFromXmlNode(wnode); } } @@ -87,8 +92,10 @@ static void xml_configuration_save(running_machine &machine, int config_type, xm if (config_type != CONFIG_TYPE_GAME) return; - for (WindowQtConfig* config = xmlConfigurations.first(); config != NULL; config = config->next()) - { + for (int i = 0; i < xmlConfigurations.size(); i++) + { + WindowQtConfig* config = xmlConfigurations[i]; + // Create an xml node xml_data_node *debugger_node; debugger_node = xml_add_child(parentnode, "window", NULL); @@ -103,7 +110,9 @@ static void xml_configuration_save(running_machine &machine, int config_type, xm static void gather_save_configurations() { - xmlConfigurations.reset(); + for (int i = 0; i < xmlConfigurations.size(); i++) + delete xmlConfigurations[i]; + xmlConfigurations.clear(); // Loop over all the open windows foreach (QWidget* widget, QApplication::topLevelWidgets()) @@ -115,17 +124,16 @@ static void gather_save_configurations() continue; // Figure out its type - WindowQtConfig* config = NULL; if (dynamic_cast(widget)) - config = &xmlConfigurations.append(*global_alloc(MainWindowQtConfig)); + xmlConfigurations.push_back(new MainWindowQtConfig()); else if (dynamic_cast(widget)) - config = &xmlConfigurations.append(*global_alloc(MemoryWindowQtConfig)); + xmlConfigurations.push_back(new MemoryWindowQtConfig()); else if (dynamic_cast(widget)) - config = &xmlConfigurations.append(*global_alloc(DasmWindowQtConfig)); + xmlConfigurations.push_back(new DasmWindowQtConfig()); else if (dynamic_cast(widget)) - config = &xmlConfigurations.append(*global_alloc(LogWindowQtConfig)); + xmlConfigurations.push_back(new LogWindowQtConfig()); - config->buildFromQWidget(widget); + xmlConfigurations.back()->buildFromQWidget(widget); } } @@ -134,24 +142,27 @@ static void gather_save_configurations() // Utilities //============================================================ -static void load_and_clear_main_window_config(simple_list& configList) +static void load_and_clear_main_window_config(std::vector& configList) { - for (WindowQtConfig* config = xmlConfigurations.first(); config != NULL; config = config->next()) + for (int i = 0; i < configList.size(); i++) { + WindowQtConfig* config = configList[i]; if (config->m_type == WindowQtConfig::WIN_TYPE_MAIN) { config->applyToQWidget(mainQtWindow); - configList.remove(*config); + configList.erase(configList.begin()+i); break; } } } -static void setup_additional_startup_windows(running_machine& machine, simple_list& configList) +static void setup_additional_startup_windows(running_machine& machine, std::vector& configList) { - for (WindowQtConfig* config = xmlConfigurations.first(); config != NULL; config = config->next()) - { + for (int i = 0; i < configList.size(); i++) + { + WindowQtConfig* config = configList[i]; + WindowQt* foo = NULL; switch (config->m_type) { @@ -222,7 +233,7 @@ extern int sdl_entered_debugger; void xxx_osd_interface::wait_for_debugger(device_t &device, bool firststop) { -#if defined(SDL) +#ifdef SDLMAME_UNIX sdl_entered_debugger = 1; #endif diff --git a/src/osd/sdl/debugqtdasmwindow.c b/src/osd/sdl/debugqtdasmwindow.c index 405d34eef44..11ad76b8782 100644 --- a/src/osd/sdl/debugqtdasmwindow.c +++ b/src/osd/sdl/debugqtdasmwindow.c @@ -1,3 +1,5 @@ +#define NO_MEM_TRACKING + #include "debugqtdasmwindow.h" #include "debug/debugcon.h" @@ -102,6 +104,11 @@ DasmWindow::DasmWindow(running_machine* machine, QWidget* parent) : } +DasmWindow::~DasmWindow() +{ +} + + void DasmWindow::cpuChanged(int index) { m_dasmView->view()->set_source(*m_dasmView->view()->source_list().by_index(index)); diff --git a/src/osd/sdl/debugqtdasmwindow.h b/src/osd/sdl/debugqtdasmwindow.h index f723fad55dc..7b31b676678 100644 --- a/src/osd/sdl/debugqtdasmwindow.h +++ b/src/osd/sdl/debugqtdasmwindow.h @@ -16,7 +16,7 @@ class DasmWindow : public WindowQt public: DasmWindow(running_machine* machine, QWidget* parent=NULL); - virtual ~DasmWindow() {} + virtual ~DasmWindow(); private slots: diff --git a/src/osd/sdl/debugqtlogwindow.c b/src/osd/sdl/debugqtlogwindow.c index 2961905adf8..d9bc1e12b51 100644 --- a/src/osd/sdl/debugqtlogwindow.c +++ b/src/osd/sdl/debugqtlogwindow.c @@ -1,3 +1,5 @@ +#define NO_MEM_TRACKING + #include "debugqtlogwindow.h" #include "debug/debugcon.h" @@ -36,6 +38,11 @@ LogWindow::LogWindow(running_machine* machine, QWidget* parent) : } +LogWindow::~LogWindow() +{ +} + + //========================================================================= // LogWindowQtConfig //========================================================================= diff --git a/src/osd/sdl/debugqtlogwindow.h b/src/osd/sdl/debugqtlogwindow.h index 812da3715ad..e936a5ae647 100644 --- a/src/osd/sdl/debugqtlogwindow.h +++ b/src/osd/sdl/debugqtlogwindow.h @@ -16,7 +16,7 @@ class LogWindow : public WindowQt public: LogWindow(running_machine* machine, QWidget* parent=NULL); - virtual ~LogWindow() {} + virtual ~LogWindow(); private: diff --git a/src/osd/sdl/debugqtmainwindow.c b/src/osd/sdl/debugqtmainwindow.c index 3cb65c8ed28..3ed8ebac447 100644 --- a/src/osd/sdl/debugqtmainwindow.c +++ b/src/osd/sdl/debugqtmainwindow.c @@ -1,4 +1,7 @@ +#define NO_MEM_TRACKING + #include "debugqtmainwindow.h" + #include "debug/debugcon.h" #include "debug/debugcpu.h" #include "debug/dvdisasm.h" @@ -112,6 +115,11 @@ MainWindow::MainWindow(running_machine* machine, QWidget* parent) : } +MainWindow::~MainWindow() +{ +} + + void MainWindow::setProcessor(device_t* processor) { // Cpu swap diff --git a/src/osd/sdl/debugqtmainwindow.h b/src/osd/sdl/debugqtmainwindow.h index 513e2dd3e1b..fd1432d5b92 100644 --- a/src/osd/sdl/debugqtmainwindow.h +++ b/src/osd/sdl/debugqtmainwindow.h @@ -22,7 +22,7 @@ class MainWindow : public WindowQt public: MainWindow(running_machine* machine, QWidget* parent=NULL); - virtual ~MainWindow() {} + virtual ~MainWindow(); void setProcessor(device_t* processor); diff --git a/src/osd/sdl/debugqtmemorywindow.c b/src/osd/sdl/debugqtmemorywindow.c index 1297d787266..5612bb55328 100644 --- a/src/osd/sdl/debugqtmemorywindow.c +++ b/src/osd/sdl/debugqtmemorywindow.c @@ -1,3 +1,5 @@ +#define NO_MEM_TRACKING + #include "debugqtmemorywindow.h" #include "debug/dvmemory.h" @@ -127,6 +129,11 @@ MemoryWindow::MemoryWindow(running_machine* machine, QWidget* parent) : } +MemoryWindow::~MemoryWindow() +{ +} + + void MemoryWindow::memoryRegionChanged(int index) { m_memTable->view()->set_source(*m_memTable->view()->source_list().by_index(index)); diff --git a/src/osd/sdl/debugqtmemorywindow.h b/src/osd/sdl/debugqtmemorywindow.h index b48ea03645c..1f97c414eee 100644 --- a/src/osd/sdl/debugqtmemorywindow.h +++ b/src/osd/sdl/debugqtmemorywindow.h @@ -18,7 +18,7 @@ class MemoryWindow : public WindowQt public: MemoryWindow(running_machine* machine, QWidget* parent=NULL); - virtual ~MemoryWindow() {} + virtual ~MemoryWindow(); private slots: diff --git a/src/osd/sdl/debugqtview.c b/src/osd/sdl/debugqtview.c index bafbe3ebe18..c19d908d76b 100644 --- a/src/osd/sdl/debugqtview.c +++ b/src/osd/sdl/debugqtview.c @@ -1,4 +1,4 @@ -#include +#define NO_MEM_TRACKING #include "debugqtview.h" @@ -214,6 +214,9 @@ void DebuggerView::keyPressEvent(QKeyEvent* event) void DebuggerView::mousePressEvent(QMouseEvent* event) { + if (m_view == NULL) + return; + if (event->button() == Qt::LeftButton) { QFontMetrics actualFont = fontMetrics(); diff --git a/src/osd/sdl/debugqtwindow.c b/src/osd/sdl/debugqtwindow.c index 2919c6f34c4..af2c98a41c7 100644 --- a/src/osd/sdl/debugqtwindow.c +++ b/src/osd/sdl/debugqtwindow.c @@ -1,7 +1,4 @@ -#include - -#include "emu.h" -#include "debugger.h" +#define NO_MEM_TRACKING #include "debugqtwindow.h" #include "debugqtlogwindow.h" @@ -108,6 +105,10 @@ WindowQt::WindowQt(running_machine* machine, QWidget* parent) : } +WindowQt::~WindowQt() +{ +} + void WindowQt::debugActOpenMemory() { MemoryWindow* foo = new MemoryWindow(m_machine, this); diff --git a/src/osd/sdl/debugqtwindow.h b/src/osd/sdl/debugqtwindow.h index 9ae0852d3a3..1819548a296 100644 --- a/src/osd/sdl/debugqtwindow.h +++ b/src/osd/sdl/debugqtwindow.h @@ -5,6 +5,7 @@ #include "emu.h" #include "config.h" +#include "debugger.h" //============================================================ @@ -16,7 +17,7 @@ class WindowQt : public QMainWindow public: WindowQt(running_machine* machine, QWidget* parent=NULL); - virtual ~WindowQt() {} + virtual ~WindowQt(); // The interface to an all-window refresh void refreshAll() { s_refreshAll = true; }