Lua全局状态机

本文内容基于版本:Lua 5.3.0

global_State与lua_State结构的关联



通过luaL_newstate函数创建虚拟机时,第一块申请的内存将用来存储lua_State(主线程)和global_State(全局状态机)实例。为了避免内存碎片的产生,同时减少内存分配和释放的次数,Lua采用了一个小技巧:利用一个LG结构,把分配lua_Stateglobal_State的行为关联在一起。

// luaconf.h
/*
@@ LUA_EXTRASPACE defines the size of a raw memory area associated with
** a Lua state with very fast access.
** CHANGE it if you need a different size.
*/
#define LUA_EXTRASPACE        (sizeof(void *))

// lstate.c
/*
** thread state + extra space
*/
typedef struct LX {
  lu_byte extra_[LUA_EXTRASPACE];
  lua_State l;
} LX;

/*
** Main thread combines a thread state and the global state
*/
typedef struct LG {
  LX l;
  global_State g;
} LG;
时间: 2024-11-08 04:52:47

Lua全局状态机的相关文章

ngx lua模块源码简单解析

ngx lua模块源码简单解析分类: nginx 2014-07-11 11:45 2097人阅读 评论(0) 收藏 举报nginxlua数据结构架构目录(?)[+]对nginx lua模块的整个流程,原理简单解析.由于nginx lua模块相关配置,指令,API非常多,所以本文档只以content_by_lua指令举例说明. 读本文档最好配合读源码. 不适合对nginx和lua一点都不了解的人看.1.相关配置详细配置见 https://github.com/openresty/lua-ngin

Lua 5.1 参考手册

Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes 云风 译 www.codingnow.com Copyright © 2006 Lua.org, PUC-Rio. All rights reserved. 1 - 介绍 Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施. Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持.

lua参考手册02—程序接口

3 - 程序接口(API) 这个部分描述了 Lua 的 C API , 也就是宿主程序跟 Lua 通讯用的一组 C 函数. 所有的 API 函数按相关的类型以及常量都声明在头文件 lua.h 中. 虽然我们说的是“函数”,但一部分简单的 API 是以宏的形式提供的. 所有的这些宏都只使用它们的参数一次 (除了第一个参数,也就是 lua 状态机), 因此你不需担心这些宏的展开会引起一些副作用. 在所有的 C 库中,Lua API 函数都不去检查参数的有效性和坚固性. 然而,你可以在编译 Lua 时

菜鸟入门之lua与c++相互调用(包含多个demo)

前两篇文章中,已经介绍了使用vs2010编译lua5.1源码生成lua.lib 和 vs项目中使用c++调用lua,可以保证demo在vs上运行起来了.这里再详细介绍下c++和lua之间的相互调用以及原理. c++与lua直接的调用,实际上通过一个栈结构来传递数据,该栈结构栈顶的索引值为-1,向栈底方向索引值依次为-1 ,-2......栈顶索引为1.栈结构里可以放函数,表,字符串,整形等各种lua的基本数据. 一.在当前cpp目录下创建test.lua文件,用于与c++交互调用,代码如下: p

lua 源码分析之线程对象lua_State

lua_State 中放的是 lua 虚拟机中的环境表.注册表.运行堆栈.虚拟机的上下文等数据. 从一个主线程(特指 lua 虚拟机中的线程,即 coroutine)中创建出来的新的 lua_State 会共享大部分数据,但会拥有一个独立的运行堆栈.所以一个线程对象拥有一个lua_State. (ps:lua 的coroutine的使用参考: http://blog.csdn.NET/wusheng520/article/details/7954666) lua_State共享的数据部分是全局状

Lua内存管理

本文分析基于的Lua版本为:Lua 5.3.0 Lua内存管理器规约 Lua允许用户自定义内存管理器,并在创建Lua虚拟机时传入.当然该内存管理器必须遵循Lua已定义的行为规则. 我们已经知道创建一个Lua虚拟机需要使用luaL_newstate函数: lua_State *L = luaL_newstate(); luaL_newstate函数内部实现主要是调用lua_newstate函数,lua_newstate函数将会接受一个内存分配器作为参数,进而在内部分配内存: // lauxlib.

Lua 常用函数 一

http://blog.csdn.net/xuzhonghai/article/details/7239195 lua_getallocf lua_Alloc lua_getallocf (lua_State *L, void **ud); 返回给定状态机的内存分配器函数.如果 ud 不是 NULL ,Lua 把调用lua_newstate 时传入的那个指针放入*ud . lua_getfenv void lua_getfenv (lua_State *L, int index); 把索引处值的

Lua 与 Redis

Lua 与 Redis 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis - 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚本实现 private boolean accessLimit(String ip, int limit, int time, Jedis jedis) { boolean result = true; String key = "rate.li

Cocos2dx-Lua与C++混合使用

本文转载于http://www.cnblogs.com/zisou/p/cocos2dx-lua1.html 上面一个问题我觉得在我们使用Lua之前需要深入思考的,Lua有何优点?缺点又是什么?先找准自己的项目定位 在什么时候使用是很必要的: 经过自己一番摸索之后有如下结论: 优点: 1,嵌入式脚本开发可以跳过平台市场进行独立的游戏资源更新: 2,在使用Lua开发能降低在使用C++中得指针引用报错,nil类型问题: 3,可以使用Lua表结构来完成面向对象: 还有一个项目定位的问题,那就是开发游戏