| @@ -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 + "\""; | ||||