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; }
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; }
void swWorker_onStart(swServer *serv) { /** * Release other worker process */ int i; swWorker *worker; if (SwooleWG.id >= serv->worker_num) { SwooleG.process_type = SW_PROCESS_TASKWORKER; } else { SwooleG.process_type = SW_PROCESS_WORKER; } SwooleWG.worker = swServer_get_worker(serv, SwooleWG.id); if (swIsWorker()) { int maxfd; if (SwooleG.task_worker_num > 0) { maxfd = SwooleG.task_workers.workers[SwooleG.task_worker_num - 1].pipe_master + 1; } else { maxfd = serv->workers[serv->worker_num - 1].pipe_master + 1; } SwooleWG.fd_map = swArray_new(maxfd, sizeof(swPipe *), 0); } for (i = 0; i < serv->worker_num + SwooleG.task_worker_num; i++) { worker = swServer_get_worker(serv, i); if (SwooleWG.id == i) { continue; } else { swWorker_free(worker); } if (SwooleWG.id < serv->worker_num && i < serv->worker_num) { close(worker->pipe_worker); } if (swIsWorker()) { swSetNonBlock(worker->pipe_master); swArray_store(SwooleWG.fd_map, worker->pipe_master, &worker->pipe_object); worker->pipe_object->pipe_used = worker->pipe_master; } } if (serv->onWorkerStart) { serv->onWorkerStart(serv, SwooleWG.id); } }