From 071dbfa5fca5a9b46d6772d5ca9b9ae8693a53e1 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Thu, 27 Dec 2018 17:11:52 +0100 Subject: [PATCH] Fix console logging --- src/main.cpp | 4 ++-- src/module/console.cpp | 43 +++++++++++++++++++++++----------------- src/module/scheduler.cpp | 34 +++++++++++++++++++++++++++++++ src/module/scheduler.hpp | 15 ++++++++++++++ src/steam/steam.cpp | 2 ++ 5 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 src/module/scheduler.cpp create mode 100644 src/module/scheduler.hpp diff --git a/src/main.cpp b/src/main.cpp index e8167c0..4a0fc1b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,7 +10,7 @@ __declspec(thread) char tls_data[TLS_PAYLOAD_SIZE]; -void exit_hook(const int code) +DECLSPEC_NORETURN void WINAPI exit_hook(const int code) { module_loader::pre_destroy(); exit(code); @@ -39,7 +39,7 @@ void verify_tls() int main() { - FARPROC entry_point = nullptr; + FARPROC entry_point; try { diff --git a/src/module/console.cpp b/src/module/console.cpp index cd272ce..64fec53 100644 --- a/src/module/console.cpp +++ b/src/module/console.cpp @@ -1,6 +1,7 @@ #include #include "loader/module_loader.hpp" #include "game/game.hpp" +#include "scheduler.hpp" class console final : public module { @@ -13,12 +14,13 @@ public: _dup2(this->handles_[1], 1); _dup2(this->handles_[1], 2); - setvbuf(stdout, nullptr, _IONBF, 0); - setvbuf(stderr, nullptr, _IONBF, 0); + //setvbuf(stdout, nullptr, _IONBF, 0); + //setvbuf(stderr, nullptr, _IONBF, 0); } void post_start() override { + scheduler::on_frame(std::bind(&console::log_messages, this)); this->console_runner_ = std::thread(std::bind(&console::runner, this)); } @@ -46,7 +48,6 @@ public: std::lock_guard _(this->mutex_); this->console_initialized_ = true; - this->replay_messages(); } private: @@ -59,26 +60,31 @@ private: int handles_[2]{}; - void replay_messages() + void log_messages() { - if (!this->console_initialized_) return; - - while (!this->message_queue_.empty()) + while (this->console_initialized_ && !this->message_queue_.empty()) { - this->push_message(this->message_queue_.front()); - this->message_queue_.pop(); + std::queue message_queue_copy; + + { + std::lock_guard _(this->mutex_); + message_queue_copy = this->message_queue_; + this->message_queue_ = {}; + } + + while (!message_queue_copy.empty()) + { + log_message(message_queue_copy.front()); + message_queue_copy.pop(); + } } + + fflush(stdout); + fflush(stderr); } - void push_message(const std::string& message) + static void log_message(const std::string& message) { - if (!this->console_initialized_) - { - std::lock_guard _(this->mutex_); - this->message_queue_.push(message); - return; - } - game::native::Conbuf_AppendText(message.data()); } @@ -91,7 +97,8 @@ private: const auto len = _read(this->handles_[0], buffer, sizeof(buffer)); if (len > 0) { - this->push_message(std::string(buffer, len)); + std::lock_guard _(this->mutex_); + this->message_queue_.push(std::string(buffer, len)); } else { diff --git a/src/module/scheduler.cpp b/src/module/scheduler.cpp new file mode 100644 index 0000000..b5192fc --- /dev/null +++ b/src/module/scheduler.cpp @@ -0,0 +1,34 @@ +#include +#include "scheduler.hpp" + +std::mutex scheduler::mutex_; +std::vector> scheduler::callbacks_; + +void scheduler::on_frame(const std::function& callback) +{ + std::lock_guard _(mutex_); + callbacks_.push_back(callback); +} + +void scheduler::execute() +{ + std::vector> callbacks_copy; + + { + std::lock_guard _(mutex_); + callbacks_copy = callbacks_; + } + + for (const auto& callback : callbacks_copy) + { + callback(); + } +} + +void scheduler::pre_destroy() +{ + std::lock_guard _(mutex_); + callbacks_.clear(); +} + +REGISTER_MODULE(scheduler); diff --git a/src/module/scheduler.hpp b/src/module/scheduler.hpp new file mode 100644 index 0000000..1c80a4c --- /dev/null +++ b/src/module/scheduler.hpp @@ -0,0 +1,15 @@ +#pragma once +#include "loader/module_loader.hpp" + +class scheduler final : public module +{ +public: + static void on_frame(const std::function& callback); + static void execute(); + + void pre_destroy() override; + +private: + static std::mutex mutex_; + static std::vector> callbacks_; +}; diff --git a/src/steam/steam.cpp b/src/steam/steam.cpp index b37f6ae..175bba1 100644 --- a/src/steam/steam.cpp +++ b/src/steam/steam.cpp @@ -1,5 +1,6 @@ #include #include "steam/steam.hpp" +#include "module/scheduler.hpp" namespace steam { @@ -125,6 +126,7 @@ namespace steam void SteamAPI_RunCallbacks() { callbacks::run_callbacks(); + scheduler::execute(); } void SteamAPI_Shutdown()