This is an automated email from the ASF dual-hosted git repository. zwoop pushed a commit to branch 9.0.x in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit 96eaa3aa44129eb06c46e1dec945e63c47bead6a Author: Fei Deng <duke8...@gmail.com> AuthorDate: Thu Oct 31 14:16:10 2019 -0500 put events into local queue when scheduling on the same thread as the scheduler update docs (cherry picked from commit 6a1c5f7397af98dd45d1e6f227219ab463c6363a) --- iocore/eventsystem/P_UnixEThread.h | 8 +++++++- iocore/eventsystem/P_UnixEventProcessor.h | 22 ++++++++++++++-------- iocore/eventsystem/ProtectedQueue.cc | 2 +- .../null_transform/gold/null_transform-tag.gold | 2 +- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/iocore/eventsystem/P_UnixEThread.h b/iocore/eventsystem/P_UnixEThread.h index 55f093a..520ffdf 100644 --- a/iocore/eventsystem/P_UnixEThread.h +++ b/iocore/eventsystem/P_UnixEThread.h @@ -91,7 +91,13 @@ EThread::schedule(Event *e) // The continuation that gets scheduled later is not always the // client VC, it can be HttpCacheSM etc. so save the flags e->continuation->control_flags.set_flags(get_cont_flags().get_flags()); - EventQueueExternal.enqueue(e); + + if (e->ethread == this_ethread()) { + EventQueueExternal.enqueue_local(e); + } else { + EventQueueExternal.enqueue(e); + } + return e; } diff --git a/iocore/eventsystem/P_UnixEventProcessor.h b/iocore/eventsystem/P_UnixEventProcessor.h index fe89945..a8ba4f4 100644 --- a/iocore/eventsystem/P_UnixEventProcessor.h +++ b/iocore/eventsystem/P_UnixEventProcessor.h @@ -97,18 +97,18 @@ EventProcessor::schedule(Event *e, EventType etype) return nullptr; } - EThread *ethread = e->continuation->getThreadAffinity(); - if (ethread != nullptr && ethread->is_event_type(etype)) { - e->ethread = ethread; + EThread *affinity_thread = e->continuation->getThreadAffinity(); + EThread *curr_thread = this_ethread(); + if (affinity_thread != nullptr && affinity_thread->is_event_type(etype)) { + e->ethread = affinity_thread; } else { - ethread = this_ethread(); // Is the current thread eligible? - if (ethread != nullptr && ethread->is_event_type(etype)) { - e->ethread = ethread; + if (curr_thread != nullptr && curr_thread->is_event_type(etype)) { + e->ethread = curr_thread; } else { e->ethread = assign_thread(etype); } - if (e->continuation->getThreadAffinity() == nullptr) { + if (affinity_thread == nullptr) { e->continuation->setThreadAffinity(e->ethread); } } @@ -116,7 +116,13 @@ EventProcessor::schedule(Event *e, EventType etype) if (e->continuation->mutex) { e->mutex = e->continuation->mutex; } - e->ethread->EventQueueExternal.enqueue(e); + + if (curr_thread != nullptr && e->ethread == curr_thread) { + e->ethread->EventQueueExternal.enqueue_local(e); + } else { + e->ethread->EventQueueExternal.enqueue(e); + } + return e; } diff --git a/iocore/eventsystem/ProtectedQueue.cc b/iocore/eventsystem/ProtectedQueue.cc index d8a14da..d7936c6 100644 --- a/iocore/eventsystem/ProtectedQueue.cc +++ b/iocore/eventsystem/ProtectedQueue.cc @@ -101,7 +101,7 @@ ProtectedQueue::wait(ink_hrtime timeout) * - And then the Event Thread goes to sleep and waits for the wakeup signal of `EThread::might_have_data`, * - The `EThread::lock` will be locked again when the Event Thread wakes up. */ - if (INK_ATOMICLIST_EMPTY(al)) { + if (INK_ATOMICLIST_EMPTY(al) && localQueue.empty()) { timespec ts = ink_hrtime_to_timespec(timeout); ink_cond_timedwait(&might_have_data, &lock, &ts); } diff --git a/tests/gold_tests/null_transform/gold/null_transform-tag.gold b/tests/gold_tests/null_transform/gold/null_transform-tag.gold index 7f60846..733c4d1 100644 --- a/tests/gold_tests/null_transform/gold/null_transform-tag.gold +++ b/tests/gold_tests/null_transform/gold/null_transform-tag.gold @@ -1 +1 @@ -``DIAG: (null_transform)`` \ No newline at end of file +``DIAG: (null_transform)``