From 7b50e01627d08b469962b650f9b48cdd86261bd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=A3=8E?= Date: Fri, 20 Dec 2013 00:31:26 +0800 Subject: [PATCH] check command pipe in high freq --- skynet-src/socket_server.c | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index 07276f41..b83e05f8 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -49,6 +49,7 @@ struct socket { struct socket_server { int recvctrl_fd; int sendctrl_fd; + int checkctrl; poll_fd event_fd; int alloc_id; int event_n; @@ -171,6 +172,7 @@ socket_server_create() { ss->event_fd = efd; ss->recvctrl_fd = fd[0]; ss->sendctrl_fd = fd[1]; + ss->checkctrl = 1; for (i=0;islot[i]; @@ -522,6 +524,22 @@ block_readpipe(int pipefd, void *buffer, int sz) { } } +static int +has_cmd(struct socket_server *ss) { + fd_set rfds; + struct timeval tv = {0,0}; + int retval; + + FD_ZERO(&rfds); + FD_SET(ss->recvctrl_fd, &rfds); + + retval = select(ss->recvctrl_fd+1, &rfds, NULL, NULL, &tv); + if (retval == 1) { + return 1; + } + return 0; +} + // return type static int ctrl_cmd(struct socket_server *ss, struct socket_message *result) { @@ -670,12 +688,25 @@ report_accept(struct socket_server *ss, struct socket *s, struct socket_message return 1; } + // return type int socket_server_poll(struct socket_server *ss, struct socket_message * result, int * more) { for (;;) { + if (ss->checkctrl) { + if (has_cmd(ss)) { + int type = ctrl_cmd(ss, result); + if (type != -1) + return type; + else + continue; + } else { + ss->checkctrl = 0; + } + } if (ss->event_index == ss->event_n) { ss->event_n = sp_wait(ss->event_fd, ss->ev, MAX_EVENT); + ss->checkctrl = 1; if (more) { *more = 0; } @@ -688,11 +719,8 @@ socket_server_poll(struct socket_server *ss, struct socket_message * result, int struct event *e = &ss->ev[ss->event_index++]; struct socket *s = e->s; if (s == NULL) { - int type = ctrl_cmd(ss, result); - if (type != -1) - return type; - else - continue; + // dispatch pipe message at beginning + continue; } switch (s->type) { case SOCKET_TYPE_CONNECTING: