最近由于项目需要读了一下云风老大的hive项目代码,因为对lua只有熟悉的水平,下面的东西必然多多错误:),只为记录。

 lua_State *sL = schedule_newtask(L);
struct cell *c = cell_new(SL, filname);//filename是要加载的lua文件,里面有相关的启动方法,这个函数接下来再说;
...
cell_touserdata(L, lua_upvalueindex(), c);//下面说到
scheduler_starttask(sL);//把sL的cell挂到message_queue上去,详情继续看下面
//至此,启动一个coroutine完成

1.cell_new(lua_State *L, const char *filename)

这个函数会用

 cell_new(...) //创建一个cell结构体 c,
c->L = L // 把L挂到c上去
//然后调用cell_touserdata返回(或新建)一个cell_ud结构体,然后把它放在stack top,将其设置为cell.lib
//(这个表由cell.c模块产生)上key=="self"的value,
...
hive_getenv(L, "system_cell");//得到system cell,然后用`cell_touserdata`把返回的cell_ud设置为cell.lib上key=="system"的value
...
//把cell_new出来的 c 设置为全局表LUA_RESTRYINDEX上KEY==“cell_pointer"的value
//开始加载cell的lua源文件(filename 是使用 package.searchpath(...)搜出来的)
luaL_loadfile(L, filename)

把lua源文件加载进来

lua_pcall(L, , ,)

运行,之后又会压入5个值作为lcallback的upvalue。

2.cell_touserdata(lua_State *L, int index, struct cell *c)

这个函数会先判断L 中 index处的c存不存在 userdata,如果不存在则:

 struct cell_ud * cud = lua_newuserdata(L, sizeof(*cud));//新建一个
...//给 c 的ref引用加1
...//给 cud 设置metatable,设置 '__gc' '__tostring' 'CELL_TAG'等
lua_rawsetp(L, index, c);//将cud设置为index处的value

3.scheduler_starttask(lua_State *L)

先获得L的"message_queue" 和 "cell_pointer",然后把 cell放到 message_queue上去,代码如下:

 struct cell_ud * cud = lua_newuserdata(L, sizeof(*cud));//新建一个
...//给 c 的ref引用加1
...//给 cud 设置metatable,设置 '__gc' '__tostring' 'CELL_TAG'等
lua_rawsetp(L, index, c);//将cud设置为index处的value
ps:"message_queue" "cell_pointer"是与L绑定的

hive源码之新建一个coroutine的更多相关文章

  1. 自定义函数hello,并注册到hive源码中并重新编译

    1 编写自己的udf方法hello package cn.zhangjin.hive.udf; import org.apache.hadoop.hive.ql.exec.Description; i ...

  2. Hive源码解析

    date: 2020-07-08 15:12:00 updated: 2020-08-21 17:38:00 Hive源码解析 入口:hive-cli-1.1.0-cdh5.14.4.jar!/org ...

  3. JVM源码分析之一个Java进程究竟能创建多少线程

    JVM源码分析之一个Java进程究竟能创建多少线程 原创: 寒泉子 你假笨 2016-12-06 概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于L ...

  4. 自己根据java的LinkedList源码编写的一个简单的LinkedList实现

    自己实现了一个简单的LinkedList /** * Create by andy on 2018-07-03 11:44 * 根据 {@link java.util.LinkedList}源码 写了 ...

  5. Hive源码上手及问题解决

    一.编译准备 1.下载源码包 https://github.com/apache/hive/archive/refs/tags/rel/release-2.3.7.zip 或使用git直接拉取 无法解 ...

  6. 源码学习:一个express().get方法的加载与调用

    刚刚接触express,它的中间件确实把我搞得头晕.get的回调中要不要加next?不加载还会执行下一个中间件么?给get指定'/'路径是不是所有以'/'开头的访问在没有确切匹配时都能执行?use件又 ...

  7. 修改jumpserver源码并且实现一个自定义功能模块

    在前面已经说了,如何打开jumpserver的管理控制台并且自定义自己的数据模型.接下来实现一个自定义的功能模块. 先看效果! 一 定义好自己的模型(model) 1.1 这一块儿在前一篇博文已经讲过 ...

  8. [ASP.NET]分析MVC5源码,并实现一个ASP.MVC

    本节内容不是MVC入门教程,主要讲MVC原理,实现一个和ASP.NET MVC类似基本原理的项目. MVC原理是依赖于ASP.NET管道事件基础之上的.对于这块,可阅读上节内容 [ASP.NET]谈谈 ...

  9. Fresco源码解析 - 创建一个ImagePipeline(一)

    在Fresco源码解析 - 初始化过程分析章节中, 我们分析了Fresco的初始化过程,两个initialize方法中都用到了 ImagePipelineFactory类. ImagePipeline ...

随机推荐

  1. 转:如何实现一个malloc

    如何实现一个malloc 转载后排版效果很差,看原文!   任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉. ...

  2. ViewPager onPageChangeListener

    今天在做项目的时候,由于要处理viewPager页面滑动的事件,所以对其进行了一个小小的研究: 首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageC ...

  3. Android之常用Git命令

    Android之常用Git命令 代码修改后提交步骤:git status:查看代码修改状态git diff:查看代码修改细节,也能看代码空格git add . :添加新加入的代码git commit ...

  4. Jquery设置Cookie

    jQuery代码: <script src="js/jquery-1.3.1.js" type="text/javascript"></scr ...

  5. java的前台与后台

    技术上:前台是指web展示,webservice接口等输入输出接口,后台是指支持这些接口的程序. 例如读写数据库,读写文件,业务逻辑处理. 业务上来讲:前台是提供给最终用户使用的界面,后台是指管理使用 ...

  6. b/s 读取多个FTP文件(图片,视频)压缩到服务器 下载到客户端

    其实需求是这样, 要做一键导出, 有图片,有照片,youhtml,存在不同的文件夹,每次下载都必须下载最新数据,因为FTP是随时更新的. 1.这要是一直下载下载,浏览器一直跳窗口,蛋疼的我都看不下去. ...

  7. ios基础篇(三十)—— AFNetworking的使用

    一.AFNetworking的创建 1.新建工程,命名为AFNDemo 2.导入AFNetworking.h AFNetworking文件下载:https://github.com/AFNetwork ...

  8. RPM

    1.安装RPM 使用-ivh选项即可,能查看安装信息和进度. 例如: #RPM -ivh XXX.rpm RPM升级与更新,使用-Uvh选项或者-Fvh选项,两者略有区别. -Uvh选项:后面接的软件 ...

  9. javascript运算符与表达式

    表达式 表达式是关键字.运算符.变量以及文字的组合,用来生成字符串.数字或对象.一个表达式可以完成计算.处理字符.调用函数.或者验证数据等操作. 表达式的值是表达式运算的结果,常量表达式的值就是常量本 ...

  10. Java 入门(一) - 环境变量

    Win 7 X64环境 计算机(右键)-> 属性 -> 高级系统设置 -> 环境变量1.新建系统变量 : JAVA_HOME C:\Program Files (x86)\Java\ ...