You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by ok...@apache.org on 2017/08/23 12:34:48 UTC

[trafficserver] branch master updated: Optimize NetHandler & PollCont and reduce the redundant code

This is an automated email from the ASF dual-hosted git repository.

oknet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new fe996a8  Optimize NetHandler & PollCont and reduce the redundant code
fe996a8 is described below

commit fe996a8d9a34f1194a312f5e52e0c2714c132370
Author: Oknet Xu <xu...@skyguard.com.cn>
AuthorDate: Mon Aug 21 21:28:16 2017 +0800

    Optimize NetHandler & PollCont and reduce the redundant code
---
 iocore/net/P_UnixNet.h |   3 +-
 iocore/net/UnixNet.cc  | 189 ++++++++++++++++++++-----------------------------
 2 files changed, 80 insertions(+), 112 deletions(-)

diff --git a/iocore/net/P_UnixNet.h b/iocore/net/P_UnixNet.h
index b570b91..9b1f623 100644
--- a/iocore/net/P_UnixNet.h
+++ b/iocore/net/P_UnixNet.h
@@ -196,7 +196,8 @@ public:
   int startNetEvent(int event, Event *data);
   int mainNetEvent(int event, Event *data);
   int mainNetEventExt(int event, Event *data);
-  void process_enabled_list(NetHandler *);
+  void process_enabled_list();
+  void process_ready_list();
   void manage_keep_alive_queue();
   bool manage_active_queue(bool ignore_queue_size);
   void add_to_keep_alive_queue(UnixNetVConnection *vc);
diff --git a/iocore/net/UnixNet.cc b/iocore/net/UnixNet.cc
index 435d477..4c46342 100644
--- a/iocore/net/UnixNet.cc
+++ b/iocore/net/UnixNet.cc
@@ -348,32 +348,98 @@ NetHandler::startNetEvent(int event, Event *e)
 // Move VC's enabled on a different thread to the ready list
 //
 void
-NetHandler::process_enabled_list(NetHandler *nh)
+NetHandler::process_enabled_list()
 {
   UnixNetVConnection *vc = nullptr;
 
-  SListM(UnixNetVConnection, NetState, read, enable_link) rq(nh->read_enable_list.popall());
+  SListM(UnixNetVConnection, NetState, read, enable_link) rq(read_enable_list.popall());
   while ((vc = rq.pop())) {
     vc->ep.modify(EVENTIO_READ);
     vc->ep.refresh(EVENTIO_READ);
     vc->read.in_enabled_list = 0;
     if ((vc->read.enabled && vc->read.triggered) || vc->closed) {
-      nh->read_ready_list.in_or_enqueue(vc);
+      read_ready_list.in_or_enqueue(vc);
     }
   }
 
-  SListM(UnixNetVConnection, NetState, write, enable_link) wq(nh->write_enable_list.popall());
+  SListM(UnixNetVConnection, NetState, write, enable_link) wq(write_enable_list.popall());
   while ((vc = wq.pop())) {
     vc->ep.modify(EVENTIO_WRITE);
     vc->ep.refresh(EVENTIO_WRITE);
     vc->write.in_enabled_list = 0;
     if ((vc->write.enabled && vc->write.triggered) || vc->closed) {
-      nh->write_ready_list.in_or_enqueue(vc);
+      write_ready_list.in_or_enqueue(vc);
     }
   }
 }
 
 //
