From dd8ea1c8d95d29761f259e8b2177aed97bb211eb Mon Sep 17 00:00:00 2001 From: WolverinDEV Date: Wed, 24 Feb 2021 20:41:26 +0100 Subject: [PATCH] fixed the task executor --- src/misc/task_executor.cpp | 57 ++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/src/misc/task_executor.cpp b/src/misc/task_executor.cpp index 1f1079e..a519ead 100644 --- a/src/misc/task_executor.cpp +++ b/src/misc/task_executor.cpp @@ -316,38 +316,47 @@ void task_executor::executor(std::shared_ptr executor_context) } auto execute_timestamp = system_clock::now(); - if(task_context->task_recurring_head && task_context->task_recurring_head->scheduled_invoke <= execute_timestamp) { - auto task = task_context->task_recurring_head; - task_context->task_recurring_head = task->next; + std::chrono::system_clock::time_point next_timestamp{}; + if(task_context->task_recurring_head) { + if(task_context->task_recurring_head->scheduled_invoke <= execute_timestamp) { + auto task = task_context->task_recurring_head; + task_context->task_recurring_head = task->next; - executor_context->executing_recurring_task = task; - task_lock.unlock(); - - try { - task->callback(task->last_invoked); - } catch (...) { - auto exception = std::current_exception(); - - task_lock.lock(); - auto handler = task_context->exception_handler; + executor_context->executing_recurring_task = task; task_lock.unlock(); - handler(task->name, exception); - } + try { + task->callback(task->last_invoked); + } catch (...) { + auto exception = std::current_exception(); - task->last_invoked = execute_timestamp; - task->scheduled_invoke = std::min(system_clock::now(), execute_timestamp + task->interval); + task_lock.lock(); + auto handler = task_context->exception_handler; + task_lock.unlock(); - task_lock.lock(); - executor_context->executing_recurring_task = nullptr; - if(task->shutdown) { - delete task; + handler(task->name, exception); + } + + task->last_invoked = execute_timestamp; + task->scheduled_invoke = std::max(system_clock::now(), execute_timestamp + task->interval); + + task_lock.lock(); + executor_context->executing_recurring_task = nullptr; + if(task->shutdown) { + delete task; + } else { + executor_context->handle->enqueue_recurring_task(task); + } + continue; } else { - executor_context->handle->enqueue_recurring_task(task); + next_timestamp = task_context->task_recurring_head->scheduled_invoke; } - continue; } - task_context->notify.wait(task_lock); + if(next_timestamp.time_since_epoch().count() > 0) { + task_context->notify.wait_until(task_lock, next_timestamp); + } else { + task_context->notify.wait(task_lock); + } } } \ No newline at end of file