-
Notifications
You must be signed in to change notification settings - Fork 188
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TODO #178
Comments
通用事件循环库会带来更多代码和开销,更重要的是,chinadns-ng 在设计上就是在 linux 上运行的(ipset/nftset)。 因此通用事件循环库就没有必要了,因为我只需要考虑 epoll API,目前的 EvLoop.zig 就是对它的极简封装(只有必要功能)。 |
现在我也准备不依赖 async 语言特性了,改为自己手动实现(状态机)。 |
嗯,跨平台不是优先项,事件库就是抽象了一层,方便适配,比如现在linux又有io_uring了,适配支持就可以在抽象层之上了 |
期待能早日完工,我有空也学习下zig语言,希望以后可以一起改进这个项目。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
UPDATE:
用 zig 手动模拟 suspend/resume 不太现实,除非是最简单的异步代码。对于那些存在 条件分支、循环 等构造的异步代码,根本无法实现。因为 zig 没有 goto(C 的 switch/case 本质就是 goto,著名的
Duff's device
就是利用它实现的)。主要技术困难在于 resume,resume 的核心就是 重新进入之前被 suspend 的异步函数,并 jmp 至上次的暂停点之后,继续执行后面的代码。在没有 goto(或者 C 的 switch/case)的情况下,不可能用常规 zig 代码实现,只能借助编译器。
我在犹豫是否要回到 C(将 zig 作为 build system,编译工具链,zig 随时保持最新),还是继续用 zig 0.10.1,静等 zig 更新。这几天用 C 语言手搓了一个 “穷人” 的无栈协程(
co.h
,基于computed goto
、CPS 变换而实现),设计思路和 API 与 zig async/await 相似,并做了一些改进。与 libev 结合测试了一下,非常 OK。因此,其他项目继续用 C 语言 +
co.h
实现(重构),chinadns-ng 这边看情况,如果后面有时间,且 zig async/await 太久没回归,应该也会改回 C 语言 +co.h
。The text was updated successfully, but these errors were encountered: