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

S.l.e!ep.¢%

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

_init() 函數分析 (一) 2014.11.04

Posted on 2014-11-04 21:23 S.l.e!ep.¢% 閱讀(684) 評論(0)  編輯 收藏 引用 所屬分類: Skynet
?1?static?int
?2?_init(struct?snlua?*l,?struct?skynet_context?*ctx,?const?char?*?args,?size_t?sz)?{
?3?????lua_State?*L?=?l->L;
?4?????l->ctx?=?ctx;
?5?????lua_gc(L,?LUA_GCSTOP,?0);?
?6?????lua_pushboolean(L,?1);??/*?signal?for?libraries?to?ignore?env.?vars.?*/
?7?????lua_setfield(L,?LUA_REGISTRYINDEX,?"LUA_NOENV");
?8?????luaL_openlibs(L);
?9?????lua_pushlightuserdata(L,?ctx);
10?????lua_setfield(L,?LUA_REGISTRYINDEX,?"skynet_context");
11?????luaL_requiref(L,?"skynet.codecache",?codecache?,?0);
12?????lua_pop(L,1);
13?
14?????const?char?*path?=?optstring(ctx,?"lua_path","./lualib/?.lua;./lualib/?/init.lua");
15?????lua_pushstring(L,?path);
16?????lua_setglobal(L,?"LUA_PATH");
17?????const?char?*cpath?=?optstring(ctx,?"lua_cpath","./luaclib/?.so");
18?????lua_pushstring(L,?cpath);
19?????lua_setglobal(L,?"LUA_CPATH");
20?????const?char?*service?=?optstring(ctx,?"luaservice",?"./service/?.lua");
21?????lua_pushstring(L,?service);
22?????lua_setglobal(L,?"LUA_SERVICE");
23?????const?char?*preload?=?skynet_command(ctx,?"GETENV",?"preload");
24?????lua_pushstring(L,?preload);
25?????lua_setglobal(L,?"LUA_PRELOAD");
26?
27?????lua_pushcfunction(L,?traceback);
28?????assert(lua_gettop(L)?==?1);
29?
30?????const?char?*?loader?=?optstring(ctx,?"lualoader",?"./lualib/loader.lua");
31?
32?????int?r?=?luaL_loadfile(L,loader);
33?????if?(r?!=?LUA_OK)?{
34?????????skynet_error(ctx,?"Can't?load?%s?:?%s",?loader,?lua_tostring(L,?-1));
35?????????_report_launcher_error(ctx);
36?????????return?1;
37?????}
38?????lua_pushlstring(L,?args,?sz);
39?????r?=?lua_pcall(L,1,0,1);
40?????if?(r?!=?LUA_OK)?{
41?????????skynet_error(ctx,?"lua?loader?error?:?%s",?lua_tostring(L,?-1));
42?????????_report_launcher_error(ctx);
43?????????return?1;
44?????}
45?????lua_settop(L,0);
46?
47?????lua_gc(L,?LUA_GCRESTART,?0);?
48?
49?????return?0;
50?}
????
函數的開始和最后,分別調了
lua_gc(L,?LUA_GCSTOP,?0); //停止GC 和? lua_gc(L,?LUA_GCRESTART,?0); //重啟GC
是為了保證在整個 service 執行邏輯期間中途不會被 gc?


lua_pushboolean(L,?1);??/*?signal?for?libraries?to?ignore?env.?vars.?*/
lua_setfield(L,?LUA_REGISTRYINDEX,?"LUA_NOENV");

lua_pushlightuserdata(L,?ctx);
lua_setfield(L,?LUA_REGISTRYINDEX,?"skynet_context");

這四句可以參考 這篇BLOG的上半部份, 就是把一些數據放到 lua 的狀態機(
lua_State)中
"LUA_NOENV" 和 "skynet_context" 分別是 key
LUA_NOENV? ===> 1
skynet_context ===> ctx

在其它地方獲取的代碼
lua_getfield(L, LUA_REGISTRYINDEX, "skynet_context");
??? struct skynet_context *ctx = lua_touserdata(L,-1);
??? if (ctx == NULL) {
??? ??? return luaL_error(L, "Init skynet context first");
??? }
在 \lualib-src\lua-skynet.c 和 \lualib-src\lua-socket.c 可以找到

至于"LUA_NOENV"是否是lua的內部變量,這里告訴lua不使用環境變量?

luaL_openlibs(L);????//載入所有lua標準庫



luaL_requiref(L,?"skynet.codecache",?codecache?,?0);
lua_pop(L,1);

在lua中調用C的函數,lua提供了一種方法,是這樣的, 但是呢, 也可以這樣來用

lua_pop(L,1); 這句未知意圖,難道是調用 luaL_requiref() 后需要 pop ?



