swoole 模块的加载
模块加载
php加载模块会统一调用zm_startup_xxx(int type, int module_number)
函数(xxx为模块名),在swoole源码中实际为swoole.cc的PHP_MINIT_FUNCTION(swoole)
部分代码。
在PHP_MINIT_FUNCTION(swoole)
里主要是向php注册模块相关的内容,如类、函数、常量、别名。我们所需要关注的是swoole_init();
这个函数的调用。
void swoole_init(void)
{
if (SwooleG.init)
{
return;
}
bzero(&SwooleG, sizeof(SwooleG));
bzero(&SwooleWG, sizeof(SwooleWG));
bzero(sw_error, SW_ERROR_MSG_SIZE);
SwooleG.running = 1;
SwooleG.init = 1;
SwooleG.enable_coroutine = 1;
SwooleG.log_fd = STDOUT_FILENO;
SwooleG.write_log = swLog_put;
SwooleG.fatal_error = swoole_fatal_error;
SwooleG.cpu_num = SW_MAX(1, sysconf(_SC_NPROCESSORS_ONLN));
SwooleG.pagesize = getpagesize();
//get system uname
uname(&SwooleG.uname);
//random seed
srandom(time(NULL));
SwooleG.pid = getpid();
#ifdef SW_DEBUG
SwooleG.log_level = 0;
SwooleG.trace_flags = 0x7fffffff;
#else
SwooleG.log_level = SW_LOG_INFO;
#endif
//init global shared memory
SwooleG.memory_pool = swMemoryGlobal_new(SW_GLOBAL_MEMORY_PAGESIZE, 1);
if (SwooleG.memory_pool == NULL)
{
printf("[Core] Fatal Error: global memory allocation failure");
exit(1);
}
if (swMutex_create(&SwooleG.lock, 0) < 0)
{
printf("[Core] mutex init failure");
exit(1);
}
SwooleG.max_sockets = 1024;
struct rlimit rlmt;
if (getrlimit(RLIMIT_NOFILE, &rlmt) < 0)
{
swSysWarn("getrlimit() failed");
}
else
{
SwooleG.max_sockets = MAX((uint32_t) rlmt.rlim_cur, 1024);
SwooleG.max_sockets = MIN((uint32_t) rlmt.rlim_cur, SW_SESSION_LIST_SIZE);
}
SwooleG.socket_buffer_size = SW_SOCKET_BUFFER_SIZE;
SwooleG.socket_array = swArray_new(1024, sizeof(swSocket));
if (!SwooleG.socket_array)
{
swSysWarn("[Core] Fatal Error: socekt array memory allocation failure");
exit(1);
}
SwooleTG.buffer_stack = swString_new(SW_STACK_BUFFER_SIZE);
if (SwooleTG.buffer_stack == NULL)
{
exit(3);
}
if (!SwooleG.task_tmpdir)
{
SwooleG.task_tmpdir = sw_strndup(SW_TASK_TMP_FILE, sizeof(SW_TASK_TMP_FILE));
SwooleG.task_tmpdir_len = sizeof(SW_TASK_TMP_FILE);
}
char *tmp_dir = swoole_dirname(SwooleG.task_tmpdir);
//create tmp dir
if (access(tmp_dir, R_OK) < 0 && swoole_mkdir_recursive(tmp_dir) < 0)
{
swWarn("create task tmp dir(%s) failed", tmp_dir);
}
if (tmp_dir)
{
sw_free(tmp_dir);
}
//init signalfd
#ifdef HAVE_SIGNALFD
swSignalfd_init();
SwooleG.use_signalfd = 1;
SwooleG.enable_signalfd = 1;
#endif
}
swoole_init()
中主要是对SwooleG
做一个初始化的赋值操作。SwooleG
是一个本地的全局变量,记录的swoole的基础信息,具体可搜索swGlobal_t
。重点的初始化包括共享内存、锁、信号。接下来会依次讲解它们相关的概念以及运行过程。
本作品采用《CC 协议》,转载必须注明作者和本文链接