版权声明:转载请注明来源 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;
}