14?????const?char?*path?=?optstring(ctx,?"lua_path","./lualib/?.lua;./lualib/?/init.lua");
15?????lua_pushstring(L,?path);
16?????lua_setglobal(L,?"LUA_PATH");
17?????const?char?*cpath?=?optstring(ctx,?"lua_cpath","./luaclib/?.so");
18?????lua_pushstring(L,?cpath);
19?????lua_setglobal(L,?"LUA_CPATH");
20?????const?char?*service?=?optstring(ctx,?"luaservice",?"./service/?.lua");
21?????lua_pushstring(L,?service);
22?????lua_setglobal(L,?"LUA_SERVICE");
23?????const?char?*preload?=?skynet_command(ctx,?"GETENV",?"preload");
24?????lua_pushstring(L,?preload);
25?????lua_setglobal(L,?"LUA_PRELOAD");

void lua_setglobal (lua_State *L, const char *name);

Pops a value from the stack and sets it as the new value of global name.

大概意思,從堆棧彈出一個值,設置到全局的 name 里去

LUA_API?void?lua_setglobal?(lua_State?*L,?const?char?*var)?{
??Table?
*reg?=?hvalue(&G(L)->l_registry);
??
const?TValue?*gt;??/*?global?table?*/
??lua_lock(L);
??api_checknelems(L,?
1);
??gt?
=?luaH_getint(reg,?LUA_RIDX_GLOBALS);
??setsvalue2s(L,?L
->top++,?luaS_new(L,?var));
??luaV_settable(L,?gt,?L
->top?-?1,?L->top?-?2);
??L
->top?-=?2;??/*?pop?value?and?key?*/
??lua_unlock(L);
}

LUA_API?
void?lua_setfield?(lua_State?*L,?int?idx,?const?char?*k)?{
??StkId?t;
??lua_lock(L);
??api_checknelems(L,?
1);
??t?
=?index2addr(L,?idx);
??setsvalue2s(L,?L
->top++,?luaS_new(L,?k));
??luaV_settable(L,?t,?L
->top?-?1,?L->top?-?2);
??L
->top?-=?2;??/*?pop?value?and?key?*/
??lua_unlock(L);
}

lua_setfield
[
-1,?+0,?e]
void?lua_setfield?(lua_State?*L,?int?index,?const?char?*k);
Does?the?equivalent?to?t[k]?
=?v,?where?t?is?the?value?at?the?given?index?and?v?is?the?value?at?the?top?of?the?stack.
This?function?pops?the?value?from?the?stack.?As?
in?Lua,?this?function?may?trigger?a?metamethod?for?the?"newindex"?event?(see?§2.4)

lua_setglobal
[
-1,?+0,?e]
void?lua_setglobal?(lua_State?*L,?const?char?*name);
Pops?a?value?from?the?stack?and?sets?it?
as?the?new?value?of?global?name.?


lua_setfield 和 lua_setglobal 從源碼上看,? lua_setglobal實際上也是調用 lua_setfield 放到一個 LUA_RIDX_GLOBALS 的表里而已


27?????lua_pushcfunction(L,?traceback);
28?????assert(lua_gettop(L)?==?1);

