diff --git a/cslol-tools/CMakeLists.txt b/cslol-tools/CMakeLists.txt index c2225e5f..b3ba16df 100644 --- a/cslol-tools/CMakeLists.txt +++ b/cslol-tools/CMakeLists.txt @@ -16,6 +16,8 @@ add_library(cslol-lib STATIC lib/lol/error.hpp lib/lol/fs.cpp lib/lol/fs.hpp + lib/lol/log.hpp + lib/lol/log.cpp lib/lol/hash/dict.cpp lib/lol/hash/dict.hpp diff --git a/cslol-tools/dep/CMakeLists.txt b/cslol-tools/dep/CMakeLists.txt index 5cbacc06..2492f6ae 100644 --- a/cslol-tools/dep/CMakeLists.txt +++ b/cslol-tools/dep/CMakeLists.txt @@ -105,7 +105,7 @@ FetchContent_Declare( FetchContent_GetProperties(fmtlog) if(NOT fmtlog_POPULATED) FetchContent_Populate(fmtlog) - add_library(fmtlog STATIC ${fmtlog_SOURCE_DIR}/fmtlog.cc) - target_include_directories(fmtlog PUBLIC ${fmtlog_SOURCE_DIR}) - target_link_libraries(fmtlog PUBLIC fmt) + add_library(fmtlog INTERFACE) + target_include_directories(fmtlog INTERFACE ${fmtlog_SOURCE_DIR}) + target_link_libraries(fmtlog INTERFACE fmt) endif() diff --git a/cslol-tools/lib/lol/common.cpp b/cslol-tools/lib/lol/common.cpp index c6b264df..da2c2695 100644 --- a/cslol-tools/lib/lol/common.cpp +++ b/cslol-tools/lib/lol/common.cpp @@ -1,3 +1,14 @@ +#include #include +#include using namespace lol; + +#ifdef _WIN32 +extern "C" { +extern void Sleep(unsigned ms); +} +void lol::sleep_ms(std::uint32_t ms) { Sleep(ms); } +#else +void lol::sleep_ms(std::uint32_t ms) { std::this_thread::sleep_for(std::chrono::milliseconds{ms}); } +#endif \ No newline at end of file diff --git a/cslol-tools/lib/lol/common.hpp b/cslol-tools/lib/lol/common.hpp index 539f12cb..a60e3d3a 100644 --- a/cslol-tools/lib/lol/common.hpp +++ b/cslol-tools/lib/lol/common.hpp @@ -9,4 +9,6 @@ #include #include -namespace lol {} +namespace lol { + void sleep_ms(std::uint32_t ms); +} diff --git a/cslol-tools/lib/lol/log.cpp b/cslol-tools/lib/lol/log.cpp new file mode 100644 index 00000000..74a45719 --- /dev/null +++ b/cslol-tools/lib/lol/log.cpp @@ -0,0 +1,21 @@ +#include + +#include +#include + +void lol::init_logging_thread() { + fmtlogDetailWrapper<>::impl.stopPollingThread(); + fmtlogDetailWrapper<>::impl.threadRunning = true; + fmtlogDetailWrapper<>::impl.thr = std::thread([]() { + while (fmtlogDetailWrapper<>::impl.threadRunning) { + fmtlogDetailWrapper<>::impl.poll(false); + // Why are we using our own polling thread instead of builtin one: + // This chinese logging library uses nanoseconds to poll. + // As it turns out windows is utterly incapable of sleeping below 1ms. + // As a consequence std::this_thread_sleep sleeps by doing a busy wait on high precision system clock. + // This absolutely destroys CPU performance on certain machines as it pins the core to 100%. + lol::sleep_ms(1); + } + fmtlogDetailWrapper<>::impl.poll(true); + }); +} diff --git a/cslol-tools/lib/lol/log.hpp b/cslol-tools/lib/lol/log.hpp new file mode 100644 index 00000000..f848a165 --- /dev/null +++ b/cslol-tools/lib/lol/log.hpp @@ -0,0 +1,8 @@ +#pragma once +#include + +#include + +namespace lol { + void init_logging_thread(); +} diff --git a/cslol-tools/lib/lol/patcher/patcher_dummy.cpp b/cslol-tools/lib/lol/patcher/patcher_dummy.cpp index 9b3120f9..7f8c7b50 100644 --- a/cslol-tools/lib/lol/patcher/patcher_dummy.cpp +++ b/cslol-tools/lib/lol/patcher/patcher_dummy.cpp @@ -18,7 +18,7 @@ auto patcher::run(std::function update, (void)game_path; for (;;) { update(M_WAIT_START, ""); - std::this_thread::sleep_for(250ms); + sleep_ms(250); } } diff --git a/cslol-tools/lib/lol/patcher/patcher_macos.cpp b/cslol-tools/lib/lol/patcher/patcher_macos.cpp index 8b64af5c..11ca7ec8 100644 --- a/cslol-tools/lib/lol/patcher/patcher_macos.cpp +++ b/cslol-tools/lib/lol/patcher/patcher_macos.cpp @@ -102,7 +102,7 @@ auto patcher::run(std::function update, auto pid = Process::FindPid("/LeagueofLegends"); if (!pid) { update(M_WAIT_START, ""); - std::this_thread::sleep_for(10ms); + sleep_ms(10); continue; } diff --git a/cslol-tools/lib/lol/patcher/utility/delay.hpp b/cslol-tools/lib/lol/patcher/utility/delay.hpp index 15f1b584..720d0bd9 100644 --- a/cslol-tools/lib/lol/patcher/utility/delay.hpp +++ b/cslol-tools/lib/lol/patcher/utility/delay.hpp @@ -4,6 +4,8 @@ #include #include +#include "lol/common.hpp" + namespace lol { template struct Intervals { @@ -14,7 +16,7 @@ namespace lol { : intervals{static_cast( std::chrono::duration_cast(intervals).count())...} {} - std::array intervals{1.0}; + std::array intervals{1}; }; template @@ -31,7 +33,7 @@ namespace lol { if (auto result = poll()) { return result; } - std::this_thread::sleep_for(std::chrono::milliseconds{interval}); + sleep_ms(interval); slice -= interval; } } diff --git a/cslol-tools/src/main_mod_tools.cpp b/cslol-tools/src/main_mod_tools.cpp index 79ddf02e..5ef55650 100644 --- a/cslol-tools/src/main_mod_tools.cpp +++ b/cslol-tools/src/main_mod_tools.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -294,7 +295,7 @@ int main(int argc, char** argv) { utility::set_binary_io(); fmtlog::setHeaderPattern("[{l}] "); fmtlog::setLogFile(stdout, false); - fmtlog::startPollingThread(); + lol::init_logging_thread(); try { fs::path exe, cmd, src, dst; auto flags = utility::argv_parse(utility::argv_fix(argc, argv), exe, cmd, src, dst); diff --git a/cslol-tools/src/main_wad_extract.cpp b/cslol-tools/src/main_wad_extract.cpp index c9b47f7d..ffd8289e 100644 --- a/cslol-tools/src/main_wad_extract.cpp +++ b/cslol-tools/src/main_wad_extract.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -43,7 +44,7 @@ int main(int argc, char** argv) { utility::set_binary_io(); fmtlog::setHeaderPattern("[{l}] "); fmtlog::setLogFile(stdout, false); - fmtlog::startPollingThread(); + lol::init_logging_thread(); try { fs::path exe, src, dst, hashdict; auto flags = utility::argv_parse(utility::argv_fix(argc, argv), exe, src, dst, hashdict); diff --git a/cslol-tools/src/main_wad_make.cpp b/cslol-tools/src/main_wad_make.cpp index cdc0f950..aa9d4f4d 100644 --- a/cslol-tools/src/main_wad_make.cpp +++ b/cslol-tools/src/main_wad_make.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -35,7 +36,7 @@ int main(int argc, char** argv) { utility::set_binary_io(); fmtlog::setHeaderPattern("[{l}] "); fmtlog::setLogFile(stdout, false); - fmtlog::startPollingThread(); + lol::init_logging_thread(); try { fs::path exe, src, dst; auto flags = utility::argv_parse(utility::argv_fix(argc, argv), exe, src, dst);