青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

skynet的啟動 2014.11.05

Posted on 2014-11-05 17:44 S.l.e!ep.¢% 閱讀(724) 評論(0)  編輯 收藏 引用 所屬分類: Skynet
bootstrap(..); 之前的代碼沒看懂

bootstrap()代碼如下
static?void
bootstrap(
struct?skynet_context?*?logger,?const?char?*?cmdline)?{
????
int?sz?=?strlen(cmdline);
????
char?name[sz+1];
????
char?args[sz+1];
????sscanf(cmdline,?
"%s?%s",?name,?args);
????
struct?skynet_context?*ctx?=?skynet_context_new(name,?args);
????
if?(ctx?==?NULL)?{
????????skynet_error(NULL,?
"Bootstrap?error?:?%s\n",?cmdline);
????????skynet_context_dispatchall(logger);
????????exit(
1);
????}
}

一開始以為 skynet_context_new() 只是malloc()之類的調(diào)用而已
后來再看看 skynet_context_new() 的源碼

struct?skynet_context?*?
skynet_context_new(
const?char?*?name,?const?char?*param)?{
????
struct?skynet_module?*?mod?=?skynet_module_query(name);

????
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)

????ctx
->mod?=?mod;
????ctx
->instance?=?inst;
????ctx
->ref?=?2;
????ctx
->cb?=?NULL;
????ctx
->cb_ud?=?NULL;
????ctx
->session_id?=?0;
????ctx
->logfile?=?NULL;

????ctx
->init?=?false;
????ctx
->endless?=?false;
????
//?Should?set?to?0?first?to?avoid?skynet_handle_retireall?get?an?uninitialized?handle
????ctx->handle?=?0;????
????ctx
->handle?=?skynet_handle_register(ctx);
????
struct?message_queue?*?queue?=?ctx->queue?=?skynet_mq_create(ctx->handle);
????
//?init?function?maybe?use?ctx->handle,?so?it?must?init?at?last
????context_inc();

????CHECKCALLING_BEGIN(ctx)
????
int?r?=?skynet_module_instance_init(mod,?inst,?ctx,?param);
????CHECKCALLING_END(ctx)
????
if?(r?==?0)?{
????????
struct?skynet_context?*?ret?=?skynet_context_release(ctx);
????????
if?(ret)?{
????????????ctx
->init?=?true;
????????}
????????skynet_globalmq_push(queue);
????????
if?(ret)?{
????????????skynet_error(ret,?
"LAUNCH?%s?%s",?name,?param???param?:?"");
????????}
????????
return?ret;
????}?
else?{
????????skynet_error(ctx,?
"FAILED?launch?%s",?name);
????????uint32_t?handle?
=?ctx->handle;
????????skynet_context_release(ctx);
????????skynet_handle_retire(handle);
????????
struct?drop_t?d?=?{?handle?};
????????skynet_mq_release(queue,?drop_message,?
&d);
????????
return?NULL;
????}
}

大概是進行了模塊的初始化,并為這個模塊創(chuàng)建消息隊列, 并放到全局的隊列里(注:模塊初始化時會將 param 傳進去)

之后開啟線程,進行消息處理
_start(config->thread);

用GDB調(diào)試,看下堆棧
#0??_init?(l=0x2b98570163a0,?ctx=0x2b98570540f0,?args=0x2b9857099070?"bootstrap",?sz=9)?at?service-src/service_snlua.c:71
#
1??0x00002b9857d02469?in?_launch?(context=0x2b98570540f0,?ud=0x2b98570163a0,?type=0,?session=0,?source=16777218,?msg=0x2b9857099070,?sz=9)?at?service-src/service_snlua.c:125
#
2??0x0000000000409546?in?dispatch_message?(ctx=0x2b98570540f0,?msg=0x420030e0)?at?skynet-src/skynet_server.c:254
#
3??0x00000000004096c4?in?skynet_context_message_dispatch?(sm=0x2b9857016440,?q=0x2b98570530c0,?weight=-1)?at?skynet-src/skynet_server.c:308
#
4??0x000000000040a98f?in?_worker?(p=0x7fff54a5f8d0)?at?skynet-src/skynet_start.c:128

為何會調(diào)用到 _launch? 回到前面
static?void
bootstrap(
struct?skynet_context?*?logger,?const?char?*?cmdline)?{
????
int?sz?=?strlen(cmdline);
????
char?name[sz+1];
????
char?args[sz+1];
????sscanf(cmdline,?
"%s?%s",?name,?args);
????
struct?skynet_context?*ctx?=?skynet_context_new(name,?args);?// 這里傳的參數(shù)分別為 snlua?bootstrap
????if?(ctx?==?NULL)?{
????????skynet_error(NULL,?
"Bootstrap?error?:?%s\n",?cmdline);
????????skynet_context_dispatchall(logger);
????????exit(
1);
????}
}

