lua_State和luaL_newstate,luaL_openlibs及lua_close

转载 2013年12月05日 12:52:43

1,lua_State在Lua中的定义如下:
 struct lua_State {
      CommonHeader;
      lu_byte status;
      StkId top;  /* first free slot in the stack */
      global_State *l_G;
        CallInfo *ci;  /* call info for current function */
        const Instruction *oldpc;  /* last pc traced */
        StkId stack_last;  /* last free slot in the stack */
        StkId stack;  /* stack base */
        int stacksize;
        unsigned short nny;  /* number of non-yieldable calls in stack */
        unsigned short nCcalls;  /* number of nested C calls */
        lu_byte hookmask;
        lu_byte allowhook;
        int basehookcount;
        int hookcount;
        lua_Hook hook;
        GCObject *openupval;  /* list of open upvalues in this stack */
        GCObject *gclist;
        struct lua_longjmp *errorJmp;  /* current error recover point */
        ptrdiff_t errfunc;  /* current error handling function (stack index) */
        CallInfo base_ci;  /* CallInfo for first level (C calling Lua) */
         };

2,lua_State的生成

        不知道是不是老的版本,我在网上看到有网友的例子里这样写:
   lua_State *L = lua_open();  /* opens Lua */
        我下了Lua5.2编译后执行例子是不行的,找了lua源码也没有找到lua_open()的定义。暂不论它,现在生成lua_State对像的方式应如下:
   lua_State *L = luaL_newstate();
   luaL_newstate在源码中的定义如下:
   LUALIB_API lua_State *luaL_newstate (void) {
     lua_State *L = lua_newstate(l_alloc, NULL);
     if (L) lua_atpanic(L, &panic);
     return L;
   }
3,luaL_openlibs在源码中的定义:
   LUALIB_API void luaL_openlibs (lua_State *L) {
     const luaL_Reg *lib;
     /* call open functions from 'loadedlibs' and set results to global table */
     for (lib = loadedlibs; lib->func; lib++) {
       luaL_requiref(L, lib->name, lib->func, 1);
       lua_pop(L, 1);  /* remove lib */
     }
     /* add open functions from 'preloadedlibs' into 'package.preload' table */
     luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD");
     for (lib = preloadedlibs; lib->func; lib++) {
       lua_pushcfunction(L, lib->func);
       lua_setfield(L, -2, lib->name);
     }
     lua_pop(L, 1);  /* remove _PRELOAD table */
   }
   官方文档说明:Opens all standard Lua libraries into the given state.
   很简单,把所有标准类库加载到指定的虚拟机。疑问:有没有方法指定一个标准库到指定的虚拟机呢?
4,意义
   从网上找到以下一段资料:“Lua脚本的编译执行是相互独立的,在不同的线程上执行。通过luaL_newstate()函数可以申请一个虚拟机,返回指针类型              lua_State。今后其他所有Lua Api函数的调用都需要此指针作为第一参数,用来指定某个虚拟机。”
   中文大家都认识,不多说了,肤浅的认识是lua_State代表一个lua虚拟机对像,luaL_newstate()分配一个虚拟机。lua类库管理着所有的虚拟机。
5,lua_close
   代码:
   LUA_API void lua_close (lua_State *L) {
     L = G(L)->mainthread;  /* only the main thread can be closed */
     lua_lock(L);
     luai_userstateclose(L);
     close_state(L);
   }
   文档说明:
   Destroys all objects in the given Lua state (calling the corresponding garbage-collection metamethods, if any) and frees all dynamic memory used by this state. On several platforms, you may not need to call this function, because all resources are naturally released when the host program ends. On the other hand, long-running programs, such as a daemon or a web server, might need to release states as soon as they are not needed, to avoid growing too large.
   销毁指定虚拟机的所有对像(如果有垃圾回收相关的无方法则会调用该方法)并收回所有由该虚拟机动态分配产生的内存,在有些平台下我们不需要调用此函数,因为当主程序退出时,资源会被自然的释放掉,但是但一个长时间运行的程序,比如后台运行的web服务器,需要立即回收虚拟机资源以避免内存过高占用。

VC++编译lua库 无法解析lua符号问题

extern "C" { #include #include }
  • luozhuang
  • luozhuang
  • 2014年06月10日 10:04
  • 8971

lua 源码分析之线程对象lua_State

思路:  lua_State 中放的是 lua 虚拟机中的环境表、注册表、运行堆栈、虚拟机的上下文等数据。  从一个主线程(特指 lua 虚拟机中的线程,即 coroutine)中创建出来的新的 ...
  • jiayichendddd
  • jiayichendddd
  • 2014年04月22日 13:29
  • 4956

Lua数据结构 — lua_State(六)

作者:罗日健 前面各种Lua的数据类型基本都说得差不多了,剩下最后一个数据类型:lua_State,我们可以认为是”脚本上下文”,主要是包括当前脚本环境的运行状态信息,还会有gc相关的信息。...
  • X805433354
  • X805433354
  • 2014年12月30日 19:44
  • 771

在公司3个月的一些积累

本文不会涉及到任何公司项目等相关的内容,完全是个人平时的积累。lua相关1.pairs 和 ipairs 的区别: pairs可以遍历表中的所有元素,可以返回Nil ipairs则不可以返回nil,只...
  • eclipse_c
  • eclipse_c
  • 2015年11月06日 23:51
  • 575

uLua最新的Unity+Lua热更新解决方案!!!

看了坛子上同学用Kopilua,以为真的跨平台没问题,就实验了安卓手机,然后就开始铺游戏框架,干了一星期到昨晚想起来到ipad上跑跑,然后我跟我的小Demo一起崩溃了。今天搜索luajit,终于在u3...
  • xfnjlove
  • xfnjlove
  • 2014年09月23日 17:47
  • 2230

Lua数据结构 — lua_State(六)

作者:罗日健 前面各种Lua的数据类型基本都说得差不多了,剩下最后一个数据类型:lua_State,我们可以认为是”脚本上下文”,主要是包括当前脚本环境的运行状态信息,还会有gc相关的信息。...
  • hualucky
  • hualucky
  • 2014年07月14日 17:05
  • 509

Lua和C++交互详细总结_4_Lua调用C++

1.我们编写了averageFunc求平均值和sayHelloFunc函数, 2.然后把函数封装myLib数组里面,类型必须是luaL_Reg 3.由luaopen_mLualib函数导出并在lua中...
  • heyuchang666
  • heyuchang666
  • 2016年06月08日 15:49
  • 1630

C遍历lua的table

方法1、当index为正值的时候,可用如下代码: 注意:t>0 void printtb(lua_State *L,int tb_index) {     /* table is in the st...
  • appletreesujie
  • appletreesujie
  • 2013年11月18日 14:21
  • 2897

VS2012以上版本 C++环境查看 lua5.1 栈/Global/Registry的可视化器

http://schemas.microsoft.com/vstudio/debugger/natvis/2010">            lua_State           top-b...
  • superzmy
  • superzmy
  • 2014年11月19日 02:19
  • 1528

C++与Lua5.3.2的相互调用

重Lua官网下载最新的Lua5.3.2解压后把src文件下的所有文件(Lua.c,Luac.c除外)复制到项目的目录下,并添加到项目中,创建一个Lua脚本文件--region *.lua --Da...
  • u010154424
  • u010154424
  • 2016年04月28日 16:51
  • 529
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:lua_State和luaL_newstate,luaL_openlibs及lua_close
举报原因:
原因补充:

(最多只允许输入30个字)