Added logic to wait for trace logger disk thread to be ready for more data when logging to disk. This will slow down the realtime execution of the emulation but will ensure that all instructions are properly logged to the disk.

This commit is contained in:
mjbudd77 2021-04-25 23:28:51 -04:00
parent f146a7f7f1
commit 84b900b73b
1 changed files with 24 additions and 8 deletions

View File

@ -100,7 +100,7 @@ static int recBufMax = 0;
static int recBufHead = 0;
static int recBufTail = 0;
static traceRecord_t *logBuf = NULL;
static int logBufMax = 1000000;
static int logBufMax = 3000000;
static int logBufHead = 0;
static int logBufTail = 0;
static FILE *logFile = NULL;
@ -328,7 +328,7 @@ TraceLoggerDialog_t::~TraceLoggerDialog_t(void)
msleep(1);
diskThread->requestInterruption();
diskThread->quit();
diskThread->wait( 1000 );
diskThread->wait( 1000000 );
traceLogWindow = NULL;
@ -389,7 +389,7 @@ void TraceLoggerDialog_t::updatePeriodic(void)
overrunWarningArmed = true;
}
if (traceViewCounter > 20)
if (traceViewCounter > 5)
{
if (recBufHead != recbufHeadLp)
{
@ -522,7 +522,7 @@ void TraceLoggerDialog_t::openLogFile(void)
fclose(logFile);
logFile = NULL;
}
logFile = fopen(filename.toStdString().c_str(), "w");
logFile = fopen(filename.toStdString().c_str(), "wb");
return;
}
@ -1034,8 +1034,22 @@ static void pushToLogBuffer(traceRecord_t &rec)
if ( logBuf )
{
int nextHead, delayCount = 0;
logBuf[logBufHead] = rec;
logBufHead = (logBufHead + 1) % logBufMax;
nextHead = (logBufHead + 1) % logBufMax;
while (nextHead == logBufTail)
{
SDL_Delay(1);
delayCount++;
if ( delayCount > 10000 )
{
break;
}
}
logBufHead = nextHead;
if ( overrunWarningArmed )
{ // Don't spam with buffer overrun warning messages,
@ -2169,7 +2183,7 @@ void QTraceLogView::paintEvent(QPaintEvent *event)
TraceLogDiskThread_t::TraceLogDiskThread_t( QObject *parent )
: QThread(parent)
{
setPriority( QThread::HighestPriority );
}
//----------------------------------------------------
TraceLogDiskThread_t::~TraceLogDiskThread_t(void)
@ -2193,6 +2207,7 @@ void TraceLogDiskThread_t::run(void)
char line[256];
char buf[8192];
int i,idx=0;
int blockSize = 4 * 1024;
printf("Trace Log Disk Start\n");
@ -2228,12 +2243,13 @@ void TraceLogDiskThread_t::run(void)
logBufTail = (logBufTail + 1) % logBufMax;
if ( idx >= 4096 )
if ( idx >= blockSize )
{
fwrite( buf, idx, 1, logFile ); idx = 0;
//fflush(logFile);
}
}
SDL_Delay(10);
SDL_Delay(1);
}
if ( idx > 0 )