調(diào)用的流程是這樣的
#0? _open_sym (mod=0x2b9e0a032438) at skynet-src/skynet_module.c:76
#1? 0x0000000000408463 in skynet_module_query (name=0x7fffa16ae600 "snlua") at skynet-src/skynet_module.c:107
#2? 0x0000000000409099 in skynet_context_new (name=0x7fffa16ae600 "snlua", param=0x7fffa16ae5e0 "bootstrap") at skynet-src/skynet_server.c:117
#3? 0x000000000040adda in bootstrap (logger=0x2b9e0a054080, cmdline=0x2b9e0a0aa298 "snlua bootstrap") at skynet-src/skynet_start.c:204
#4? 0x000000000040aedb in skynet_start (config=0x7fffa16ae6d0) at skynet-src/skynet_start.c:232
#5? 0x000000000040751e in main (argc=2, argv=0x7fffa16ae7f8) at skynet-src/skynet_main.c:139

skynet_context_new 會先去 cservice目錄下 查找 snlua.so , 然后分別找
snlua_create? --->? skynet_module->create
snlua_init??? --->? skynet_module->init
snlua_release --->? skynet_module->release
這三個函數(shù)然后分別賦值給
skynet_module 的 create / init / release

snlua.so 的代碼在 service_snlua.c
看 snlua_init() 函數(shù)代碼就知道它將 skynet_context 的 cb 賦值為
_launch

int
snlua_init(
struct?snlua?*l,?struct?skynet_context?*ctx,?const?char?*?args)?{
????
int?sz?=?strlen(args);
????
char?*?tmp?=?skynet_malloc(sz);
????memcpy(tmp,?args,?sz);
????skynet_callback(ctx,?l?,?_launch);? // 這句代碼將
skynet_context 的 cb 賦值為 _launch
???
const?char?*?self?=?skynet_command(ctx,?"REG",?NULL);
????uint32_t?handle_id?
=?strtoul(self+1,?NULL,?16);
????
//?it?must?be?first?message
????skynet_send(ctx,?0,?handle_id,?PTYPE_TAG_DONTCOPY,0,?tmp,?sz);
????
return?0;
}


再看回下面的消息分派 dispatch_message() 里有以下代碼, 實際上就是調(diào)用了 _launch()
??? if (!ctx->cb(ctx, ctx->cb_ud, type, msg->session, msg->source, msg->data, sz)) {
??? ??? skynet_free(msg->data);
??? }

