From e9445d6568a408f9c3946a5e4fad7b2c27ecbf30 Mon Sep 17 00:00:00 2001 From: WolverinDEV Date: Sun, 14 Feb 2021 20:41:10 +0100 Subject: [PATCH] Some more improvements --- .../client/shared/ServerCommandExecutor.cpp | 19 ++++++++++--------- .../src/client/shared/ServerCommandExecutor.h | 1 + 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/server/src/client/shared/ServerCommandExecutor.cpp b/server/src/client/shared/ServerCommandExecutor.cpp index a158f96..c3af53d 100644 --- a/server/src/client/shared/ServerCommandExecutor.cpp +++ b/server/src/client/shared/ServerCommandExecutor.cpp @@ -94,6 +94,7 @@ bool ServerCommandHandler::execute_handling() { if(!result) { /* flush all commands */ this->inner->reset(); + more_pending = false; break; } } catch (std::exception& ex) { @@ -209,18 +210,14 @@ void ServerCommandExecutor::shutdown() { void ServerCommandExecutor::enqueue_handler(const std::shared_ptr &handler) { std::lock_guard handler_lock{this->handler_mutex}; - if(handler->next_handler) { + if(handler->next_handler || this->handler_tail == &handler->next_handler) { /* handler already scheduled */ return; } - if(handler->executing) { - /* handler currently gets executed */ - return; - } - - if(this->handler_tail == &handler->next_handler) { - /* handler already schedules (current head) */ + if(handler->executing || handler->reschedule) { + /* Handle is currently executing */ + handler->reschedule = true; return; } @@ -258,15 +255,19 @@ void ServerCommandExecutor::executor() { } executor->executing = true; + executor->reschedule = false; executor->next_handler = nullptr; handler_lock.unlock(); auto reschedule = executor->execute_handling(); handler_lock.lock(); + reschedule |= std::exchange(executor->reschedule, false); executor->executing = false; - if(reschedule && !executor->next_handler && this->handler_tail != &executor->next_handler) { + if(reschedule) { + assert(!executor->next_handler); + *this->handler_tail = executor; this->handler_tail = &executor->next_handler; diff --git a/server/src/client/shared/ServerCommandExecutor.h b/server/src/client/shared/ServerCommandExecutor.h index 498b964..0dad74a 100644 --- a/server/src/client/shared/ServerCommandExecutor.h +++ b/server/src/client/shared/ServerCommandExecutor.h @@ -39,6 +39,7 @@ namespace ts::server { /* locked by ServerCommandExecutor::handler_mutex */ std::shared_ptr next_handler{nullptr}; bool executing{false}; + bool reschedule{false}; /** * @returns `true` if more commands need to be handled and `false` if all commands have been handled.