Moved time stamp functions to its own file. Use new common time stamp functions in Qt GUI timing.
This commit is contained in:
parent
a20f6f559b
commit
e597f6a4a3
|
@ -527,6 +527,7 @@ set(SRC_CORE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/utils/md5.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/utils/md5.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/utils/memory.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/utils/memory.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/utils/mutex.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/utils/mutex.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/utils/timeStamp.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
#include "../../profiler.h"
|
#include "../../profiler.h"
|
||||||
#include "../../version.h"
|
#include "../../version.h"
|
||||||
#include "common/os_utils.h"
|
#include "common/os_utils.h"
|
||||||
|
#include "utils/timeStamp.h"
|
||||||
|
|
||||||
#ifdef _S9XLUA_H
|
#ifdef _S9XLUA_H
|
||||||
#include "../../fceulua.h"
|
#include "../../fceulua.h"
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include "Qt/sdl.h"
|
#include "Qt/sdl.h"
|
||||||
#include "Qt/throttle.h"
|
#include "Qt/throttle.h"
|
||||||
|
#include "utils/timeStamp.h"
|
||||||
|
|
||||||
#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
@ -60,21 +61,22 @@ extern bool turbo;
|
||||||
|
|
||||||
double getHighPrecTimeStamp(void)
|
double getHighPrecTimeStamp(void)
|
||||||
{
|
{
|
||||||
#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
|
||||||
struct timespec ts;
|
|
||||||
double t;
|
double t;
|
||||||
|
|
||||||
clock_gettime( CLOCK_REALTIME, &ts );
|
if (FCEU::timeStampModuleInitialized())
|
||||||
|
{
|
||||||
|
FCEU::timeStampRecord ts;
|
||||||
|
|
||||||
t = (double)ts.tv_sec + (double)(ts.tv_nsec * 1.0e-9);
|
ts.readNew();
|
||||||
#else
|
|
||||||
double t;
|
|
||||||
|
|
||||||
|
t = ts.toSeconds();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
t = (double)SDL_GetTicks();
|
t = (double)SDL_GetTicks();
|
||||||
|
|
||||||
t = t * 1e-3;
|
t = t * 1e-3;
|
||||||
#endif
|
}
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,18 +27,10 @@
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "utils/mutex.h"
|
#include "utils/mutex.h"
|
||||||
#include "fceu.h"
|
#include "fceu.h"
|
||||||
#include "profiler.h"
|
#include "profiler.h"
|
||||||
|
|
||||||
#if defined(WIN32)
|
|
||||||
#include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace FCEU
|
namespace FCEU
|
||||||
{
|
{
|
||||||
static thread_local profileExecVector execList;
|
static thread_local profileExecVector execList;
|
||||||
|
@ -48,71 +40,6 @@ FILE *profilerManager::pLog = nullptr;
|
||||||
|
|
||||||
static profilerManager pMgr;
|
static profilerManager pMgr;
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
//---- Time Stamp Record
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
#if defined(WIN32)
|
|
||||||
uint64_t timeStampRecord::qpcFreq = 0;
|
|
||||||
#include <intrin.h>
|
|
||||||
#pragma intrinsic(__rdtsc)
|
|
||||||
#else
|
|
||||||
#include <x86intrin.h>
|
|
||||||
#endif
|
|
||||||
uint64_t timeStampRecord::tscFreq = 0;
|
|
||||||
|
|
||||||
static uint64_t rdtsc()
|
|
||||||
{
|
|
||||||
return __rdtsc();
|
|
||||||
}
|
|
||||||
|
|
||||||
void timeStampRecord::readNew(void)
|
|
||||||
{
|
|
||||||
#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
|
||||||
clock_gettime( CLOCK_REALTIME, &ts );
|
|
||||||
#else
|
|
||||||
QueryPerformanceCounter((LARGE_INTEGER*)&ts);
|
|
||||||
#endif
|
|
||||||
tsc = rdtsc();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void calibrateTSC(void)
|
|
||||||
{
|
|
||||||
constexpr int numSamples = 1;
|
|
||||||
timeStampRecord t1, t2, td;
|
|
||||||
uint64_t td_sum = 0;
|
|
||||||
double td_avg;
|
|
||||||
|
|
||||||
#if defined(WIN32)
|
|
||||||
if (QueryPerformanceFrequency((LARGE_INTEGER*)&timeStampRecord::qpcFreq) == 0)
|
|
||||||
{
|
|
||||||
printf("QueryPerformanceFrequency FAILED!\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
FCEU_printf("Running TSC Calibration: %i sec...\n", numSamples);
|
|
||||||
|
|
||||||
for (int i=0; i<numSamples; i++)
|
|
||||||
{
|
|
||||||
t1.readNew();
|
|
||||||
#if defined(WIN32)
|
|
||||||
Sleep(1000);
|
|
||||||
#else
|
|
||||||
sleep(1);
|
|
||||||
#endif
|
|
||||||
t2.readNew();
|
|
||||||
|
|
||||||
td += t2 - t1;
|
|
||||||
|
|
||||||
td_sum = td.tsc;
|
|
||||||
|
|
||||||
td_avg = static_cast<double>(td_sum);
|
|
||||||
|
|
||||||
timeStampRecord::tscFreq = static_cast<uint64_t>( td_avg / td.toSeconds() );
|
|
||||||
|
|
||||||
FCEU_printf("%i Calibration: %f sec TSC:%llu TSC Freq: %f MHz\n", i, td.toSeconds(),
|
|
||||||
static_cast<unsigned long long>(td.tsc), static_cast<double>(timeStampRecord::tscFreq) * 1.0e-6 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
//---- Function Profile Record
|
//---- Function Profile Record
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
@ -371,8 +298,6 @@ profilerManager* profilerManager::getInstance(void)
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
profilerManager::profilerManager(void)
|
profilerManager::profilerManager(void)
|
||||||
{
|
{
|
||||||
calibrateTSC();
|
|
||||||
|
|
||||||
//printf("profilerManager Constructor\n");
|
//printf("profilerManager Constructor\n");
|
||||||
if (pLog == nullptr)
|
if (pLog == nullptr)
|
||||||
{
|
{
|
||||||
|
|
192
src/profiler.h
192
src/profiler.h
|
@ -45,200 +45,10 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "utils/mutex.h"
|
#include "utils/mutex.h"
|
||||||
|
#include "utils/timeStamp.h"
|
||||||
|
|
||||||
namespace FCEU
|
namespace FCEU
|
||||||
{
|
{
|
||||||
struct timeStampRecord
|
|
||||||
{
|
|
||||||
#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
|
||||||
struct timespec ts;
|
|
||||||
uint64_t tsc;
|
|
||||||
|
|
||||||
timeStampRecord(void)
|
|
||||||
{
|
|
||||||
ts.tv_sec = 0;
|
|
||||||
ts.tv_nsec = 0;
|
|
||||||
tsc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeStampRecord& operator = (const timeStampRecord& in)
|
|
||||||
{
|
|
||||||
ts = in.ts;
|
|
||||||
tsc = in.tsc;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeStampRecord& operator += (const timeStampRecord& op)
|
|
||||||
{
|
|
||||||
ts.tv_sec += op.ts.tv_sec;
|
|
||||||
ts.tv_nsec += op.ts.tv_nsec;
|
|
||||||
|
|
||||||
if (ts.tv_nsec >= 1000000000)
|
|
||||||
{
|
|
||||||
ts.tv_nsec -= 1000000000;
|
|
||||||
ts.tv_sec++;
|
|
||||||
}
|
|
||||||
tsc += op.tsc;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeStampRecord operator + (const timeStampRecord& op)
|
|
||||||
{
|
|
||||||
timeStampRecord res;
|
|
||||||
|
|
||||||
res.ts.tv_sec = ts.tv_sec + op.ts.tv_sec;
|
|
||||||
res.ts.tv_nsec = ts.tv_nsec + op.ts.tv_nsec;
|
|
||||||
|
|
||||||
if (res.ts.tv_nsec >= 1000000000)
|
|
||||||
{
|
|
||||||
res.ts.tv_nsec -= 1000000000;
|
|
||||||
res.ts.tv_sec++;
|
|
||||||
}
|
|
||||||
res.tsc = tsc + op.tsc;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeStampRecord operator - (const timeStampRecord& op)
|
|
||||||
{
|
|
||||||
timeStampRecord res;
|
|
||||||
|
|
||||||
res.ts.tv_sec = ts.tv_sec - op.ts.tv_sec;
|
|
||||||
res.ts.tv_nsec = ts.tv_nsec - op.ts.tv_nsec;
|
|
||||||
|
|
||||||
if (res.ts.tv_nsec < 0)
|
|
||||||
{
|
|
||||||
res.ts.tv_nsec += 1000000000;
|
|
||||||
res.ts.tv_sec--;
|
|
||||||
}
|
|
||||||
res.tsc = tsc - op.tsc;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator > (const timeStampRecord& op)
|
|
||||||
{
|
|
||||||
bool res = false;
|
|
||||||
if (ts.tv_sec == op.ts.tv_sec)
|
|
||||||
{
|
|
||||||
res = (ts.tv_nsec > op.ts.tv_nsec);
|
|
||||||
}
|
|
||||||
else if (ts.tv_sec > op.ts.tv_sec)
|
|
||||||
{
|
|
||||||
res = true;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator < (const timeStampRecord& op)
|
|
||||||
{
|
|
||||||
bool res = false;
|
|
||||||
if (ts.tv_sec == op.ts.tv_sec)
|
|
||||||
{
|
|
||||||
res = (ts.tv_nsec < op.ts.tv_nsec);
|
|
||||||
}
|
|
||||||
else if (ts.tv_sec < op.ts.tv_sec)
|
|
||||||
{
|
|
||||||
res = true;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
void zero(void)
|
|
||||||
{
|
|
||||||
ts.tv_sec = 0;
|
|
||||||
ts.tv_nsec = 0;
|
|
||||||
tsc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fromSeconds(unsigned int sec)
|
|
||||||
{
|
|
||||||
ts.tv_sec = sec;
|
|
||||||
ts.tv_nsec = 0;
|
|
||||||
tsc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
double toSeconds(void)
|
|
||||||
{
|
|
||||||
double sec = static_cast<double>(ts.tv_sec) + ( static_cast<double>(ts.tv_nsec) * 1.0e-9 );
|
|
||||||
return sec;
|
|
||||||
}
|
|
||||||
#else // WIN32
|
|
||||||
uint64_t ts;
|
|
||||||
uint64_t tsc;
|
|
||||||
|
|
||||||
timeStampRecord(void)
|
|
||||||
{
|
|
||||||
ts = 0;
|
|
||||||
tsc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeStampRecord& operator = (const timeStampRecord& in)
|
|
||||||
{
|
|
||||||
ts = in.ts;
|
|
||||||
tsc = in.tsc;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeStampRecord& operator += (const timeStampRecord& op)
|
|
||||||
{
|
|
||||||
ts += op.ts;
|
|
||||||
tsc += op.tsc;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeStampRecord operator + (const timeStampRecord& op)
|
|
||||||
{
|
|
||||||
timeStampRecord res;
|
|
||||||
|
|
||||||
res.ts = ts + op.ts;
|
|
||||||
res.tsc = tsc + op.tsc;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeStampRecord operator - (const timeStampRecord& op)
|
|
||||||
{
|
|
||||||
timeStampRecord res;
|
|
||||||
|
|
||||||
res.ts = ts - op.ts;
|
|
||||||
res.tsc = tsc - op.tsc;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator > (const timeStampRecord& op)
|
|
||||||
{
|
|
||||||
return ts > op.ts;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator < (const timeStampRecord& op)
|
|
||||||
{
|
|
||||||
return ts < op.ts;
|
|
||||||
}
|
|
||||||
|
|
||||||
void zero(void)
|
|
||||||
{
|
|
||||||
ts = 0;
|
|
||||||
tsc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fromSeconds(unsigned int sec)
|
|
||||||
{
|
|
||||||
ts = sec * qpcFreq;
|
|
||||||
tsc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
double toSeconds(void)
|
|
||||||
{
|
|
||||||
double sec = static_cast<double>(ts) / static_cast<double>(qpcFreq);
|
|
||||||
return sec;
|
|
||||||
}
|
|
||||||
static uint64_t qpcFreq;
|
|
||||||
#endif
|
|
||||||
static uint64_t tscFreq;
|
|
||||||
|
|
||||||
void readNew(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct funcProfileRecord
|
struct funcProfileRecord
|
||||||
{
|
{
|
||||||
const int fileLineNum;
|
const int fileLineNum;
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
// timeStamp.cpp
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "timeStamp.h"
|
||||||
|
|
||||||
|
#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WIN32)
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
//---- Time Stamp Record
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
#if defined(WIN32)
|
||||||
|
uint64_t timeStampRecord::qpcFreq = 0;
|
||||||
|
#include <intrin.h>
|
||||||
|
#pragma intrinsic(__rdtsc)
|
||||||
|
#else
|
||||||
|
#include <x86intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static uint64_t rdtsc()
|
||||||
|
{
|
||||||
|
return __rdtsc();
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace FCEU
|
||||||
|
{
|
||||||
|
|
||||||
|
uint64_t timeStampRecord::tscFreq = 0;
|
||||||
|
|
||||||
|
void timeStampRecord::readNew(void)
|
||||||
|
{
|
||||||
|
#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
||||||
|
clock_gettime( CLOCK_REALTIME, &ts );
|
||||||
|
#else
|
||||||
|
QueryPerformanceCounter((LARGE_INTEGER*)&ts);
|
||||||
|
#endif
|
||||||
|
tsc = rdtsc();
|
||||||
|
}
|
||||||
|
|
||||||
|
static timeStampRecord cal_t1, cal_t2, cal_td;
|
||||||
|
|
||||||
|
class timeStampModule
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
timeStampModule(void)
|
||||||
|
{
|
||||||
|
printf("timeStampModuleInit\n");
|
||||||
|
#if defined(WIN32)
|
||||||
|
if (QueryPerformanceFrequency((LARGE_INTEGER*)&StampRecord::qpcFreq) == 0)
|
||||||
|
{
|
||||||
|
printf("QueryPerformanceFrequency FAILED!\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static timeStampModule module;
|
||||||
|
|
||||||
|
bool timeStampModuleInitialized(void)
|
||||||
|
{
|
||||||
|
bool initialized = false;
|
||||||
|
#if defined(WIN32)
|
||||||
|
initialized = timeStampRecord::qpcFreq != 0;
|
||||||
|
#else
|
||||||
|
initialized = true;
|
||||||
|
#endif
|
||||||
|
return initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
void timeStampModuleCalibrate(int numSamples)
|
||||||
|
{
|
||||||
|
timeStampRecord t1, t2, td;
|
||||||
|
uint64_t td_sum = 0;
|
||||||
|
double td_avg;
|
||||||
|
|
||||||
|
#if defined(WIN32)
|
||||||
|
if (QueryPerformanceFrequency((LARGE_INTEGER*)&timeStampRecord::qpcFreq) == 0)
|
||||||
|
{
|
||||||
|
printf("QueryPerformanceFrequency FAILED!\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
printf("Running TSC Calibration: %i sec...\n", numSamples);
|
||||||
|
|
||||||
|
for (int i=0; i<numSamples; i++)
|
||||||
|
{
|
||||||
|
t1.readNew();
|
||||||
|
#if defined(WIN32)
|
||||||
|
Sleep(1000);
|
||||||
|
#else
|
||||||
|
sleep(1);
|
||||||
|
#endif
|
||||||
|
t2.readNew();
|
||||||
|
|
||||||
|
td += t2 - t1;
|
||||||
|
|
||||||
|
td_sum = td.tsc;
|
||||||
|
|
||||||
|
td_avg = static_cast<double>(td_sum);
|
||||||
|
|
||||||
|
timeStampRecord::tscFreq = static_cast<uint64_t>( td_avg / td.toSeconds() );
|
||||||
|
|
||||||
|
printf("%i Calibration: %f sec TSC:%llu TSC Freq: %f MHz\n", i, td.toSeconds(),
|
||||||
|
static_cast<unsigned long long>(td.tsc), static_cast<double>(timeStampRecord::tscFreq) * 1.0e-6 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace FCEU
|
|
@ -0,0 +1,231 @@
|
||||||
|
// timeStamp.h
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace FCEU
|
||||||
|
{
|
||||||
|
struct timeStampRecord
|
||||||
|
{
|
||||||
|
#if defined(__linux__) || defined(__APPLE__) || defined(__unix__)
|
||||||
|
struct timespec ts;
|
||||||
|
uint64_t tsc;
|
||||||
|
|
||||||
|
timeStampRecord(void)
|
||||||
|
{
|
||||||
|
ts.tv_sec = 0;
|
||||||
|
ts.tv_nsec = 0;
|
||||||
|
tsc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeStampRecord& operator = (const timeStampRecord& in)
|
||||||
|
{
|
||||||
|
ts = in.ts;
|
||||||
|
tsc = in.tsc;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeStampRecord& operator += (const timeStampRecord& op)
|
||||||
|
{
|
||||||
|
ts.tv_sec += op.ts.tv_sec;
|
||||||
|
ts.tv_nsec += op.ts.tv_nsec;
|
||||||
|
|
||||||
|
if (ts.tv_nsec >= 1000000000)
|
||||||
|
{
|
||||||
|
ts.tv_nsec -= 1000000000;
|
||||||
|
ts.tv_sec++;
|
||||||
|
}
|
||||||
|
tsc += op.tsc;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeStampRecord operator + (const timeStampRecord& op)
|
||||||
|
{
|
||||||
|
timeStampRecord res;
|
||||||
|
|
||||||
|
res.ts.tv_sec = ts.tv_sec + op.ts.tv_sec;
|
||||||
|
res.ts.tv_nsec = ts.tv_nsec + op.ts.tv_nsec;
|
||||||
|
|
||||||
|
if (res.ts.tv_nsec >= 1000000000)
|
||||||
|
{
|
||||||
|
res.ts.tv_nsec -= 1000000000;
|
||||||
|
res.ts.tv_sec++;
|
||||||
|
}
|
||||||
|
res.tsc = tsc + op.tsc;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeStampRecord operator - (const timeStampRecord& op)
|
||||||
|
{
|
||||||
|
timeStampRecord res;
|
||||||
|
|
||||||
|
res.ts.tv_sec = ts.tv_sec - op.ts.tv_sec;
|
||||||
|
res.ts.tv_nsec = ts.tv_nsec - op.ts.tv_nsec;
|
||||||
|
|
||||||
|
if (res.ts.tv_nsec < 0)
|
||||||
|
{
|
||||||
|
res.ts.tv_nsec += 1000000000;
|
||||||
|
res.ts.tv_sec--;
|
||||||
|
}
|
||||||
|
res.tsc = tsc - op.tsc;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator > (const timeStampRecord& op)
|
||||||
|
{
|
||||||
|
bool res = false;
|
||||||
|
if (ts.tv_sec == op.ts.tv_sec)
|
||||||
|
{
|
||||||
|
res = (ts.tv_nsec > op.ts.tv_nsec);
|
||||||
|
}
|
||||||
|
else if (ts.tv_sec > op.ts.tv_sec)
|
||||||
|
{
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator < (const timeStampRecord& op)
|
||||||
|
{
|
||||||
|
bool res = false;
|
||||||
|
if (ts.tv_sec == op.ts.tv_sec)
|
||||||
|
{
|
||||||
|
res = (ts.tv_nsec < op.ts.tv_nsec);
|
||||||
|
}
|
||||||
|
else if (ts.tv_sec < op.ts.tv_sec)
|
||||||
|
{
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void zero(void)
|
||||||
|
{
|
||||||
|
ts.tv_sec = 0;
|
||||||
|
ts.tv_nsec = 0;
|
||||||
|
tsc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fromSeconds(unsigned int sec)
|
||||||
|
{
|
||||||
|
ts.tv_sec = sec;
|
||||||
|
ts.tv_nsec = 0;
|
||||||
|
tsc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double toSeconds(void)
|
||||||
|
{
|
||||||
|
double sec = static_cast<double>(ts.tv_sec) + ( static_cast<double>(ts.tv_nsec) * 1.0e-9 );
|
||||||
|
return sec;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t toCounts(void)
|
||||||
|
{
|
||||||
|
return (ts.tv_sec * 1000000000) + ts.tv_nsec;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint64_t countFreq(void)
|
||||||
|
{
|
||||||
|
return 1000000000;
|
||||||
|
}
|
||||||
|
#else // WIN32
|
||||||
|
uint64_t ts;
|
||||||
|
uint64_t tsc;
|
||||||
|
|
||||||
|
timeStampRecord(void)
|
||||||
|
{
|
||||||
|
ts = 0;
|
||||||
|
tsc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeStampRecord& operator = (const timeStampRecord& in)
|
||||||
|
{
|
||||||
|
ts = in.ts;
|
||||||
|
tsc = in.tsc;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeStampRecord& operator += (const timeStampRecord& op)
|
||||||
|
{
|
||||||
|
ts += op.ts;
|
||||||
|
tsc += op.tsc;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeStampRecord operator + (const timeStampRecord& op)
|
||||||
|
{
|
||||||
|
timeStampRecord res;
|
||||||
|
|
||||||
|
res.ts = ts + op.ts;
|
||||||
|
res.tsc = tsc + op.tsc;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeStampRecord operator - (const timeStampRecord& op)
|
||||||
|
{
|
||||||
|
timeStampRecord res;
|
||||||
|
|
||||||
|
res.ts = ts - op.ts;
|
||||||
|
res.tsc = tsc - op.tsc;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator > (const timeStampRecord& op)
|
||||||
|
{
|
||||||
|
return ts > op.ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator < (const timeStampRecord& op)
|
||||||
|
{
|
||||||
|
return ts < op.ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
void zero(void)
|
||||||
|
{
|
||||||
|
ts = 0;
|
||||||
|
tsc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fromSeconds(unsigned int sec)
|
||||||
|
{
|
||||||
|
ts = sec * qpcFreq;
|
||||||
|
tsc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double toSeconds(void)
|
||||||
|
{
|
||||||
|
double sec = static_cast<double>(ts) / static_cast<double>(qpcFreq);
|
||||||
|
return sec;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t toCounts(void)
|
||||||
|
{
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint64_t countFreq(void)
|
||||||
|
{
|
||||||
|
return qpcFreq;
|
||||||
|
}
|
||||||
|
static uint64_t qpcFreq;
|
||||||
|
#endif
|
||||||
|
static uint64_t tscFreq;
|
||||||
|
|
||||||
|
static bool tscValid(void){ return tscFreq != 0; };
|
||||||
|
|
||||||
|
void readNew(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
bool timeStampModuleInitialized(void);
|
||||||
|
|
||||||
|
// Call this function to calibrate the estimated TSC frequency
|
||||||
|
void timeStampModuleCalibrate(int numSamples = 1);
|
||||||
|
|
||||||
|
} // namespace FCEU
|
||||||
|
|
|
@ -743,6 +743,7 @@ xcopy /y /d "$(ProjectDir)\..\src\drivers\win\7z_64.dll" "$(OutDir)"</Command>
|
||||||
<ClCompile Include="..\src\utils\md5.cpp" />
|
<ClCompile Include="..\src\utils\md5.cpp" />
|
||||||
<ClCompile Include="..\src\utils\memory.cpp" />
|
<ClCompile Include="..\src\utils\memory.cpp" />
|
||||||
<ClCompile Include="..\src\utils\mutex.cpp" />
|
<ClCompile Include="..\src\utils\mutex.cpp" />
|
||||||
|
<ClCompile Include="..\src\utils\timeStamp.cpp" />
|
||||||
<ClCompile Include="..\src\utils\unzip.cpp" />
|
<ClCompile Include="..\src\utils\unzip.cpp" />
|
||||||
<ClCompile Include="..\src\utils\xstring.cpp" />
|
<ClCompile Include="..\src\utils\xstring.cpp" />
|
||||||
<ClCompile Include="..\src\lua\src\lapi.c">
|
<ClCompile Include="..\src\lua\src\lapi.c">
|
||||||
|
@ -1152,6 +1153,7 @@ xcopy /y /d "$(ProjectDir)\..\src\drivers\win\7z_64.dll" "$(OutDir)"</Command>
|
||||||
<ClInclude Include="..\src\utils\md5.h" />
|
<ClInclude Include="..\src\utils\md5.h" />
|
||||||
<ClInclude Include="..\src\utils\memory.h" />
|
<ClInclude Include="..\src\utils\memory.h" />
|
||||||
<ClInclude Include="..\src\utils\mutex.h" />
|
<ClInclude Include="..\src\utils\mutex.h" />
|
||||||
|
<ClInclude Include="..\src\utils\timeStamp.h" />
|
||||||
<ClInclude Include="..\src\utils\unzip.h" />
|
<ClInclude Include="..\src\utils\unzip.h" />
|
||||||
<ClInclude Include="..\src\utils\valuearray.h" />
|
<ClInclude Include="..\src\utils\valuearray.h" />
|
||||||
<ClInclude Include="..\src\utils\xstring.h" />
|
<ClInclude Include="..\src\utils\xstring.h" />
|
||||||
|
|
Loading…
Reference in New Issue