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

S.l.e!ep.¢%

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

_init() 函數(shù)分析 (一) 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?}
????
函數(shù)的開始和最后,分別調(diào)了
lua_gc(L,?LUA_GCSTOP,?0); //停止GC 和? lua_gc(L,?LUA_GCRESTART,?0); //重啟GC
是為了保證在整個 service 執(zhí)行邏輯期間中途不會被 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的上半部份, 就是把一些數(shù)據(jù)放到 lua 的狀態(tài)機(
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的內(nèi)部變量,這里告訴lua不使用環(huán)境變量?

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



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

在lua中調(diào)用C的函數(shù),lua提供了一種方法,是這樣的, 但是呢, 也可以這樣來用

lua_pop(L,1); 這句未知意圖,難道是調(diào)用 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.

大概意思,從堆棧彈出一個值,設(shè)置到全局的 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實際上也是調(diào)用 lua_setfield 放到一個 LUA_RIDX_GLOBALS 的表里而已


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

這兩句將一個C函數(shù)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>
            午夜精品婷婷| 欧美亚洲一级| 久久国产天堂福利天堂| 一区二区三区日韩在线观看| 亚洲人成网站在线观看播放| 91久久夜色精品国产九色| 亚洲激情影视| 亚洲图片欧洲图片日韩av| 亚洲欧美日本日韩| 久久久噜久噜久久综合| 久久国产精品久久久久久电车| 99爱精品视频| 亚洲人成网站在线播| 91久久精品国产| 亚洲精品一区二区三区在线观看 | 欧美日韩国产一区二区| 久久亚洲私人国产精品va| 久久精品国产亚洲高清剧情介绍 | 亚洲男人的天堂在线aⅴ视频| 亚洲国产精品悠悠久久琪琪| 1000部国产精品成人观看| 在线免费一区三区| 亚洲九九精品| 亚洲系列中文字幕| 欧美一级视频精品观看| 欧美一区中文字幕| 麻豆av福利av久久av| 亚洲精品韩国| 一区二区日本视频| 久久精品国产综合| 欧美日韩中文字幕日韩欧美| 国产在线欧美| 亚洲男人的天堂在线| 欧美a级一区二区| 亚洲色图制服丝袜| 猛干欧美女孩| 国产在线日韩| 免费欧美网站| 亚洲免费福利视频| 久久久久久久网站| 国产精品网站一区| 在线一区欧美| 亚洲激情在线播放| 久久一区欧美| 国内精品久久久久久| 亚洲一区二区精品在线| 亚洲国产欧洲综合997久久| 久久精品国产清高在天天线 | 欧美成人精品不卡视频在线观看| 欧美视频一区二区在线观看| 在线看日韩av| 久久久久国产精品一区三寸| 亚洲最新视频在线| 欧美精品aa| 日韩视频免费大全中文字幕| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲在线日韩| 国产精品视频九色porn| 亚洲一区二区三区在线| 亚洲巨乳在线| 欧美日韩一区二区在线观看视频 | 亚洲综合精品一区二区| 91久久夜色精品国产网站| 美女成人午夜| 在线观看国产精品淫| 久久伊伊香蕉| 老鸭窝亚洲一区二区三区| 樱桃国产成人精品视频| 农村妇女精品| 美女视频黄 久久| 亚洲高清在线播放| 亚洲激情第一区| 欧美日韩一区二区三区四区五区| 亚洲无限av看| 亚洲欧美视频一区二区三区| 国产欧美另类| 美女图片一区二区| 欧美国产大片| 亚洲桃色在线一区| 午夜一区不卡| 黄色一区二区三区| 欧美激情成人在线视频| 欧美福利视频| 午夜精品偷拍| 久久久www成人免费精品| 91久久国产综合久久蜜月精品 | 久久成人18免费观看| 欧美影院视频| 亚洲大片av| 99re热这里只有精品免费视频| 国产精品成人一区二区三区吃奶| 欧美一区二区三区在线看| 久久av在线看| 亚洲最新在线视频| 亚洲在线电影| 在线观看久久av| 亚洲免费福利视频| 狠狠色狠狠色综合日日小说| 欧美高清不卡在线| 国产精品福利网| 韩国av一区二区三区| 日韩西西人体444www| 亚洲一区精品视频| 亚洲高清色综合| 亚洲一区二区视频在线观看| 在线免费日韩片| 午夜亚洲一区| 亚洲视频在线观看视频| 久久久久久久999精品视频| 亚洲视频播放| 裸体女人亚洲精品一区| 午夜在线精品偷拍| 欧美巨乳在线观看| 欧美成人精品激情在线观看| 国产精品视频一区二区三区| 亚洲高清自拍| 在线不卡免费欧美| 亚洲欧美日韩一区二区三区在线| 亚洲精品日韩激情在线电影| 亚洲欧美日韩一区二区三区在线观看 | 亚洲伦理自拍| 国产综合色精品一区二区三区| 亚洲黄色在线观看| 亚洲国产精品第一区二区三区 | 最新国产成人av网站网址麻豆 | 国产精品二区在线| 亚洲国产天堂久久国产91| 国内成人在线| 欧美在线地址| 久久精品国产第一区二区三区| 国产精品国产三级国产| 亚洲精选成人| av成人手机在线| 欧美日韩精品一区二区| 亚洲国产精品久久久久| 亚洲国产欧美一区二区三区丁香婷| 久久国产精品黑丝| 玖玖精品视频| 亚洲国产精品久久久久秋霞影院| 久久精品三级| 欧美77777| 亚洲激情网址| 欧美精品性视频| 日韩视频中文| 亚洲午夜高清视频| 国产精品成人播放| 亚洲欧美中文另类| 久久精品道一区二区三区| 国产亚洲在线| 久久在线视频| 欧美国产第二页| 9l视频自拍蝌蚪9l视频成人| 欧美激情第六页| 在线午夜精品自拍| 久久丁香综合五月国产三级网站| 国产日韩精品一区观看| 欧美在线观看www| 欧美v亚洲v综合ⅴ国产v| 亚洲丰满在线| 欧美日韩在线不卡一区| 亚洲一区激情| 欧美激情中文不卡| 亚洲国产精品一区二区www在线| 久久深夜福利| 亚洲黄网站在线观看| 欧美日韩精品一区| 午夜在线一区二区| 欧美v国产在线一区二区三区| 亚洲精品在线三区| 国产精品色在线| 久久综合图片| 99精品欧美一区二区三区| 午夜久久影院| 亚洲国产美女久久久久| 欧美激情综合在线| 午夜视频久久久| 欧美激情视频一区二区三区在线播放| 在线一区日本视频| 精品动漫av| 国产精品国产自产拍高清av王其| 久久国产福利国产秒拍| aa亚洲婷婷| 欧美成人日韩| 香港久久久电影| 亚洲精品免费一二三区| 国产精品一区在线观看| 欧美国产精品中文字幕| 亚洲欧美成人一区二区三区| 欧美激情在线观看| 久久一本综合频道| 亚洲免费在线播放| 91久久精品一区二区三区| 国产精品亚洲美女av网站| 欧美国产一区二区在线观看| 欧美一区二区三区喷汁尤物| 亚洲精品久久久久久下一站| 久久噜噜亚洲综合| 性久久久久久久久| 中文av一区特黄| 日韩午夜三级在线|