這兩句將一個C函數push到堆棧?然后 lua_gettop() 判斷下? 這里為何沒有 pop? 用意暫時不清楚
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲永久在线| 一区二区三区.www| 欧美不卡高清| 久久夜色精品国产| 免费不卡欧美自拍视频| 免费日韩精品中文字幕视频在线| 免费看黄裸体一级大秀欧美| 欧美成人四级电影| 欧美日产在线观看| 国产精自产拍久久久久久| 国产亚洲欧美日韩一区二区| 在线欧美电影| 一本色道久久综合一区| 欧美亚洲一区| 欧美国产亚洲另类动漫| 欧美日韩国产欧| 亚洲国产精品尤物yw在线观看| 欧美激情按摩在线| 在线视频欧美日韩精品| 欧美一区二区三区的| 久久字幕精品一区| 欧美午夜精品久久久久久久| 国产婷婷色一区二区三区四区| 亚洲激情成人| 欧美一区二区三区免费视| 欧美激情a∨在线视频播放| 亚洲一区3d动漫同人无遮挡| 久久麻豆一区二区| 欧美三级第一页| 狠狠色丁香久久综合频道| 日韩一区二区电影网| 久久精品青青大伊人av| 亚洲开发第一视频在线播放| 久久亚洲一区| 国产精品久久久久婷婷| 日韩一级大片在线| 美女福利精品视频| 亚洲男人的天堂在线观看| 欧美精选一区| 亚洲区在线播放| 久久女同精品一区二区| 一区二区三区国产精华| 欧美va天堂在线| 樱桃国产成人精品视频| 欧美在线3区| 在线视频日本亚洲性| 欧美精品亚洲精品| 亚洲精品美女| 亚洲国产精品久久| 蜜臀av一级做a爰片久久| 国产一区日韩欧美| 欧美中文在线免费| 亚洲一区二区三区在线看| 欧美日韩国产在线播放| 亚洲精品在线视频| 亚洲高清在线精品| 免费久久精品视频| 亚洲欧洲日韩综合二区| 欧美激情a∨在线视频播放| 久久蜜桃资源一区二区老牛 | 99精品国产在热久久婷婷| 美女任你摸久久| 亚洲国产日韩欧美| 亚洲国产精品一区二区www在线| 久久综合狠狠综合久久激情| 在线观看一区欧美| 欧美成人中文字幕| 欧美va亚洲va国产综合| 亚洲精品在线观看免费| 亚洲精品综合精品自拍| 欧美午夜不卡| 欧美一区国产一区| 久久久亚洲精品一区二区三区| 国产美女一区二区| 久久国内精品自在自线400部| 亚洲一区二区三区久久| 国产精品视频网| 久久精品亚洲国产奇米99| 久久全球大尺度高清视频| 亚洲国产精品久久久久久女王| 欧美超级免费视 在线| 欧美电影免费网站| 亚洲免费在线观看| 久久精品国产v日韩v亚洲| 亚洲国产精品一区二区第四页av| 亚洲国产高清在线观看视频| 欧美日韩一区二区三区在线看| 亚洲欧美日韩系列| 久久久久久久久久久成人| 一区二区电影免费在线观看| 亚洲欧美日韩国产精品| 亚洲国产裸拍裸体视频在线观看乱了中文 | 老司机一区二区三区| 亚洲精品资源| 亚洲欧美中文在线视频| 亚洲黄网站在线观看| 亚洲一区影音先锋| 亚洲人成在线免费观看| 亚洲欧美一区二区激情| 99ri日韩精品视频| 久久精品一区二区三区不卡| 亚洲美女在线看| 久久国产精品久久精品国产| 宅男噜噜噜66国产日韩在线观看| 久久精品亚洲一区二区三区浴池| 99亚洲伊人久久精品影院红桃| 欧美一区二区三区男人的天堂| 亚洲最新在线| 男人天堂欧美日韩| 久久国产婷婷国产香蕉| 欧美精品国产一区二区| 久久久噜噜噜久久| 国产精品乱人伦中文| 亚洲精品美女91| 91久久精品美女| 久久久久久久一区| 久久九九国产精品怡红院| 欧美人与禽猛交乱配| 欧美bbbxxxxx| 激情久久五月| 久久国产精品一区二区三区| 亚洲综合首页| 欧美日韩亚洲系列| 亚洲精品少妇| 日韩一级大片| 欧美精品1区2区3区| 欧美华人在线视频| 亚洲国产日韩一区| 免费观看成人鲁鲁鲁鲁鲁视频| 久久一区二区三区av| 国模精品娜娜一二三区| 欧美一区二区在线看| 西瓜成人精品人成网站| 欧美亚州一区二区三区| 一区二区三区视频在线看| 亚洲小说区图片区| 亚洲日本欧美天堂| 久久久国产精品一区| 久久精品观看| 国产亚洲精品aa午夜观看| 亚洲一区二区久久| 午夜精品久久久久久久男人的天堂| 欧美日精品一区视频| 一本色道婷婷久久欧美| 亚洲女人天堂成人av在线| 国产精品二区在线| 亚洲欧美国产制服动漫| 欧美在线观看天堂一区二区三区 | 免费国产一区二区| 亚洲欧洲一区二区三区在线观看 | 一区二区欧美视频| 国产精品家庭影院| 欧美一区二区三区成人| 欧美阿v一级看视频| 亚洲六月丁香色婷婷综合久久| 欧美精品午夜| 午夜精品美女久久久久av福利| 久久精品国产77777蜜臀| 在线观看久久av| 欧美高清视频一区二区| 亚洲色在线视频| 久久久久九九视频| 日韩视频精品在线观看| 国产精品盗摄久久久| 午夜亚洲性色视频| 欧美国产日韩视频| 亚洲自拍偷拍色片视频| 国产一区91| 欧美日本在线| 久久精品电影| 一本色道**综合亚洲精品蜜桃冫| 久久国产精品久久久久久电车| 亚洲人人精品| 国产综合视频| 国产精品福利av| 免费一区二区三区| 性久久久久久| 一区二区三区偷拍| 亚洲第一视频| 久久久久久高潮国产精品视| 一区二区三区欧美日韩| 在线欧美电影| 国产一区在线视频| 国产精品美女一区二区在线观看| 免费成人小视频| 久久精品成人欧美大片古装| 亚洲午夜精品一区二区| 亚洲国产欧洲综合997久久| 久久久www成人免费毛片麻豆| 在线视频精品一区| 亚洲电影免费观看高清| 国产女主播一区二区三区| 欧美日韩在线直播| 欧美大秀在线观看 | 国产精品毛片高清在线完整版| 久久免费视频一区| 欧美一级淫片aaaaaaa视频| 亚洲少妇自拍| 99精品热视频| 亚洲精品视频二区|