NET Phase5 实现 POC(epoll 多事件 + 跨线程 close 强语义收口 + UDP 边界,v1.9.x)
English summary. Network Phase5 (spec A.20, v4.41): resident epoll multi 8×16 LT, bounded event loop, cross-thread close with recv strong semantics (99/99), UDP limits, IPv4 verbatim/loopback rules, rate-limit bind; VM-only Linux x86-64 loopback POC; no DNS/TLS/public network, no AOT/Windows/ARM64 networking, not production. See the English summaries index; the Chinese text below is authoritative.
状态:VM-only Linux x86-64 loopback POC,非生产可用;无 DNS/TLS/公网;默认 loopback + opt-in。
1) epoll 多事件(有界)
sys_net_epoll_wait2(eid, timeout_ms, out_fds, max) -> n:一次 wait 把就绪语言 fd 写入 out 数组, 返回就绪个数;-13EAGAIN(timeout=0 无就绪)/-2E_TIMEOUT/-4E_INVALID/-8E_UNSUPPORTED。- 实例/容量:epoll 实例 8、每实例 fd 16(fd 表仍 32;有界 POC)。默认 LT(level-triggered), 未提供 ET 模式(文档化;ET 需额外一次性读空约定,本 POC 不做)。
- fixture
epoll_multi:单进程 server + 3 客户端多事件事件循环 →EPOLL_MULTI_OK 3。 - 与 Phase4
net_epoll_wait(bitmask)对比:wait2 直接返回 fd 列表,适合多 fd 分发;与io_wait(单 fd async)并存。
2) 跨线程 close 强语义(POC 收口)
- fd 表
pthread_mutex保护 close;close 置 closed 标记 +shutdown(SHUT_RDWR)+ close。 - recv 跨线程:线程 A 阻塞 recv、线程 B close → A 返回 E_INVALID(-4)(
CROSS_THREAD_CLOSE2_OK覆盖)。 - accept 跨线程:Linux 上 blocked accept 被另一线程 close 的唤醒/错误码平台相关(实测 -10,未归一化), 因此本 POC 不宣称 accept 跨线程强语义;提供确定性 use-after-close accept → -4 测试。
- send 跨线程:loopback 发送缓冲难以确定性阻塞,未提供阻塞 send 测试(文档化残余)。
- 竞态如实:仅 close 路径加锁、等待路径无锁;close 与 slot 复用窗口未消除;非生产级并发保证。
3) UDP 边界/错误码
- nonblock recvfrom → EAGAIN(-13);
set_timeout→ E_TIMEOUT(-2);关闭后 recvfrom → E_INVALID(-4)(UDP_LIMITS_OK -13 -2 -4)。 - 消息长度上限 65535(数组长度按 capacity 截断,因此"超长 len"表现为截断/超时而非 -4,文档化); UDP 无连接队列深度控制/背压,属残余;仅 IPv4 字面量、loopback-only、
QPLUS_NET_REAL=1opt-in。
4) AOT/Windows/ARM64
- AOT 对新增
sys_net_epoll_wait2等未知 builtin loud(无 ELF,driver 断言);Windows/ARM64E_UNSUPPORTED(-8)。 - AOT-网络边界引用 docs/AOT_NET_FEASIBILITY.md(结论 B:自举工具 SIGSEGV TOOL_FIXED=NO,AOT 网络不交付,保持 loud)。
5) 残余(如实)
- epoll 为有界驻留(8 实例×16 fd;非无限/非 ET);跨线程 close 仅 recv 强语义,accept 平台相关、send 未测试;
- UDP 无队列/背压控制;无 DNS/TLS/公网/生产可用;不宣称完整异步/事件循环。