hive源码之新建一个coroutine
最近由于项目需要读了一下云风老大的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的更多相关文章
- 自定义函数hello,并注册到hive源码中并重新编译
1 编写自己的udf方法hello package cn.zhangjin.hive.udf; import org.apache.hadoop.hive.ql.exec.Description; i ...
- 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 ...
- JVM源码分析之一个Java进程究竟能创建多少线程
JVM源码分析之一个Java进程究竟能创建多少线程 原创: 寒泉子 你假笨 2016-12-06 概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于L ...
- 自己根据java的LinkedList源码编写的一个简单的LinkedList实现
自己实现了一个简单的LinkedList /** * Create by andy on 2018-07-03 11:44 * 根据 {@link java.util.LinkedList}源码 写了 ...
- Hive源码上手及问题解决
一.编译准备 1.下载源码包 https://github.com/apache/hive/archive/refs/tags/rel/release-2.3.7.zip 或使用git直接拉取 无法解 ...
- 源码学习:一个express().get方法的加载与调用
刚刚接触express,它的中间件确实把我搞得头晕.get的回调中要不要加next?不加载还会执行下一个中间件么?给get指定'/'路径是不是所有以'/'开头的访问在没有确切匹配时都能执行?use件又 ...
- 修改jumpserver源码并且实现一个自定义功能模块
在前面已经说了,如何打开jumpserver的管理控制台并且自定义自己的数据模型.接下来实现一个自定义的功能模块. 先看效果! 一 定义好自己的模型(model) 1.1 这一块儿在前一篇博文已经讲过 ...
- [ASP.NET]分析MVC5源码,并实现一个ASP.MVC
本节内容不是MVC入门教程,主要讲MVC原理,实现一个和ASP.NET MVC类似基本原理的项目. MVC原理是依赖于ASP.NET管道事件基础之上的.对于这块,可阅读上节内容 [ASP.NET]谈谈 ...
- Fresco源码解析 - 创建一个ImagePipeline(一)
在Fresco源码解析 - 初始化过程分析章节中, 我们分析了Fresco的初始化过程,两个initialize方法中都用到了 ImagePipelineFactory类. ImagePipeline ...
随机推荐
- 转:如何实现一个malloc
如何实现一个malloc 转载后排版效果很差,看原文! 任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉. ...
- ViewPager onPageChangeListener
今天在做项目的时候,由于要处理viewPager页面滑动的事件,所以对其进行了一个小小的研究: 首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageC ...
- Android之常用Git命令
Android之常用Git命令 代码修改后提交步骤:git status:查看代码修改状态git diff:查看代码修改细节,也能看代码空格git add . :添加新加入的代码git commit ...
- Jquery设置Cookie
jQuery代码: <script src="js/jquery-1.3.1.js" type="text/javascript"></scr ...
- java的前台与后台
技术上:前台是指web展示,webservice接口等输入输出接口,后台是指支持这些接口的程序. 例如读写数据库,读写文件,业务逻辑处理. 业务上来讲:前台是提供给最终用户使用的界面,后台是指管理使用 ...
- b/s 读取多个FTP文件(图片,视频)压缩到服务器 下载到客户端
其实需求是这样, 要做一键导出, 有图片,有照片,youhtml,存在不同的文件夹,每次下载都必须下载最新数据,因为FTP是随时更新的. 1.这要是一直下载下载,浏览器一直跳窗口,蛋疼的我都看不下去. ...
- ios基础篇(三十)—— AFNetworking的使用
一.AFNetworking的创建 1.新建工程,命名为AFNDemo 2.导入AFNetworking.h AFNetworking文件下载:https://github.com/AFNetwork ...
- RPM
1.安装RPM 使用-ivh选项即可,能查看安装信息和进度. 例如: #RPM -ivh XXX.rpm RPM升级与更新,使用-Uvh选项或者-Fvh选项,两者略有区别. -Uvh选项:后面接的软件 ...
- javascript运算符与表达式
表达式 表达式是关键字.运算符.变量以及文字的组合,用来生成字符串.数字或对象.一个表达式可以完成计算.处理字符.调用函数.或者验证数据等操作. 表达式的值是表达式运算的结果,常量表达式的值就是常量本 ...
- Java 入门(一) - 环境变量
Win 7 X64环境 计算机(右键)-> 属性 -> 高级系统设置 -> 环境变量1.新建系统变量 : JAVA_HOME C:\Program Files (x86)\Java\ ...