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

View File

@ -41,6 +41,7 @@
#include "Qt/ConsoleUtilities.h"
#include "Qt/ConsoleWindow.h"
static bool memNeedsCheck = false;
static HexBookMarkManager_t hbm;
static std::list <HexEditorDialog_t*> winList;
static const char *memViewNames[] = { "RAM", "PPU", "OAM", "ROM", NULL };
@ -724,7 +725,12 @@ HexEditorDialog_t::HexEditorDialog_t(QWidget *parent)
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);
fceuWrapperUnLock();
populateBookmarkMenu();
@ -737,6 +743,11 @@ HexEditorDialog_t::~HexEditorDialog_t(void)
printf("Hex Editor Deleted\n");
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++)
{
if ( (*it) == this )
@ -746,6 +757,7 @@ HexEditorDialog_t::~HexEditorDialog_t(void)
break;
}
}
fceuWrapperUnLock();
}
//----------------------------------------------------------------------------
void HexEditorDialog_t::setWindowTitle(void)
@ -1103,7 +1115,18 @@ void HexEditorDialog_t::updatePeriodic(void)
{
//printf("Update Periodic\n");
editor->checkMemActivity();
if ( fceuWrapperTryLock(0) )
{
memNeedsCheck = false;
editor->checkMemActivity();
fceuWrapperUnLock();
}
else
{
memNeedsCheck = true;
}
editor->memModeUpdate();
@ -2009,6 +2032,9 @@ void QHexEdit::jumpToROM(void)
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 c;
@ -2442,3 +2468,20 @@ int hexEditorOpenFromDebugger( int mode, int addr )
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);
void hexEditorUpdateMemoryValues(void);
void hexEditorLoadBookmarks(void);
void hexEditorSaveBookmarks(void);
int hexEditorOpenFromDebugger( int mode, int addr );

View File

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