首页 > 其他分享 >lua/c开发:c-object for lua

lua/c开发:c-object for lua

时间:2024-03-23 14:23:03浏览次数:20  
标签:struct psl object lua 开发 sl release skiplist

c+lua开发中常见的实现:c库实现功能,供lua调用;

比如排行榜模块(跳表),实现方案可为:c库实现跳表(skip list)核心逻辑,提供接口供lua层中操作使用;
那么c库显然有以下的实现(伪码,演示用):

// skip list core
struct skiplist {
    // ...
};

struct skiplist * skiplist_create();
void skiplist_release(struct skiplist * instance);
// ...

// interface for lua
static int 
_new(lua_State *L) {
    struct skiplist *psl = skiplist_create(/* param */);
    struct skiplist **sl = (skiplist**) lua_newuserdata(L, sizeof(skiplist*));
    *sl = psl;
    lua_pushvalue(L, lua_upvalueindex(1));
    lua_setmetatable(L, -2);

    return 1;
}
static int
_release(lua_State *L) {
    struct skiplist **psl = lua_touserdata(L, 1);
    struct skiplist *sl = *psl;
    skiplist_release(sl);
    return 0;
}

// lib open func
int luaopen_skiplist(lua_State *L) {
    luaL_Reg l[] = {
        // ...
    };
    
    lua_createtable(L, 0, 2);

    luaL_newlib(L, l);
    lua_setfield(L, -2, "__index");
    lua_pushcfunction(L, _release);
    lua_setfield(L, -2, "__gc");

    lua_pushcclosure(L, _new, 1);
    return 1;
}

可以看到,对象在c库中创建,通过lua的full userdata保存c对象的指针,交由lua层使用,userdata设置gc元方法(调用c对象的销毁函数),在userdata被回收时正确地触发对象释放。

标签:struct,psl,object,lua,开发,sl,release,skiplist
From: https://www.cnblogs.com/linxx-/p/18091068

相关文章

  • lua/c开发:lua增加自定义require方式
    我们会有需要自定义加载模块逻辑的需求,比如支持从自定义格式数据包中加载一个被加密过的lua文件的方式,这在生产环境中非常常见,可以有效保护源码同时保持整洁;lua模块管理库会从若干个loader中逐个尝试加载模块,lua原生提供了4个loader;staticconstlua_CFunctionsearchers[]={......
  • lua/c开发:只读数据共享方案
    这里只讨论单一进程内的只读数据共享。同一进程内虚拟内存空间是原本就共享的(以C为例),但在业务开发上,一般会嵌入脚本语言,使用VM的沙盒环境独立维护不同的上下文(以lua为例),多个VM之间(暂时称为业务VM)的数据相互独立。业务上涉及数据共享的,一般的场景是优化性能、资源占用的情况。需......
  • 游戏开发:服务器部署监控告警
    线上服务器的监控告警,我们暂且从三个层级上分析;业务层:业务相关的日志告警机制。跟业务设计强相关,比如客户端的业务上行请求数据异常之类的告警,业务上定义日志级别(INFO/WARN/ERROR),输出到指定日志文件并通过业务层逻辑抛出,数据分析的埋点、业务行为相关的辅助日志都在这里实现;一套......
  • 【消息队列开发】 实现 VirtualHostTests 类——测试虚拟主机操作
    文章目录......
  • STM32之HAL开发——启动文件详解【精华版】
    启动文件介绍启动文件是使用机器认识的汇编语言,由汇编编写,是系统上电复位后第一个执行的程序,经过一些必要的配置,最终能够调用main函数,使得用户程序能够在MCU上正常运行起来的必备文件。无论是是何种MCU,从简单的51,MSP430,到ARM9,ARM11,A7都必须有启动文件,因为对于嵌入式......
  • STM32之HAL开发——点灯大师
    点灯步骤注意:本次点灯操作分为俩种,一种为低级点灯——HAL库点灯,一种为高级高效点灯——寄存器点灯。引脚时钟开启__HAL_RCC_GPIOX_CLK_ENABLE()引脚初始化/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDefGPIO_InitStruct;/*选择要控制的GPIO......
  • 物流综合管理系统的设计与开发
    第1章绪论1.1研究背景及意义二十一世纪,随着科学技术的发展、消费模式的进步和消费水平的提高,企业之间的竞争日益加剧,并朝着横向整合、纵向合作-竞争合作的复合方式发展。企业的竞争优势已经不再仅仅是产品质量和价格。高新技术的应用程度以及供应链的运行管理水平成为衡......
  • FFmpeg开发笔记(七)欧拉系统编译安装FFmpeg
    FFmpeg支持Linux、macOS、Windows、Android等操作系统,其中Linux系列包括Ubuntu、Debian、Mint、CentOS、RHEL、Fedora等分支。FFmpeg官网的编译入口地址为https://trac.ffmpeg.org/wiki/CompilationGuide,在这里可以找到FFmpeg对各系统的编译说明。更多详细的FFmpeg开发知识参见《F......
  • 鸿蒙开发,使用http返回的响应数据无法正常获取 ,利用hilog打印日志一直结果是object或者
    项目场景:这里简述项目相关背景:前后端分离项目,使用鸿蒙做前端,后端SpringBoot写好接口(通过商品分类id查询商品列表),鸿蒙前端页面使用Tabs组件导航,展示商品分类,点击分类标签,查询后端接口,返回对应分类商品列表数据项目场景:鸿蒙开发,使用http返回的响应数据无法正常获取,利用hilo......
  • 海外客户开发软件
    海外客户开发软件主要是指那些帮助企业在全球范围内寻找潜在客户,进行市场拓展、销售线索挖掘的工具。以下是一些常用的海外客户开发软件:易谷歌地图数据采集大师:基于谷歌地图的采集工具,可以采集任意国家、任意地区的公司地址、电话号码、邮件地址等数据。可以批量输入关键词......