gbe_fork/helpers/dbg_log.cpp

76 lines
1.5 KiB
C++
Raw Normal View History

#include "dbg_log/dbg_log.hpp"
#include <cstdarg>
#include <cstdio>
#include <filesystem>
#include <thread>
#include <sstream>
#include <chrono>
#include <mutex>
static FILE* out_file = nullptr;
auto const static start_time = std::chrono::system_clock::now();
static std::recursive_mutex f_mtx{};
bool dbg_log::init(const wchar_t *path)
{
auto p = std::filesystem::path(path).string();
return init(p.c_str());
}
bool dbg_log::init(const char *path)
{
#ifndef EMU_RELEASE_BUILD
std::lock_guard lk(f_mtx);
if (!out_file) {
out_file = std::fopen(path, "a");
if (!out_file) {
return false;
}
}
#endif
return true;
}
void dbg_log::write(const char *fmt, ...)
{
#ifndef EMU_RELEASE_BUILD
std::lock_guard lk(f_mtx);
if (out_file) {
auto elapsed = std::chrono::system_clock::now() - start_time;
std::stringstream ss{};
ss << "[" << std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count() << " ms] [tid: " << std::this_thread::get_id() << "] ";
auto ss_str = ss.str();
std::fprintf(out_file, ss_str.c_str());
std::va_list args;
va_start(args, fmt);
std::vfprintf(out_file, fmt, args);
va_end(args);
std::fprintf(out_file, "\n");
std::fflush(out_file);
}
#endif
}
void dbg_log::close()
{
#ifndef EMU_RELEASE_BUILD
std::lock_guard lk(f_mtx);
if (out_file) {
std::fprintf(out_file, "\nLog file closed\n\n");
std::fclose(out_file);
out_file = nullptr;
}
#endif
}