最近给xmake增加了一个新特性,对于一份工程源码,可以不用编写makefile,也不用编写各种make相关的工程描述文件(例如:xmake.lua,makefile.am, cmakelist.txt等)
xmake就可以直接编译他们,这是如何做到的呢,简单来说下实现原理:
这种代码扫描和智能编译,非常简单,目前xmake还不支持多级目录扫描,只对单级目录的代码进行扫描编译。。
虽然这种方式,并不是非常智能,限制也不少,但是对于想临时写些代码进行编译运行,或者临时想交叉编译一些简单的开源库代码
这种方式已经足够使用了,下面看下一个实际的例子:
我下载了一份zlib-1.2.10的源码,想要编译它,只需要进入zlib的源码目录执行:
$ cd zlib-1.2.10
$ xmake
就行了,输出结果如下:
lua原生并没有提供try-catch的语法来捕获异常处理,但是提供了pcall/xpcall
等接口,可在保护模式下执行lua函数。
因此,可以通过封装这两个接口,来实现try-catch块的捕获机制。
我们可以先来看下,封装后的try-catch使用方式:
try
{
-- try 代码块
function ()
error("error message")
end,
-- catch 代码块
catch
{
-- 发生异常后,被执行
function (errors)
print(errors)
end
}
}
上面的代码中,在try块内部认为引发了一个异常,并且抛出错误消息,在catch中进行了捕获,并且将错误消息进行输出显示。
此版本主要增加stackless协程模块以及为嵌入式平台增加micro微模块编译(~64K)。
此stackless协程模块比之前的stackfull协程实现更加的轻量高效,切换效率提升5、6倍,在macosx上测试1000w次切换仅需40ms
当然易用性和灵活性上,还是stackfull模式更有优势(tbox两种模式都已支持,接口类似)。
stackless协程使用见:stackless协程使用文档 stackfull协程使用见:stackfull协程使用文档
更多协程服务器demo实现,请参考:协程examples
__tb_thread_local__
关键字宏--micro=y|n
选项,实现极小编译,针对嵌入式平台,编译tbox微内核(~64K)tb_addrinfo_addr
and tb_addrinfo_name
接口之前介绍过了stackfull的一些服务器使用例子,这里在贴一些使用stackless协程接口实现的server代码。
其实大部分接口,两者都是类似的,仅仅只是前缀的区别:tb_co_xx
和 tb_lo_xx
,唯一需要注意的是:
* stackless协程尽量不要使用局部变量
* 不要再嵌套的过程里面进行协程挂起等待
这个文件服务器的功能很简单,就是不停的接收连接,然后开新协程,进行文件传输。
通过协程,从原始socket写起,也只需要不到100行代码,就可以实现一个高并发的文件服务器。
此处用到了tb_socket_sendf
直接对文件句柄操作,发送到socket,内部使用sendfile实现,不需要再上层开buffer读文件发送,因此效率会有明显提升。
而tb_socket_wait
内部会去将被等待的socket加入poll池,进行等待调度,直到事件到来才会继续执行。
并且协程的io调度器内部做了优化,不会去频繁得从轮询池里面添加删除socket,内部对epoll_ctl等操作会有个缓存,因此效率还是非常高的。