在 Zig 中,如何判断一个帧是否代表一个完全执行的函数?

问题描述

在 Zig(当前使用 0.7.1)中,假设出于某种原因,您没有任何好的方法来设计代码,每个 resume 始终只有一个 suspend。是否有任何支持方法可以在运行时检测给定的帧是否已执行完成?

// overly simplistic example designed to illustrate the problem
pub fn main() void {
    var frame = async amain(2);
    resume frame;
    resume frame;

    // panic/UB -- resume async function which already returned
    // 
    // we would prefer to have some kind of check which Could allow
    // us to detect at runtime that the following resumption is illegal
    resume frame;
}

fn amain(ubound: i32) void {
    var i: i32 = 0;
    while (i < ubound) : (i += 1) {
        suspend;
    }
}

如果我记录这些帧结构的原始字节(据我所知是不透明的并且不支持字段访问?我对 Zig 有点陌生),那么很明显一部分帧专用于标记是否返回:

[70,3a,23,00,02,00]
[70,01,ff,00]

然而,盲目地阅读这些数据似乎有点鲁莽,如果我知道结构布局是有保证的,或者有一些内置的方法可以发现这些信息,我会感觉更舒服。

编辑::

特别是,我试图解决的问题是,在设计事件循环时(例如在 JS 和 Zig/WASM 之间接口时),您似乎必须将异步函数的实现与事件循环本身。

例如,内置的事件循环具有一个 yield() 函数,因此它可以进行必要的簿记以确保代码在每次挂起时都有一个恢复,但据我所知,这是不必要的限制,因为帧是否已返回似乎已存储且易于访问。

我当然可能误解了 Zig 的 async/await 的目的,但我没有看到任何基本原因为什么通用事件循环能够处理任何异步函数(不仅仅是那些遵守特定循环 API 的函数) ) 无法编写,但我正在努力了解如果没有比文档表明可用的更多运行时内省,这是如何实现的。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)