网络 Phase4(VM-only loopback POC,1.9.0-dev / v4.40)
English summary. Network sys Phase4 (v4.40) adds a bounded resident epoll (max 4 instances × 8 fds;
sys_net_epoll_create/add/mod/del/wait/close), cross-thread close semantics (mutex-protected close; blocked recv/accept wakes with E_INVALID) and UDP async timeout (UDP_ASYNC_TIMEOUT_OK -2). Still VM-only Linux x86-64 loopback POC: no DNS/TLS/public network, no AOT/Windows/ARM64 networking (AOT stays loud; AOT-net feasibility conclusion B), not production-grade concurrency guarantees. Links:docs/NET_IMPLEMENTATION_PHASE4.md.
Q+ 1.9.0-dev(spec v4.40,附录 A.20)在 Phase3 net_poll 之上增加驻留 epoll、跨线程 close 与 UDP async timeout。详见 docs/NET_IMPLEMENTATION_PHASE4.md。
Phase4 增量
- 驻留 epoll(有界):
sys_net_epoll_create() -> eid(最多 4 个实例);epoll_add/mod/del(eid, fd, events);epoll_wait(eid, timeout_ms) -> bitmask(每实例最多 8 个 fd,bit 按注册顺序);epoll_close(eid)。events1=READ、2=WRITE; 返回就绪 bitmask /-13EAGAIN /-2E_TIMEOUT /-4E_INVALID /-9实例满 /-10IO /-8E_UNSUPPORTED(Windows/ARM64)。- fixture
epoll_echo:单进程 server + 2 客户端 epoll 事件循环完成 accept/send/recv/echo →EPOLL_ECHO_OK 2。 - 与 Phase3
net_poll(≤4 fd、一次性等待)对比:epoll 为驻留注册(add 一次、多次 wait); 与io_wait并存(后者面向单 fd 异步任务等待,net_epoll_*面向多 fd 事件循环)。
- fixture
- 跨线程 close(POC):fd 表加
pthread_mutex保护 close(closed 标记 + shutdown + close 原子化);线程 A 阻塞 recv/accept 时线程 B close 同一 fd → A 被唤醒、返回 E_INVALID(-4)。 fixturecross_thread_close→CROSS_THREAD_CLOSE_OK。 残余/竞态如实:仅 close 路径加锁;阻塞/等待路径读 fd 状态未持锁;close 与重新分配同 slot 的窗口未完全消除;单 VM 多线程模型下仍有理论竞态,非生产级并发保证。 - UDP async timeout:
recvfrom超时与 TCP 一致(SO_RCVTIMEO→ E_TIMEOUT(-2)); nonblock →EAGAIN(-13);async UDP 任务内超时兼容 →UDP_ASYNC_TIMEOUT_OK -2(Phase3UDP_TIMEOUT_OK -13 -2仍通过)。
边界(不得宣称生产可用)
- 仅 Linux x86-64 VM(bqvm)loopback;
QPLUS_NET_REAL=1opt-in,非 loopback bind 需QPLUS_NET_ALLOW_NONLOOPBACK=1(否则 E_PERM);fd 32、epoll 实例 4、每实例 fd 8; 消息 ≤65,535B;仅 IPv4 字面量;timeout i32(≤0 语义由上层约定,未细分溢出)。 - 无 DNS/TLS/公网/驻留完整事件循环/多线程生产保证;AOT 对新
sys_net_epoll_*loud (无 ELF);Windows/ARM64E_UNSUPPORTED(-8)。 - AOT 网络结论 B:AOT 网络交付可行性评估因自举 AOT 工具 SIGSEGV(TOOL_FIXED=NO)不交付, AOT 保持 loud(见 AOT-net feasibility 与
docs/AOT_NET_FEASIBILITY.md)。 - 1.9.0-dev 为发布候选(NOT PUBLISHED);1.11/1.12 文档预览(spec v4.43 TBD)。
复跑
QPLUS_NET_REAL=1 build/bqvm --timeout-ms 0 build/qboot.qbc net_p4.q -o net4.qbc
QPLUS_NET_REAL=1 build/bqvm net4.qbc # 期望 EPOLL_ECHO_OK 2 / CROSS_THREAD_CLOSE_OK / UDP_ASYNC_TIMEOUT_OK -2
fixtures:src/tests/net/(net1–net4);spec A.15/A.17/A.19/A.20;文档 NET_IMPLEMENTATION_PHASE2/3/4.md。
Phase5 + AOT 网络(v1.10.0-dev)
- Phase5:epoll multi(8 实例×16 fd,LT only)
EPOLL_MULTI_OK 3;跨线程 close recv 强语义(accept 平台相关、send 未测试如实); UDP 边界UDP_LIMITS_OK -13 -2 -4;无队列/背压。 - AOT 网络 POC:AOT ELF 支持 TCP loopback 子集(socket/bind/listen/accept/connect/send/recv/close/local_port;native id 200–208 + sys_env_get 251); opt-in
QPLUS_NET_REAL=1,默认 -8;AOT fd=raw OS fd;UDP/nonblocking/async/poll 运行期 -8;无 DNS/TLS/公网。
Phase6 + AOT 网络 v2(1.11/v1.12 文档)
- Phase6:accept 跨线程归一化
CROSS_THREAD_ACCEPT_OK -4;send post-close -4;UDP set_rcvbuf 有界+内核丢弃UDP_QUEUE_OK 64 1 63;LT-only。 - AOT 网络 v2(std.net TCP+UDP 子集):AOT ELF 可直接使用
use std.net公共包装net_tcp_socket/bind/listen/accept/connect/send/recv/close/local_port(VM/AOT 同源 parity:AOT_NET_STD_OK 2 4 112 105 110 103)与 UDP 基础子集(native 210–214;AOT_NET_UDP_OK 4 112 105 110 103)。 - AOT 边界(如实):nonblocking/poll/epoll/async 运行期 -8(不实现事件循环/异步); Phase6
set_rcvbuf等新 sys AOT 运行期 -8(编译不崩溃);opt-inQPLUS_NET_REAL=1,默认 -8; AOT fd=raw OS fd(VM 语言 slot 不互换、opaque);仅 Linux x86-64 阻塞 IPv4 loopback; UDP peer 表 fd<2048;bump 缓冲不释放(POC);无 DNS/TLS/公网/生产。 - 文档:NET_IMPLEMENTATION_PHASE6 · AOT_NET_POC · STD_API_NET · AOT 64-bit 页。1.12 文档预览(spec v4.43 TBD;实现基线 v210_rc1 1.11.0-dev/v4.42)。
AOT 网络 Phase3(v1.12.0-dev)
- AOT native 215 set_timeout(UDP recvfrom 超时 -2
AOT_NET_UDP_TIMEOUT_OK)、216 set_nonblock(UDP nonblock -13AOT_NET_UDP_NB_OK); TCP accept 超时 -10AOT_NET_ACCEPT_TIMEOUT_OK;TCP _nb/poll/epoll/async 仍 -8;仅 Linux x86-64 loopback、opt-in、非生产。