Merge pull request #224 from mjbudd77/master

Bug fix for issue #217. The Qt hex editor memory reads are now synchr…
This commit is contained in:
mjbudd77 2020-11-03 07:05:46 -05:00 committed by GitHub
commit 9471ff5e7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 2 deletions

View File

@ -1427,9 +1427,9 @@ void ConsoleDebugger::reloadSymbolsCB(void)
{ {
fceuWrapperLock(); fceuWrapperLock();
debugSymbolTable.loadGameSymbols(); debugSymbolTable.loadGameSymbols();
fceuWrapperUnLock();
asmView->updateAssemblyView(); asmView->updateAssemblyView();
fceuWrapperUnLock();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void ConsoleDebugger::debugRunCB(void) void ConsoleDebugger::debugRunCB(void)
@ -2812,7 +2812,9 @@ void QAsmView::setDisplayROMoffsets( bool value )
{ {
displayROMoffsets = value; displayROMoffsets = value;
fceuWrapperLock();
updateAssemblyView(); updateAssemblyView();
fceuWrapperUnLock();
} }
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -2822,7 +2824,9 @@ void QAsmView::setSymbolDebugEnable( bool value )
{ {
symbolicDebugEnable = value; symbolicDebugEnable = value;
fceuWrapperLock();
updateAssemblyView(); updateAssemblyView();
fceuWrapperUnLock();
} }
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -2832,7 +2836,9 @@ void QAsmView::setRegisterNameEnable( bool value )
{ {
registerNameEnable = value; registerNameEnable = value;
fceuWrapperLock();
updateAssemblyView(); updateAssemblyView();
fceuWrapperUnLock();
} }
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -41,6 +41,7 @@
#include "Qt/ConsoleUtilities.h" #include "Qt/ConsoleUtilities.h"
#include "Qt/ConsoleWindow.h" #include "Qt/ConsoleWindow.h"
static bool memNeedsCheck = false;
static HexBookMarkManager_t hbm; static HexBookMarkManager_t hbm;
static std::list <HexEditorDialog_t*> winList; static std::list <HexEditorDialog_t*> winList;
static const char *memViewNames[] = { "RAM", "PPU", "OAM", "ROM", NULL }; static const char *memViewNames[] = { "RAM", "PPU", "OAM", "ROM", NULL };
@ -724,7 +725,12 @@ HexEditorDialog_t::HexEditorDialog_t(QWidget *parent)
periodicTimer->start( 100 ); // 10hz periodicTimer->start( 100 ); // 10hz
// Lock the mutex before adding a new window to the list,
// we want to be sure that the emulator is not iterating the list
// when we change it.
fceuWrapperLock();
winList.push_back(this); winList.push_back(this);
fceuWrapperUnLock();
populateBookmarkMenu(); populateBookmarkMenu();
@ -737,6 +743,11 @@ HexEditorDialog_t::~HexEditorDialog_t(void)
printf("Hex Editor Deleted\n"); printf("Hex Editor Deleted\n");
periodicTimer->stop(); periodicTimer->stop();
// Lock the emulation thread mutex to ensure
// that the emulator is not attempting to update memory values
// for window while we are destroying it or editing the window list.
fceuWrapperLock();
for (it = winList.begin(); it != winList.end(); it++) for (it = winList.begin(); it != winList.end(); it++)
{ {
if ( (*it) == this ) if ( (*it) == this )
@ -746,6 +757,7 @@ HexEditorDialog_t::~HexEditorDialog_t(void)
break; break;
} }
} }
fceuWrapperUnLock();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void HexEditorDialog_t::setWindowTitle(void) void HexEditorDialog_t::setWindowTitle(void)
@ -1103,7 +1115,18 @@ void HexEditorDialog_t::updatePeriodic(void)
{ {
//printf("Update Periodic\n"); //printf("Update Periodic\n");
editor->checkMemActivity(); if ( fceuWrapperTryLock(0) )
{
memNeedsCheck = false;
editor->checkMemActivity();
fceuWrapperUnLock();
}
else
{
memNeedsCheck = true;
}
editor->memModeUpdate(); editor->memModeUpdate();
@ -2009,6 +2032,9 @@ void QHexEdit::jumpToROM(void)
setAddr( jumpToRomValue ); setAddr( jumpToRomValue );
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// Calling of checkMemActivity must always be synchronized with the emulation
// thread as calling GetMem while the emulation is executing can mess up certain
// registers (especially controller registers $4016 and $4017)
int QHexEdit::checkMemActivity(void) int QHexEdit::checkMemActivity(void)
{ {
int c; int c;
@ -2442,3 +2468,20 @@ int hexEditorOpenFromDebugger( int mode, int addr )
return 0; return 0;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// This function must be called from within the emulation thread
void hexEditorUpdateMemoryValues(void)
{
std::list <HexEditorDialog_t*>::iterator it;
if ( !memNeedsCheck )
{
return;
}
for (it = winList.begin(); it != winList.end(); it++)
{
(*it)->editor->checkMemActivity();
}
memNeedsCheck = false;
}
//----------------------------------------------------------------------------

View File

@ -248,6 +248,7 @@ class HexEditorDialog_t : public QDialog
}; };
int hexEditorNumWindows(void); int hexEditorNumWindows(void);
void hexEditorUpdateMemoryValues(void);
void hexEditorLoadBookmarks(void); void hexEditorLoadBookmarks(void);
void hexEditorSaveBookmarks(void); void hexEditorSaveBookmarks(void);
int hexEditorOpenFromDebugger( int mode, int addr ); int hexEditorOpenFromDebugger( int mode, int addr );

View File

@ -1043,6 +1043,8 @@ int fceuWrapperUpdate( void )
{ {
DoFun(frameskip, periodic_saves); DoFun(frameskip, periodic_saves);
hexEditorUpdateMemoryValues();
fceuWrapperUnLock(); fceuWrapperUnLock();
emulatorHasMutux = 0; emulatorHasMutux = 0;