TCP服务器实现-start函数启动过程-第二篇

版权声明:转载请注明来源 https://blog.csdn.net/u013702678/article/details/81176046

上一篇分析了部分start的流程,这里接着上一篇继续分析,我们先从swServer_create开始。

int swServer_create(swServer *serv)
{
    //主事件驱动器main_reactor已经ok,但是server还没启动ok,这里属于异常情况,报错,退出。
    if (SwooleG.main_reactor)
    {
        swoole_error_log(SW_LOG_ERROR, SW_ERROR_SERVER_MUST_CREATED_BEFORE_CLIENT, "The swoole_server must create before client");
        return SW_ERR;
    }
    //全局变量的factory属性设置为serv对象的factory属性
    SwooleG.factory = &serv->factory;
    //serv对象的factory属性的ptr属性设置为serv,这里比较绕,看后续是为了实现什么逻辑
    serv->factory.ptr = serv;
    //初始化serv对象的时间属性,这里最终更新的是serv->gs->now的值,更新为time(NULL);
    swServer_update_time(serv);

#ifdef SW_REACTOR_USE_SESSION
    //初始化serv的session_list属性,这里通过共享内存的方式去初始化,关于这个属性,后续再看有什么逻辑。
    serv->session_list = sw_shm_calloc(SW_SESSION_LIST_SIZE, sizeof(swSession));
    if (serv->session_list == NULL)
    {
        swError("sw_shm_calloc(%ld) for session_list failed", SW_SESSION_LIST_SIZE * sizeof(swSession));
        return SW_ERR;
    }
#endif
    
    //serv的启动模式为SW_MODE_SINGLE,即单进程单线程模型,也就是只有1个worker进程,1个reactor线程
    if (serv->factory_mode == SW_MODE_SINGLE)
    {
        return swReactorProcess_create(serv);
    }
    else//其他模式,其他模式包括SW_MODE_BASE,SW_MODE_THREAD,SW_MODE_PROCESS 
    {
        return swReactorThread_create(serv);
    }
}

下面我们先从SW_MODE_SINGLE模式启动分析。

int swReactorProcess_create(swServer *serv)
{
    //其实从第一篇的分析中可以得知,如果启动模式为SW_MODE_SINGLE,则worker_num为1
    serv->reactor_num = serv->worker_num;//设置事件驱动器个数为1 
    serv->reactor_threads = sw_calloc(1, sizeof(swReactorThread));//初始化事件驱动线程信息
    if (serv->reactor_threads == NULL)//如果申请失败,一般内存不足时,才会申请失败。
    {
        swSysError("calloc[1](%d) failed.", (int )(serv->reactor_num * sizeof(swReactorThread)));
        return SW_ERR;
    }
    //初始化serv的连接信息,这里仅仅是动态分配空间信息
    serv->connection_list = sw_calloc(serv->max_connection, sizeof(swConnection));
    if (serv->connection_list == NULL)//如果申请失败
    {
        swSysError("calloc[2](%d) failed.", (int )(serv->max_connection * sizeof(swConnection)));
        return SW_ERR;
    }

    //创建serv_factory对象,这个对象的作用用来实现各种调度和分发,在后面会展开这个函数简单说明下。
    if (swFactory_create(&(serv->factory)) < 0)
    {
        swError("create factory failed.");
        return SW_ERR;
    }
    //设置serv的factory的finish回调函数,这个回调函数后续具体分析
    serv->factory.finish = swReactorProcess_send2client;
    return SW_OK;
}
//设置factory对象的各个回调函数,这些具体函数的实现后续具体分析,这里不展开
int swFactory_create(swFactory *factory)
{
    factory->dispatch = swFactory_dispatch;
    factory->finish = swFactory_finish;
    factory->start = swFactory_start;
    factory->shutdown = swFactory_shutdown;
    factory->end = swFactory_end;
    factory->notify = swFactory_notify;
    return SW_OK;
}

猜你喜欢

转载自blog.csdn.net/u013702678/article/details/81176046