@@ -36,6 +36,10 @@ int getLogicalCoreCount(); | |||||
void setThreadName(const std::string& name); | void setThreadName(const std::string& name); | ||||
/** Returns the caller's human-readable stack trace with "\n"-separated lines. */ | /** Returns the caller's human-readable stack trace with "\n"-separated lines. */ | ||||
std::string getStackTrace(); | std::string getStackTrace(); | ||||
/** Gets the current number of nanoseconds since the epoch. | |||||
Currently uses std::chrono::high_resolution_clock. | |||||
*/ | |||||
long getNanoseconds(); | |||||
/** Opens a URL, also happens to work with PDFs and folders. | /** Opens a URL, also happens to work with PDFs and folders. | ||||
Shell injection is possible, so make sure the URL is trusted or hard coded. | Shell injection is possible, so make sure the URL is trusted or hard coded. | ||||
May block, so open in a new thread. | May block, so open in a new thread. | ||||
@@ -7,7 +7,6 @@ | |||||
#include <plugin.hpp> | #include <plugin.hpp> | ||||
#include <algorithm> | #include <algorithm> | ||||
#include <chrono> | |||||
#include <thread> | #include <thread> | ||||
#include <condition_variable> | #include <condition_variable> | ||||
#include <mutex> | #include <mutex> | ||||
@@ -222,10 +221,9 @@ static void Engine_stepModulesWorker(Engine* that, int threadId) { | |||||
Module* module = internal->modules[i]; | Module* module = internal->modules[i]; | ||||
// Start CPU timer | // Start CPU timer | ||||
using time_point = std::chrono::time_point<std::chrono::high_resolution_clock>; | |||||
time_point beginTime; | |||||
long startTime; | |||||
if (cpuMeter) { | if (cpuMeter) { | ||||
beginTime = std::chrono::high_resolution_clock::now(); | |||||
startTime = system::getNanoseconds(); | |||||
} | } | ||||
// Step module | // Step module | ||||
@@ -236,8 +234,8 @@ static void Engine_stepModulesWorker(Engine* that, int threadId) { | |||||
// Stop CPU timer | // Stop CPU timer | ||||
if (cpuMeter) { | if (cpuMeter) { | ||||
time_point endTime = std::chrono::high_resolution_clock::now(); | |||||
float duration = std::chrono::duration<float>(endTime - beginTime).count(); | |||||
long endTime = system::getNanoseconds(); | |||||
float duration = (endTime - startTime) / 1e9; | |||||
// Smooth CPU time | // Smooth CPU time | ||||
const float cpuTau = 2.f /* seconds */; | const float cpuTau = 2.f /* seconds */; | ||||
@@ -1,7 +1,7 @@ | |||||
#include <common.hpp> | #include <common.hpp> | ||||
#include <asset.hpp> | #include <asset.hpp> | ||||
#include <settings.hpp> | #include <settings.hpp> | ||||
#include <chrono> | |||||
#include <system.hpp> | |||||
#include <mutex> | #include <mutex> | ||||
@@ -10,12 +10,12 @@ namespace logger { | |||||
static FILE* outputFile = NULL; | static FILE* outputFile = NULL; | ||||
static std::chrono::high_resolution_clock::time_point startTime; | |||||
static long startTime = 0; | |||||
static std::mutex logMutex; | static std::mutex logMutex; | ||||
void init() { | void init() { | ||||
startTime = std::chrono::high_resolution_clock::now(); | |||||
startTime = system::getNanoseconds(); | |||||
if (settings::devMode) { | if (settings::devMode) { | ||||
outputFile = stderr; | outputFile = stderr; | ||||
return; | return; | ||||
@@ -50,11 +50,11 @@ static const int levelColors[] = { | |||||
static void logVa(Level level, const char* filename, int line, const char* format, va_list args) { | static void logVa(Level level, const char* filename, int line, const char* format, va_list args) { | ||||
std::lock_guard<std::mutex> lock(logMutex); | std::lock_guard<std::mutex> lock(logMutex); | ||||
auto nowTime = std::chrono::high_resolution_clock::now(); | |||||
int duration = std::chrono::duration_cast<std::chrono::milliseconds>(nowTime - startTime).count(); | |||||
long nowTime = system::getNanoseconds(); | |||||
double duration = (nowTime - startTime) / 1e9; | |||||
if (outputFile == stderr) | if (outputFile == stderr) | ||||
fprintf(outputFile, "\x1B[%dm", levelColors[level]); | fprintf(outputFile, "\x1B[%dm", levelColors[level]); | ||||
fprintf(outputFile, "[%.03f %s %s:%d] ", duration / 1000.0, levelLabels[level], filename, line); | |||||
fprintf(outputFile, "[%.03f %s %s:%d] ", duration, levelLabels[level], filename, line); | |||||
if (outputFile == stderr) | if (outputFile == stderr) | ||||
fprintf(outputFile, "\x1B[0m"); | fprintf(outputFile, "\x1B[0m"); | ||||
vfprintf(outputFile, format, args); | vfprintf(outputFile, format, args); | ||||
@@ -3,6 +3,7 @@ | |||||
#include <thread> | #include <thread> | ||||
#include <regex> | #include <regex> | ||||
#include <chrono> | |||||
#include <dirent.h> | #include <dirent.h> | ||||
#include <sys/stat.h> | #include <sys/stat.h> | ||||
#include <cxxabi.h> // for __cxxabiv1::__cxa_demangle | #include <cxxabi.h> // for __cxxabiv1::__cxa_demangle | ||||
@@ -214,6 +215,16 @@ std::string getStackTrace() { | |||||
} | } | ||||
long getNanoseconds() { | |||||
using clock = std::chrono::high_resolution_clock; | |||||
using time_point = std::chrono::time_point<clock>; | |||||
time_point now = clock::now(); | |||||
using duration = std::chrono::duration<long, std::nano>; | |||||
duration d = now.time_since_epoch(); | |||||
return d.count(); | |||||
} | |||||
void openBrowser(const std::string& url) { | void openBrowser(const std::string& url) { | ||||
#if defined ARCH_LIN | #if defined ARCH_LIN | ||||
std::string command = "xdg-open \"" + url + "\""; | std::string command = "xdg-open \"" + url + "\""; | ||||