/** * Main Loop */ static int swServer_poll_loop(swThreadParam *param) { swServer *serv = param->object; int ret, pti = param->pti; swReactor *reactor = &(serv->threads[pti].reactor); struct timeval timeo; ret = swReactorEpoll_create(reactor, (serv->max_conn / serv->poll_thread_num) + 1); if (ret < 0) { return SW_ERR; } timeo.tv_sec = serv->timeout_sec; timeo.tv_usec = serv->timeout_usec; //300ms reactor->ptr = serv; reactor->setHandle(reactor, SW_FD_CLOSE, swServer_poll_onClose); //Thread mode must copy the data. //will free after onFinish if(serv->factory_mode == SW_MODE_THREAD) { reactor->setHandle(reactor, SW_FD_CONN, swServer_poll_onReceive2); } else { reactor->setHandle(reactor, SW_FD_CONN, swServer_poll_onReceive); } //main loop reactor->wait(reactor, &timeo); //shutdown reactor->free(reactor); sw_free(param); return SW_OK; }
int swReactor_create(swReactor *reactor, int max_event) { int ret; bzero(reactor, sizeof(swReactor)); #ifdef HAVE_EPOLL ret = swReactorEpoll_create(reactor, max_event); #elif defined(HAVE_KQUEUE) ret = swReactorKqueue_create(reactor, max_event); #elif defined(HAVE_POLL) ret = swReactorPoll_create(reactor, max_event); #else ret = swReactorSelect_create(reactor); #endif reactor->running = 1; reactor->setHandle = swReactor_setHandle; reactor->onFinish = swReactor_onFinish; reactor->onTimeout = swReactor_onTimeout; reactor->write = swReactor_write; reactor->defer = swReactor_defer; reactor->close = swReactor_close; reactor->socket_array = swArray_new(1024, sizeof(swConnection)); if (!reactor->socket_array) { swWarn("create socket array failed."); return SW_ERR; } return ret; }
/** * 自动适配reactor */ int swReactor_auto(swReactor *reactor, int max_event) { int ret; #ifdef HAVE_EPOLL ret = swReactorEpoll_create(reactor, max_event); #elif defined(HAVE_KQUEUE) ret = swReactorKqueue_create(reactor, max_event); #elif defined(SW_MAINREACTOR_USE_POLL) ret = swReactorPoll_create(reactor, max_event); #else ret = swReactorSelect_create(SwooleG.main_reactor) #endif return ret; }
int swReactor_create(swReactor *reactor, int max_event) { int ret; bzero(reactor, sizeof(swReactor)); //event less than SW_REACTOR_MINEVENTS, use poll/select if (max_event <= SW_REACTOR_MINEVENTS) { #ifdef SW_MAINREACTOR_USE_POLL ret = swReactorPoll_create(reactor, SW_REACTOR_MINEVENTS); #else ret = swReactorSelect_create(reactor); #endif } //use epoll or kqueue else { #ifdef HAVE_EPOLL ret = swReactorEpoll_create(reactor, max_event); #elif defined(HAVE_KQUEUE) ret = swReactorKqueue_create(reactor, max_event); #elif defined(SW_MAINREACTOR_USE_POLL) ret = swReactorPoll_create(reactor, max_event); #else ret = swReactorSelect_create(reactor); #endif } reactor->running = 1; reactor->setHandle = swReactor_setHandle; reactor->onFinish = swReactor_onFinish; reactor->onTimeout = swReactor_onTimeout; reactor->write = swReactor_write; reactor->close = swReactor_close; reactor->socket_array = swArray_new(1024, sizeof(swConnection), 0); if (!reactor->socket_array) { swWarn("create socket array failed."); return SW_ERR; } return ret; }