• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            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.¢% 閱讀(673) 評論(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
            是為了保證在整個(gè) service 執(zhí)行邏輯期間中途不會(huì)被 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)機(jī)(
            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標(biāo)準(zhǔn)庫



            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.

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


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

            這兩句將一個(gè)C函數(shù)push到堆棧?然后 lua_gettop() 判斷下? 這里為何沒有 pop? 用意暫時(shí)不清楚
            四虎久久影院| 麻豆AV一区二区三区久久| 亚洲精品蜜桃久久久久久| 久久精品日日躁夜夜躁欧美| 一97日本道伊人久久综合影院| 人妻丰满?V无码久久不卡| 精品熟女少妇AV免费久久 | 久久精品成人免费观看97| 久久亚洲电影| 久久99精品久久久久子伦| 久久综合九色综合久99| 奇米影视7777久久精品人人爽| 久久青青草原亚洲av无码app| 久久久WWW成人免费毛片| 久久精品蜜芽亚洲国产AV| 久久精品国产一区二区三区不卡 | 久久精品无码一区二区三区免费| 一本久道久久综合狠狠躁AV| 国产精品久久精品| 久久免费看黄a级毛片| 色综合久久天天综线观看| 九九久久99综合一区二区| 新狼窝色AV性久久久久久| 久久精品亚洲精品国产欧美| 九九久久自然熟的香蕉图片| 性做久久久久久久久老女人| 久久国产精品久久精品国产| 少妇人妻88久久中文字幕| 亚洲伊人久久成综合人影院| 一本大道加勒比久久综合| 996久久国产精品线观看| 久久久久人妻精品一区二区三区| 久久久久99这里有精品10| 久久九九久精品国产| 久久AⅤ人妻少妇嫩草影院| 99久久久国产精品免费无卡顿| 久久久久久国产精品美女| 久久天天躁狠狠躁夜夜2020一 | 久久亚洲国产精品成人AV秋霞| 久久久久亚洲精品天堂久久久久久 | 91久久精品91久久性色|