启动时主线程初始化定制的lua.
void skynet_start(struct skynet_config * config) {
// register SIGHUP for log file reopen
struct sigaction sa;
sa.sa_handler = &handle_hup;
sa.sa_flags = SA_RESTART;
sigfillset(&sa.sa_mask);
sigaction(SIGHUP, &sa, NULL);
if (config->daemon) {
if (daemon_init(config->daemon)) {
exit(1);
}
}
skynet_harbor_init(config->harbor);
skynet_handle_init(config->harbor);
skynet_mq_init();
skynet_module_init(config->module_path);
skynet_timer_init();
skynet_socket_init();
skynet_profile_enable(config->profile);
struct skynet_context *ctx = skynet_context_new(config->logservice, config->logger);
if (ctx == NULL) {
fprintf(stderr, "Can't launch %s service\n", config->logservice);
exit(1);
}
bootstrap(ctx, config->bootstrap);
start(config->thread);
// harbor_exit may call socket send, so it should exit before socket_free
skynet_harbor_exit();
skynet_socket_free();
if (config->daemon) {
daemon_exit(config->daemon);
}
}
#0 snlua_init at service-src/service_snlua.c:148
#1 skynet_context_new (name="snlua", param="bootstrap") at skynet-src/skynet_server.c:161
#2 bootstrap (cmdline= "snlua bootstrap") at skynet-src/skynet_start.c:238
#3 skynet_start at skynet-src/skynet_start.c:274
#4 main at skynet-src/skynet_main.c:163
struct skynet_context *
skynet_context_new(const char * name, const char *param) {
struct skynet_module * mod = skynet_module_query(name); // 查询对应的.so是否加载起来了
if (mod == NULL)
return NULL;
void *inst = skynet_module_instance_create(mod);
if (inst == NULL)
return NULL;
struct skynet_context * ctx = skynet_malloc(sizeof(*ctx));
CHECKCALLING_INIT(ctx)
...
...
...
struct message_queue * queue = ctx->queue = skynet_mq_create(ctx->handle);
...
...
int r = skynet_module_instance_init(mod, inst, ctx, param);// 调用对应的${mode_name}_init
if (r == 0) {
struct skynet_context * ret = skynet_context_release(ctx);
if (ret) {
ctx->init = true;
}
skynet_globalmq_push(queue); // 每个skynet_context都有自己的消息队列
if (ret) {
skynet_error(ret, "LAUNCH %s %s", name, param ? param : "");
}
return ret;
} else
...
}
虽然配置文件指定8个工作线程,但是实际上,加上主线程+监控线程+定时器线程+socket处理线程,共运行12个线程。
主线程在启动其他线程后进入了等待其他线程结束。
(gdb) info threads
Id Target Id Frame
12 Thread 0x7faad9f7b700 (LWP 12989) "skynet" 0x00007faadb6401ad in nanosleep () from /lib64/libc.so.6
11 Thread 0x7faad977a700 (LWP 12990) "skynet" 0x00007faadb6401ad in nanosleep () from /lib64/libc.so.6
10 Thread 0x7faad8f79700 (LWP 12991) "skynet" 0x00007faadb679923 in epoll_wait () from /lib64/libc.so.6
9 Thread 0x7faad8778700 (LWP 12992) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
8 Thread 0x7faad7f77700 (LWP 12993) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
7 Thread 0x7faad7776700 (LWP 12994) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
6 Thread 0x7faad6f75700 (LWP 12995) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
5 Thread 0x7faad6774700 (LWP 12996) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
4 Thread 0x7faad5f73700 (LWP 12997) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
3 Thread 0x7faad5772700 (LWP 12998) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
2 Thread 0x7faad4f71700 (LWP 12999) "skynet" 0x00007faadc05d945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
* 1 Thread 0x7faadc47ff00 (LWP 12988) "skynet" 0x00007faadc05af57 in pthread_join () from /lib64/libpthread.so.0
主线程调用:
#1 in start (thread=8) at skynet-src/skynet_start.c:226
#2 skynet_start at skynet-src/skynet_start.c:276
#3 main at skynet-src/skynet_main.c:163
socket处理线程
#0 in epoll_wait () from /lib64/libc.so.6
#1 in sp_wait at skynet-src/socket_epoll.h:55
#2 socket_server_poll at skynet-src/socket_server.c:1369
#3 skynet_socket_poll at skynet-src/skynet_socket.c:79
#4 thread_socket at skynet-src/skynet_start.c:68
#5 start_thread () from /lib64/libpthread.so.0
#6 clone () from /lib64/libc.so.6
定时器线程
#0 nanosleep () from /lib64/libc.so.6
#1 usleep () from /lib64/libc.so.6
#2 thread_timer (p=0x7faadb1ce180) at skynet-src/skynet_start.c:136
#3 start_thread () from /lib64/libpthread.so.0
#4 clone () from /lib64/libc.so.6
监控线程
#0 nanosleep () from /lib64/libc.so.6
#1 sleep () from /lib64/libc.so.6
#2 thread_monitor (p=0x7faadb1ce180) at skynet-src/skynet_start.c:106
#3 start_thread () from /lib64/libpthread.so.0
#4 clone () from /lib64/libc.so.6
8个工作线程
#0 pthread_cond_wait() from /lib64/libpthread.so.0
#1 thread_worker at skynet-src/skynet_start.c:169
#2 start_thread from /lib64/libpthread.so.0
#3 clone () from /lib64/libc.so.6
评论 (0)