首页 > 其他分享 >lua/c开发:c库共享运行时状态

lua/c开发:c库共享运行时状态

时间:2024-03-23 14:23:18浏览次数:23  
标签:void lua static key 注册表 共享 全局 运行

场景是多个c扩展库(for lua)之间需要共享运行时的状态数据,期望是不使用lua逻辑介入;

记录一个方案:通过lua全局注册表

C扩展库中一些数据通过全局注册表放入lua状态机。最方便且能保证唯一性的 key 是一个 light userdata。使用一个static 变量的地址作为 key 在注册表做索引保存需要的值:

/* libA */
static const void * key = 0;
const char * signature = "LINXX(LUA5.3)";

/* 保存数据到lua全局注册表 */
int
lsignnature(lua_State * L) {
    lua_pushlightuserdata(L, (void *)&key);
    lua_pushstring(L, signature);
    lua_settable(L, LUA_REGISTRYINDEX);
    return 0;
}

其他扩展库可以通过访问lua全局表获取到key对应的值,这里key是static变量,在当前进程中一定拥有惟一的地址,且 lightuserdata 作 key 非常高效。(这里需要把static变量暴露出来);

/* libB */

/* 从全局注册表中读取数据 */
int
lkey(lua_State * L) {
    lua_pushlightuserdata(L, (void *)&key);
    lua_gettable(L, LUA_REGISTRYINDEX);
    printf("signature:%s\n", lua_tostring(L, -1));
    return 1;
}

标签:void,lua,static,key,注册表,共享,全局,运行
From: https://www.cnblogs.com/linxx-/p/18091070

相关文章

  • lua/c开发:c-object for lua
    c+lua开发中常见的实现:c库实现功能,供lua调用;比如排行榜模块(跳表),实现方案可为:c库实现跳表(skiplist)核心逻辑,提供接口供lua层中操作使用;那么c库显然有以下的实现(伪码,演示用)://skiplistcorestructskiplist{//...};structskiplist*skiplist_create();voidskipli......
  • lua/c开发:lua增加自定义require方式
    我们会有需要自定义加载模块逻辑的需求,比如支持从自定义格式数据包中加载一个被加密过的lua文件的方式,这在生产环境中非常常见,可以有效保护源码同时保持整洁;lua模块管理库会从若干个loader中逐个尝试加载模块,lua原生提供了4个loader;staticconstlua_CFunctionsearchers[]={......
  • lua/c开发:只读数据共享方案
    这里只讨论单一进程内的只读数据共享。同一进程内虚拟内存空间是原本就共享的(以C为例),但在业务开发上,一般会嵌入脚本语言,使用VM的沙盒环境独立维护不同的上下文(以lua为例),多个VM之间(暂时称为业务VM)的数据相互独立。业务上涉及数据共享的,一般的场景是优化性能、资源占用的情况。需......
  • 代码运行后的空白结果
    下面的代码问题是因为把6、7行写反了,互换一下即可。因为是要先把用用户需要打印的结果运行出来,然后再利用导入的scanner包,进行if判断。1importjava.util.Scanner;23publicclassfirstClass{4publicstaticvoidmain(String[]args){5......
  • django《大学计算机》课程思政资源共享平台(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今信息化社会,教育领域正逐渐实现数字化转型,其中课程资源的共享与利用成为提高教学效率和质量的关键。特别是对于《大学计算机》这类基础且重要的课程,构......
  • Android开发笔记[16]-简单使用wasmedge运行时
    摘要使用wasmedge运行时在Android实现"容器化"运行,将fibonacci计算函数打包进入wasm然后打包进入APK中.关键信息AndroidStudio:Iguana|2023.2.1Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zipjvmTarget='1.8'minSdk24targe......
  • Windows中控制台(cmd)模式下运行程序卡死/挂起现象解决方案(快速编辑模式)
    最近在运行编译好的exe文件时,发现了一个现象,就是通过cmd运行exe文件或者双击执行运行exe文件,偶尔会出现程序没有执行的情况。最开始发现这个现象时,还以为是程序出现了什么Bug。后面经过网上查询才知道,原始这一切都是控制台(cmd)模式下快速编辑模式捣的鬼。可能大家平常没有接触到,......
  • Vue和SpringBoot实现的通用商城系统,高质量毕业论文范例,附送源码、数据库脚本,项目导入
    1.项目技术栈前端必学三个基础:“HTML、CSS、JS”,基本每个B/S架构项目都要用到,基础中的基础。此外项目页面使用Vue等前端框架技术。后端使用Java主流的框架 SpringBoot,使用MySQL数据库,是一个JavaWEB进阶学习的好资源。2.适合对象Java初学者、Java课题设计、Java毕业设......
  • QT 智能指针 QPointer QScopedPointer QSharedPointer QWeakPointer QSharedDataPoint
    QPointerQPointer是一种受保护的指针,当其引用的对象被销毁时,它会被自动清除(但是,销毁引用对象还是必须手动delete)。QPointer所指向的对象必须是QObject或其派生类对象。当多个指针指向同一个Object对象时,引用的对象可能被释放掉,这时使用QPointer就可以安全的测试引用对象是......
  • 运行onlyOffice官方java-spring demo的必要参数和文件
    运行onlyOffice官方java-spring时报错从网络上没有找到相应的文章故做下笔记properties的参数修改server.version=1.8.0//配置自己的ip(如配置只能使用ip访问localhost失效)server.address=192.168.56.1server.port=4000filesize-max=5242880filename-max=50//文件存......