+// Walk through the ready list
+//
+void
+NetHandler::process_ready_list()
+{
+  UnixNetVConnection *vc = nullptr;
+
+#if defined(USE_EDGE_TRIGGER)
+  // UnixNetVConnection *
+  while ((vc = read_ready_list.dequeue())) {
+    // Initialize the thread-local continuation flags
+    set_cont_flags(vc->control_flags);
+    if (vc->closed)
+      close_UnixNetVConnection(vc, trigger_event->ethread);
+    else if (vc->read.enabled && vc->read.triggered)
+      vc->net_read_io(this, trigger_event->ethread);
+    else if (!vc->read.enabled) {
+      read_ready_list.remove(vc);
+#if defined(solaris)
+      if (vc->read.triggered && vc->write.enabled) {
+        vc->ep.modify(-EVENTIO_READ);
+        vc->ep.refresh(EVENTIO_WRITE);
+        vc->writeReschedule(this);
+      }
+#endif
+    }
+  }
+  while ((vc = write_ready_list.dequeue())) {
+    set_cont_flags(vc->control_flags);
+    if (vc->closed)
+      close_UnixNetVConnection(vc, trigger_event->ethread);
+    else if (vc->write.enabled && vc->write.triggered)
+      write_to_net(this, vc, trigger_event->ethread);
+    else if (!vc->write.enabled) {
+      write_ready_list.remove(vc);
+#if defined(solaris)
+      if (vc->write.triggered && vc->read.enabled) {
+        vc->ep.modify(-EVENTIO_WRITE);
+        vc->ep.refresh(EVENTIO_READ);
+        vc->readReschedule(this);
+      }
+#endif
+    }
+  }
+#else  /* !USE_EDGE_TRIGGER */
+  while ((vc = read_ready_list.dequeue())) {
+    diags->set_override(vc->control.debug_override);
+    if (vc->closed)
+      close_UnixNetVConnection(vc, trigger_event->ethread);
+    else if (vc->read.enabled && vc->read.triggered)
+      vc->net_read_io(this, trigger_event->ethread);
+    else if (!vc->read.enabled)
+      vc->ep.modify(-EVENTIO_READ);
+  }
+  while ((vc = write_ready_list.dequeue())) {
+    diags->set_override(vc->control.debug_override);
+    if (vc->closed)
+      close_UnixNetVConnection(vc, trigger_event->ethread);
+    else if (vc->write.enabled && vc->write.triggered)
+      write_to_net(this, vc, trigger_event->ethread);
+    else if (!vc->write.enabled)
+      vc->ep.modify(-EVENTIO_WRITE);
+  }
+#endif /* !USE_EDGE_TRIGGER */
+}
+//
 // The main event for NetHandler
 // This is called every proxy.config.net.event_period, and handles all IO operations scheduled
 // for this period.
@@ -385,61 +451,18 @@ NetHandler::mainNetEvent(int event, Event *e)
   (void)event;
   (void)e;
   EventIO *epd = nullptr;
-  int poll_timeout;
 
   NET_INCREMENT_DYN_STAT(net_handler_run_stat);
 
-  process_enabled_list(this);
-  if (likely(!read_ready_list.empty() || !write_ready_list.empty() || !read_enable_list.empty() || !write_enable_list.empty())) {
-    poll_timeout = 0; // poll immediately returns -- we have triggered stuff to process right now
-  } else {
-    poll_timeout = net_config_poll_timeout;
-  }
+  process_enabled_list();
 
+  // Polling event by PollCont
+  PollCont *p = get_PollCont(trigger_event->ethread);
+  p->handleEvent(EVENT_NONE, nullptr);
+
+  // Get & Process polling result
   PollDescriptor *pd     = get_PollDescriptor(trigger_event->ethread);
   UnixNetVConnection *vc = nullptr;
