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>'].