Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions doc/coro-async-core-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ Source-specific submit保留在各自模块,但成功后必须返回统一 `Op

不设置中心化completion fact容量。`OperationRecord.completionPublished`本身是durable fact;所有source完成一个有界publication epoch后,再由各source枚举本轮affected operation并调用同一个park resolver。多个candidate指向同一ParkState时,第一次扫描本epoch完整sticky snapshot完成决策,后续重复项看到已进入detaching phase即可跳过。因此epoch开始前已durable的winner不依赖source顺序,也不需要每P固定大数组、batch overflow或全局transaction rollback;epoch进行期间并发到达的事实允许本轮或下一轮处理。

高并发promotion使用直接park物理协程frame内的临时`WaitSetRecord`,不为所有G常驻增加`prevWait`或affected link。record只包含owner G、exact ParkTicket、active-wait双链和affected work link/state;64-bit为48 bytes、32-bit/WASM为28 bytes。active双链允许ready wait-set在O(1)内从P移除,per-P affected FIFO在每个published epoch结束时切成线性batch;同一wait-set的多个source fact通过`clean/queued/processing/dirty`状态合并。bootstrap或无法由compiler提供frame slot的入口使用调用方提供的静态pool,且必须在任何producer admission前reserve;native profile可选择可增长pool,baremetal/RTOS必须显式声明静态容量和同步失败。
高并发promotion使用直接park物理协程frame内的临时`WaitSetRecord`,不为所有G常驻增加`prevWait`或affected link。record包含owner G、exact ParkTicket、active-wait双链、affected work link/state,以及一个只在同一frame内解释的`unsafe.Pointer + resumeBindingKind`联合槽;64-bit为56 bytes、32-bit/WASM为32 bytes。联合槽只能是none、单source packet、固定枚举typed cleanup plan或已物化packet,不保存interface/function value。active双链允许ready wait-set在O(1)内从P移除,per-P affected FIFO在每个published epoch结束时切成线性batch;同一wait-set的多个source fact通过`clean/queued/processing/dirty`状态合并。bootstrap或无法由compiler提供frame slot的入口使用调用方提供的静态pool,且必须在任何producer admission前reserve;native profile可选择可增长pool,baremetal/RTOS必须显式声明静态容量和同步失败。

该结构只让同时parked的任务付费,并保持producer/ISR仍只处理两字POD `OperationID`。迁移阶段legacy与V2各保留一对active head/tail,P另有affected head/tail,`Frame`暂存一个record pointer;legacy删除后应让`G.nextWait`原位承担当前record入口并合并这些队列字段。V2 fact mark、affected pop、promotion以及record-aware attach/detach已经只做O(1) header/邻接preflight,完整审计保留在测试、debug和terminal边界;`ParkLink.previous`由同时parked的source-owned operation支付。目标复杂度是`O(F + A + C)`:本轮source fact数F、受影响wait-set数A以及这些wait-set的candidate数C,与其余parked G无关。

Expand Down Expand Up @@ -333,9 +333,11 @@ Running和Waiting G不可迁移,completion必须投递原owner;只有已经

当前native fleet profile已经把这条core接入真实程序:route 1原位收养command线程上的program P,route 2由一个固定pthread M拥有;两个domain各有独立P/driver/source catalog、pipe doorbell和POSIX poll set,并并行执行同一个物理reducer。固定8槽`RunnableTransferMailbox`接受never-run root、普通`SuspendYield`以及已进入`parkMaterialized`的`SuspendPark` continuation;slot以generation和FIFO exact import持有唯一GC root。G复用既有对齐padding中的一字节`transferState`,Published期间关闭pointer-only preempt gate并拒绝普通`Enqueue`,因此不会被第三个P重复取得,且native/wasm32的G大小不变。当前分配策略只机会性转移每次physical resume产生的第一个新spawn;mailbox争用或满时保留本地FIFO。它证明双M/双P并行、启动/停止/join、初始任务迁移和受限parked-result迁移可运行,但尚不是动态GOMAXPROCS、通用global run queue或任意runnable work stealing。

2026-07-26的第一阶段物化只接受零或一个Timer、Manual、Poll、Worker source。`WaitSetRecord`可绑定compiler/runtime提供的52-byte、align-4、pointer-free frame-local `ResumePacket`;原owner在`parkReady` promotion事务中先Consume winner lease,再按source类型Take/Discard payload、确认quiescence并回收exact generation,最后把`ParkState`压缩为不含winner/source ownership的`parkMaterialized`。Worker标量和Poll枚举在这里复制,Timer/Manual不保留payload;迁移后的resume只消费packet,prompt task cancellation也只抑制packet,不回访旧source。packet-bound wait不能走缺少`ExecutorSourceSet`的legacy promotion入口,旧`parkReady/parkConsumed/parkDelivered`仍被迁移gate拒绝。
2026-07-26的第一阶段物化接受零或一个Timer、Manual、Poll、Worker source。`WaitSetRecord`可绑定compiler/runtime提供的52-byte、align-4、pointer-free frame-local `ResumePacket`;原owner在`parkReady` promotion事务中先Consume winner lease,再按source类型Take/Discard payload、确认quiescence并回收exact generation,最后把`ParkState`压缩为不含winner/source ownership的`parkMaterialized`。Worker标量和Poll枚举在这里复制,Timer/Manual不保留payload;迁移后的resume只消费packet,prompt task cancellation也只抑制packet,不回访旧source。packet-bound wait不能走缺少`ExecutorSourceSet`的legacy promotion入口,旧`parkReady/parkConsumed/parkDelivered`仍被迁移gate拒绝。

该阶段有意不接受Channel/多case select、HostOp deadline和带runtime-private cleanup的keyed/host adapter。Channel必须先从所有hchan队列删除winner/loser节点并完成buffer/claim reconciliation;双source deadline必须同时退休Worker与Timer;runtime-private registry/transport也必须先完成typed cleanup。它们将在统一的固定枚举materialization plan中完成,不能以callback/interface或迁移后回访旧P来绕过。完成该plan前,这些park仍保持owner-affine。
第二阶段已把direct Channel和multi-case channel `select`接到同一机制。compiler-spilled `ResumeCleanupPlan`只保存固定`ResumeCleanupKind`、typed runtime context、`{entries,count,stride,idOffset}` ID range、source/claim和阶段游标;没有callback、interface、函数地址反查或永久G字段。common resolver在旧P上Consume exact decision后停在`ExecutorRunStepMaterialize`,runtime direct switch每次处理一个logical case:从hchan队列摘除typed waiter、完成必要的buffer/close reconciliation、复制winner的封闭`waitStatus`,并清除frame中的hchan/source/claim指针,只暂留exact ID。随后core逐ID执行`ConfirmQuiesced`,统一reset共享claim、Take/Discard winner lease,再逐ID Recycle并清零;最后才写入P-neutral packet、转成`parkMaterialized`并进入ready queue。direct、两case winner/loser、close、task cancel、native race/shuffle、JS/WASM、旧P source为空后跨P迁移,以及迁移后prompt task cancel均已覆盖。真正发生的Yield/Park会确认已经由本次suspension满足的G-local preempt request;executor/source request仍有自己的sticky gate,因此不会因残留`preemptRequested`误拒合法迁移,也不会丢服务义务。

当前typed plan仍未接受HostOp deadline和带runtime-private cleanup的keyed/host adapter。双source deadline必须同时退休Worker与Timer;runtime-private registry/transport也必须先完成对应固定枚举cleanup。它们复用同一个plan与runner边界,不能以callback/interface或迁移后回访旧P来绕过。另一个严格cost gate是把现有hchan buffer/closed-queue reconciliation内部可能处理多个peer的循环继续拆成显式子游标;当前materialization已经把select的N个frame case分成N个runner reduction,但不能据此宣称整个hchan critical section已完成常数wall-work认证。

两字`OperationID`已经用稳定`RouteID`解决多P source namespace:两个P的同类source可以都从local slot 1开始,但callback必须携带完整`{source, route, local, generation}`,通过route admission精确发布source fact并请求对应executor。P teardown先seal route并strong-join producer,旧route留下永久tombstone;该路由约束不允许重新引入Go pointer callback ABI或按fd/函数地址反查owner。

Expand Down Expand Up @@ -447,7 +449,7 @@ Linux共享`RawSyscall` carrier还要求与函数地址证书正交的trap证书

这些是core-first证据,不是标准库兼容性证明。native compiler command entry仍是固定机器栈V2循环,但target start现已把program P/driver/source/registry作为route 1原位收养,同时创建route 2并启动其pthread owner;program return会停止并join peer与共享worker pool,再按route、backend、driver顺序强关闭。Timer catalog、Poll V2 callback与Worker transport均使用exact route:Timer由各domain owner的单调时钟扫描;Poll和Worker的两字`OperationID`在route admission内完成source publication、exact executor request、duplicate/stale分类和关闭强汇合;Worker复用一个进程级固定物理池。单source result物化/迁移已经越过,尚未完成的是multi-source typed materialization、动态P数量、普通global injection/steal和thread-affinity策略。target-neutral host-owned pull adapter已完成core/race与JS/WASM、WASIp1、baremetal、显式embedded交叉编译验证:`more`只发布later-turn action,idle只暴露POD executor/generation/epoch/deadline,alarm/notification取消后才可复用epoch,shutdown seal两个ingress并strong-join callback tail。compiler的host-target V2 entry也已完成:它只执行一次有界initial slice,保留`next_action/profile/next_deadline/publish_time/ack_cancel/continue/post_wait`等callback reference roots,仅接受canonical `Complete`或executor slot/generation/epoch/flags/deadline均精确的`Yielded`/`Suspended` tuple,后两者detached返回host,不在entry内继续调度或递归re-entry。仓库Node runner现已作为显式embedding真实消费这些action,并在`wasm-unknown`/`wasip2`运行file与TCP/UDP标准库fixture;普通JS/WASM或WASI `_start`仍没有内建reactor,因此不能把该受控embedding外推为通用platform E2E。JS command pump、WASI `poll_oneoff`、RTOS HAL与baremetal IRQ/WFI glue、完整cleanup/defer/recover/Goexit lowering以及precise/moving GC仍是明确缺口。

执行器已收口到一套物理run-step reducer;fleet外层只保留exact domain owner、显式单调时钟和budget,不存在第二套resume/destroy/commit语义。空fleet P使用公共timer-aware idle事务完成standby admission;提交后先释放owner epoch,route-local固定poll set执行fault-containment有界物理pass,doorbell/fd/deadline唤醒后再取得新epoch并执行公共`WakeExecutorAt`全source重扫。普通domain最后一个G销毁只完成该G并保持executor可接收未来routed work;command route的main-return语义仍由program coordinator独占。实际peer M循环、共享worker pool lifecycle、分布式shutdown和强关闭引用清理现均已接入并通过production-island、source/race及TCP E2E验证。
执行器已收口到一套物理run-step reducer;fleet外层只保留exact domain owner、显式单调时钟和budget,不存在第二套resume/destroy/commit语义。空fleet P使用公共timer-aware idle事务完成standby admission;提交后先释放owner epoch,route-local固定poll set执行fault-containment有界物理pass,doorbell/fd/deadline唤醒后再取得新epoch并执行公共`WakeExecutorAt`,只完成idle→active并设置`sourceMore`,所有source解析和typed materialization继续由同一run-step reducer完成。idle prepare/commit中若request或事实源赢得竞争,也执行相同的“leave idle + sourceMore”转换,不再嵌套调用legacy全量poll。普通domain最后一个G销毁只完成该G并保持executor可接收未来routed work;command route的main-return语义仍由program coordinator独占。实际peer M循环、共享worker pool lifecycle、分布式shutdown和强关闭引用清理现均已接入并通过production-island、source/race及TCP E2E验证。

Worker transport的route-aware核心现已完成:仍只有一个进程级固定4线程/1024-job物理池,C11 sequence ring允许多个exact P owner并发预留不同cell;每个reservation在compiler-enforced no-suspend hook内submit或以tombstone cancel。Job不增加指针或全局operation目录,直接使用既有两字`OperationID.SourceSlot`中的route;完成端按compiler-reserved target profile静态选择legacy program或fleet ingress,fleet再完成exact source/request/doorbell投递。owner在把完成发布为可resume winner前seal generation并等待所有已admit producer退出,避免回调release尾与result recycle竞态。C11环已通过route 1/2并发producer、交错wrap、四consumer和stop/join测试;program-level fleet coordinator实际start/stop该池,当前fleet标准库profile不再退回single-P worker transport。

Expand Down
4 changes: 2 additions & 2 deletions doc/coro-ir-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -1268,7 +1268,7 @@ site只接受ProgramIR projection。旧callback/classifier在同一提交删除
4. dynamic coroutine descriptor、closure/method/interface;
5. syscall/netpoll/worker/host sources;
6. precise GC/debug metadata;
7. 在已完成的零/单source packet上补typed multi-source materialization,再完成global injection、多P/affinity;
7. 在已完成的零/单source packet和Channel/select typed materialization上补HostOp deadline、keyed/transport composite cleanup,再完成global injection、多P/affinity;
8. reflect和完整平台adapter。

Phase B–F严格保持plan、runtime ABI和可观察行为不变;Phase G才是新功能开发,并且必须等待下面Phase R的四个hard-cutover gate全部通过,不能混为一个巨大PR。PrimitiveCatalog生成器重构和Runtime V3也分别立项,不塞入等价迁移。
Expand Down Expand Up @@ -1453,7 +1453,7 @@ channel/select physical operation choice、panic/outcome/cleanup choice及remain
5. runtime Phase R已经完成:fleet唯一target、Park/Operation唯一logical wait、统一source dispatcher和
mandatory stackless架构均以旧production符号/配置入口为零,并由hard-cutover gate持续约束。
6. 本轮合并门运行runtime race、LLVM 19–22、native/wasm32结构验证和六项fresh stdlib E2E。后续compiler
whole-function emitter仍按完整replacement cohort推进;single-source P-neutral result已独立落地,typed multi-source result、dynamic P、GC、panic/Goexit和更多平台adapter
whole-function emitter仍按完整replacement cohort推进;single-source P-neutral result和Channel/select typed multi-source materialization已独立落地,HostOp/keyed composite result、dynamic P、GC、panic/Goexit和更多平台adapter
属于功能阶段,不能借机恢复旧runtime轨道。

迁移过程可以用独立test invocation比较旧/新输出,但production永远只有一个被选择的consumer;临时双轨
Expand Down
Loading