Skip to content
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

Closed
3 tasks
zfl9 opened this issue Jul 5, 2024 · 5 comments
Closed
3 tasks

TODO #178

zfl9 opened this issue Jul 5, 2024 · 5 comments

Comments

@zfl9
Copy link
Owner

zfl9 commented Jul 5, 2024

  • 跟进 zig 上游的更新,始终保持最新的 zig 工具链。
  • 由于 zig 版本更新,需要手动编码实现 async 异步语义。
  • 重写剩下的 C 模块,目标是 100% zig code(除了 libc、wolfssl)。

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

@zfl9 zfl9 pinned this issue Jul 5, 2024
@hawkbee
Copy link

hawkbee commented Jul 5, 2024

是否会考虑集成异步事件库,虽然可读性会差一些,好处是可以不依赖于语言特性,类似:

libxev
zig-aio

@zfl9
Copy link
Owner Author

zfl9 commented Jul 5, 2024

通用事件循环库会带来更多代码和开销,更重要的是,chinadns-ng 在设计上就是在 linux 上运行的(ipset/nftset)。

因此通用事件循环库就没有必要了,因为我只需要考虑 epoll API,目前的 EvLoop.zig 就是对它的极简封装(只有必要功能)。

@zfl9
Copy link
Owner Author

zfl9 commented Jul 5, 2024

现在我也准备不依赖 async 语言特性了,改为自己手动实现(状态机)。
除非后面打算跨平台(也许永远不会),才会引入 libev 这样的轻量级 C 事件库。

@hawkbee
Copy link

hawkbee commented Jul 5, 2024

嗯,跨平台不是优先项,事件库就是抽象了一层,方便适配,比如现在linux又有io_uring了,适配支持就可以在抽象层之上了

@hapood
Copy link

hapood commented Jul 11, 2024

期待能早日完工,我有空也学习下zig语言,希望以后可以一起改进这个项目。

@zfl9 zfl9 closed this as not planned Won't fix, can't repro, duplicate, stale Jul 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants