From b828f14dd1795eddeb45812a2d9cf9e76b12c2ce Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Tue, 8 Jun 2021 00:34:35 -0400 Subject: [PATCH] task: optimize for common case of single following Task If there is only one Task in the post exec queue, we can simply insert that Task instead of creating a task to hold a post exec queue of one item. Signed-off-by: Zygo Blaxell --- lib/task.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/task.cc b/lib/task.cc index 2fa257b..d58fe73 100644 --- a/lib/task.cc +++ b/lib/task.cc @@ -199,12 +199,17 @@ namespace crucible { tlcc->m_local_queue.splice(tlcc->m_local_queue.begin(), queue); } else { // We are not executing under a TaskConsumer. - // Create a new task to wrap our post-exec queue, - // then push it to the front of the global queue using normal locking methods. - TaskStatePtr rescue_task(make_shared("rescue_task", [](){})); - swap(rescue_task->m_post_exec_queue, queue); - TaskQueue tq_one { rescue_task }; - TaskMasterState::push_front(tq_one); + // If there is only one task, then just insert it at the front of the queue. + if (queue.size() == 1) { + TaskMasterState::push_front(queue); + } else { + // If there are multiple tasks, create a new task to wrap our post-exec queue, + // then push it to the front of the global queue using normal locking methods. + TaskStatePtr rescue_task(make_shared("rescue_task", [](){})); + swap(rescue_task->m_post_exec_queue, queue); + TaskQueue tq_one { rescue_task }; + TaskMasterState::push_front(tq_one); + } } }