-#if TS_USE_EPOLL
-  pd->result = epoll_wait(pd->epoll_fd, pd->ePoll_Triggered_Events, POLL_DESCRIPTOR_SIZE, poll_timeout);
-  NetDebug("iocore_net_main_poll", "[NetHandler::mainNetEvent] epoll_wait(%d,%d), result=%d", pd->epoll_fd, poll_timeout,
-           pd->result);
-#elif TS_USE_KQUEUE
-  struct timespec tv;
-  tv.tv_sec  = poll_timeout / 1000;
-  tv.tv_nsec = 1000000 * (poll_timeout % 1000);
-  pd->result = kevent(pd->kqueue_fd, nullptr, 0, pd->kq_Triggered_Events, POLL_DESCRIPTOR_SIZE, &tv);
-  NetDebug("iocore_net_main_poll", "[NetHandler::mainNetEvent] kevent(%d,%d), result=%d", pd->kqueue_fd, poll_timeout, pd->result);
-#elif TS_USE_PORT
-  int retval;
-  timespec_t ptimeout;
-  ptimeout.tv_sec  = poll_timeout / 1000;
-  ptimeout.tv_nsec = 1000000 * (poll_timeout % 1000);
-  unsigned nget    = 1;
-  if ((retval = port_getn(pd->port_fd, pd->Port_Triggered_Events, POLL_DESCRIPTOR_SIZE, &nget, &ptimeout)) < 0) {
-    pd->result = 0;
-    switch (errno) {
-    case EINTR:
-    case EAGAIN:
-    case ETIME:
-      if (nget > 0) {
-        pd->result = (int)nget;
-      }
-      break;
-    default:
-      ink_assert(!"unhandled port_getn() case:");
-      break;
-    }
-  } else {
-    pd->result = (int)nget;
-  }
-  NetDebug("iocore_net_main_poll", "[NetHandler::mainNetEvent] %d[%s]=port_getn(%d,%p,%d,%d,%d),results(%d)", retval,
-           retval < 0 ? strerror(errno) : "ok", pd->port_fd, pd->Port_Triggered_Events, POLL_DESCRIPTOR_SIZE, nget, poll_timeout,
-           pd->result);
-
-#else
-#error port me
-#endif
-
-  vc = nullptr;
   for (int x = 0; x < pd->result; x++) {
     epd = (EventIO *)get_ev_data(pd, x);
     if (epd->type == EVENTIO_READWRITE_VC) {
@@ -486,63 +509,7 @@ NetHandler::mainNetEvent(int event, Event *e)
 
   pd->result = 0;
 
-#if defined(USE_EDGE_TRIGGER)
-  // UnixNetVConnection *
-  while ((vc = read_ready_list.dequeue())) {
-    // Initialize the thread-local continuation flags
-    set_cont_flags(vc->control_flags);
-    if (vc->closed)
-      close_UnixNetVConnection(vc, trigger_event->ethread);
-    else if (vc->read.enabled && vc->read.triggered)
-      vc->net_read_io(this, trigger_event->ethread);
-    else if (!vc->read.enabled) {
-      read_ready_list.remove(vc);
-#if defined(solaris)
-      if (vc->read.triggered && vc->write.enabled) {
-        vc->ep.modify(-EVENTIO_READ);
-        vc->ep.refresh(EVENTIO_WRITE);
-        vc->writeReschedule(this);
-      }
-#endif
-    }
-  }
-  while ((vc = write_ready_list.dequeue())) {
-    set_cont_flags(vc->control_flags);
-    if (vc->closed)
-      close_UnixNetVConnection(vc, trigger_event->ethread);
-    else if (vc->write.enabled && vc->write.triggered)
-      write_to_net(this, vc, trigger_event->ethread);
-    else if (!vc->write.enabled) {
-      write_ready_list.remove(vc);
-#if defined(solaris)
-      if (vc->write.triggered && vc->read.enabled) {
-        vc->ep.modify(-EVENTIO_WRITE);
-        vc->ep.refresh(EVENTIO_READ);
-        vc->readReschedule(this);
-      }
-#endif
-    }
-  }
-#else  /* !USE_EDGE_TRIGGER */
-  while ((vc = read_ready_list.dequeue())) {
-    diags->set_override(vc->control.debug_override);
-    if (vc->closed)
-      close_UnixNetVConnection(vc, trigger_event->ethread);
-    else if (vc->read.enabled && vc->read.triggered)
-      vc->net_read_io(this, trigger_event->ethread);
-    else if (!vc->read.enabled)
-      vc->ep.modify(-EVENTIO_READ);
-  }
-  while ((vc = write_ready_list.dequeue())) {
-    diags->set_override(vc->control.debug_override);
-    if (vc->closed)
-      close_UnixNetVConnection(vc, trigger_event->ethread);
-    else if (vc->write.enabled && vc->write.triggered)
-      write_to_net(this, vc, trigger_event->ethread);
-    else if (!vc->write.enabled)
-      vc->ep.modify(-EVENTIO_WRITE);
-  }
-#endif /* !USE_EDGE_TRIGGER */
+  process_ready_list();
 
   return EVENT_CONT;
 }

-- 
To stop receiving notification emails like this one, please contact
['"commits@trafficserver.apache.org" <co...@trafficserver.apache.org>'].