You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2020/05/20 17:50:15 UTC

[trafficserver] 02/02: put events into local queue when scheduling on the same thread as the scheduler

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 <du...@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)``