Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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);
    }
}