#0??_init?(l=0x2b98570163a0,?ctx=0x2b98570540f0,?args=0x2b9857099070?"bootstrap",?sz=9)?at?service-src/service_snlua.c:71
#
1??0x00002b9857d02469?in?_launch?(context=0x2b98570540f0,?ud=0x2b98570163a0,?type=0,?session=0,?source=16777218,?msg=0x2b9857099070,?sz=9)?at?service-src/service_snlua.c:125
#
2??0x0000000000409546?in?dispatch_message?(ctx=0x2b98570540f0,?msg=0x420030e0)?at?skynet-src/skynet_server.c:254
#
3??0x00000000004096c4?in?skynet_context_message_dispatch?(sm=0x2b9857016440,?q=0x2b98570530c0,?weight=-1)?at?skynet-src/skynet_server.c:308
#
4??0x000000000040a98f?in?_worker?(p=0x7fff54a5f8d0)?at?skynet-src/skynet_start.c:128


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品一级| 欧美在线视频观看免费网站| 国产一区二区三区高清在线观看| 欧美激情综合五月色丁香| 久久9热精品视频| 亚洲一区二区三区精品视频| 亚洲激情影院| 久热成人在线视频| 欧美自拍偷拍| 午夜日韩在线| 亚洲一区二区三区视频| 日韩一区二区高清| 亚洲国产毛片完整版| 黄色精品一区| 国产区日韩欧美| 国产精品视频一二三| 欧美系列电影免费观看| 欧美日韩国产一区二区三区地区| 免费成人av| 蜜臀av一级做a爰片久久| 久久久久免费观看| 久久成人综合视频| 欧美与欧洲交xxxx免费观看 | 欧美一区二区三区四区在线 | 欧美一区二区三区在线播放| 亚洲色图自拍| 亚洲无亚洲人成网站77777 | 亚洲国产高清aⅴ视频| 国内揄拍国内精品少妇国语| 国产手机视频精品| 国产一区二区三区免费不卡| 国产日韩欧美精品综合| 国产精品爽黄69| 国产伦精品一区二区三区在线观看| 欧美日韩亚洲综合在线| 欧美性猛交一区二区三区精品| 欧美麻豆久久久久久中文| 欧美日韩极品在线观看一区| 欧美日韩在线观看一区二区| 欧美日韩一区二区在线观看| 欧美性猛交xxxx乱大交退制版| 欧美三区美女| 国产日韩欧美电影在线观看| 国产欧美一区二区精品秋霞影院| 国产亚洲精品久久久| 在线观看亚洲视频| 亚洲精品激情| 亚洲一区二区不卡免费| 欧美在线www| 免费看的黄色欧美网站| 亚洲盗摄视频| 在线亚洲美日韩| 欧美一区二视频在线免费观看| 久久av资源网| 欧美激情1区2区3区| 欧美视频在线观看| 国产亚洲一区二区在线观看| 亚洲第一页自拍| 一本久久知道综合久久| 午夜精品久久久久| 久久综合狠狠综合久久综合88| 欧美激情一二三区| 中文日韩电影网站| 久久精品一区二区三区中文字幕| 欧美风情在线观看| 欧美日韩妖精视频| 国产专区综合网| 亚洲免费黄色| 久久国产88| 亚洲日本免费电影| 欧美一区二区三区免费大片| 欧美成人午夜剧场免费观看| 国产精品久久久久7777婷婷| 一区二区视频欧美| 亚洲少妇一区| 欧美成人免费网站| 亚洲影视在线| 欧美黄色日本| 国产亚洲精品自拍| 在线视频欧美日韩精品| 久久精品夜色噜噜亚洲aⅴ| 亚洲国产日韩欧美综合久久| 亚洲欧美日韩国产| 欧美劲爆第一页| 国内精品久久久久久久97牛牛| 一本久久综合亚洲鲁鲁五月天| 久久riav二区三区| 日韩亚洲视频| 麻豆国产va免费精品高清在线| 国产精品午夜视频| 亚洲美女在线看| 久久久久在线观看| 亚洲无线观看| 欧美激情综合五月色丁香| 韩国av一区二区三区四区| 亚洲一区二区三区久久 | 亚洲日本aⅴ片在线观看香蕉| 性久久久久久久久| 亚洲精选久久| 免费欧美日韩| 在线日本高清免费不卡| 久久动漫亚洲| 亚洲视频一区二区免费在线观看| 欧美电影免费观看| 亚洲福利视频二区| 噜噜噜噜噜久久久久久91| 亚洲欧美日韩国产| 国产精品久久久久久久久搜平片 | 一个人看的www久久| 牛牛影视久久网| 曰韩精品一区二区| 久久综合成人精品亚洲另类欧美| 亚洲女同在线| 国产精品日韩久久久| 亚洲一区成人| 99精品久久久| 欧美视频一区二区三区四区| 99re热精品| 亚洲精品久久久久久久久| 欧美freesex交免费视频| 亚洲电影自拍| 欧美国产日本高清在线| 久久综合中文色婷婷| 一区二区三区在线观看欧美| 久久裸体视频| 久久久免费精品视频| 在线免费观看视频一区| 米奇777超碰欧美日韩亚洲| 久久亚洲精品中文字幕冲田杏梨| 韩国久久久久| 欧美成年人网| 欧美成ee人免费视频| 日韩一区二区精品葵司在线| 91久久精品国产| 欧美日韩精品三区| 亚洲性感美女99在线| 亚洲在线不卡| 国语自产偷拍精品视频偷| 美女主播一区| 欧美激情视频在线播放| 亚洲久久视频| 亚洲天堂视频在线观看| 国产美女精品| 蜜桃精品久久久久久久免费影院| 久久视频在线免费观看| 亚洲美女啪啪| 亚洲视频每日更新| 国产亚洲一二三区| 欧美电影电视剧在线观看| 欧美精品一区二区三区久久久竹菊 | 蜜桃久久精品乱码一区二区| 欧美成年人在线观看| 亚洲色图在线视频| 午夜精品在线| 亚洲国产欧美不卡在线观看 | 久久久91精品国产| 亚洲精选在线观看| 亚洲一区二区三区欧美| 欲香欲色天天天综合和网| 亚洲国产精品福利| 国产精品久久久久久久9999| 久久久久久有精品国产| 欧美成人情趣视频| 性欧美8khd高清极品| 久久五月天婷婷| 亚洲视频自拍偷拍| 久久九九久精品国产免费直播 | 亚洲男人第一av网站| 亚洲国产精品黑人久久久| 99视频精品| 在线观看欧美激情| 99国产精品99久久久久久粉嫩| 国产一区二区三区精品欧美日韩一区二区三区 | 在线观看成人av电影| 日韩香蕉视频| 在线电影国产精品| 中文在线一区| 亚洲精品永久免费精品| 欧美一级久久久| 亚洲视频网在线直播| 久久久久一区二区三区| 亚洲欧美日韩综合aⅴ视频| 老鸭窝亚洲一区二区三区| 欧美一区二区啪啪| 欧美人在线视频| 蜜臀av国产精品久久久久| 国产精品久久久久9999| 亚洲国产美女精品久久久久∴| 国产欧美一区二区三区久久| 亚洲精品社区| 亚洲福利在线视频| 欧美一级专区免费大片| 亚洲视频中文| 欧美sm极限捆绑bd| 可以看av的网站久久看| 国产女主播在线一区二区| 99riav1国产精品视频| 亚洲精品免费在线播放| 久久精品日产第一区二区三区 | 国产欧美日韩麻豆91|