You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ENG3 (HITL resolved 2026-04-30 in docs/0.6.0/hitl-queue.md) chose explicit fallible close() -> Result<CloseReport, EngineError> + best-effort Drop fallback for Engine shutdown, deferring async-drop because std::future::AsyncDrop is unstable.
The current Drop for Engine impl wraps each reverse-ENG3 step in catch_unwind (per std::ops::Drop docs panic-in-drop rule) and runs blocking cleanup synchronously — including a 30s writer-drain join. This is acceptable but not ideal: a forgotten close() blocks the dropper for up to 30s and cannot yield to a runtime.
Context
ENG3 (HITL resolved 2026-04-30 in
docs/0.6.0/hitl-queue.md) chose explicit fallibleclose() -> Result<CloseReport, EngineError>+ best-effortDropfallback forEngineshutdown, deferring async-drop becausestd::future::AsyncDropis unstable.The current
Drop for Engineimpl wraps each reverse-ENG3 step incatch_unwind(per std::ops::Drop docs panic-in-drop rule) and runs blocking cleanup synchronously — including a 30s writer-drain join. This is acceptable but not ideal: a forgottenclose()blocks the dropper for up to 30s and cannot yield to a runtime.What we're tracking
When
AsyncDropstabilizes (tracked upstream at rust-lang/compiler-team#727, async-fundamentals roadmap), evaluate migratingDrop for EnginetoAsyncDropso:close()yields to the runtime instead of blocking.awaitwriter-drain instead of synchronous join.EngineError::CloseTimeoutpaths can use proper async timeouts.Constraints to preserve when migrating
CloseTimeout { stage, elapsed }surfaced.close()consumesself;AsyncDropchecksclosed: AtomicBooland skips if set.AsyncDropruns same step sequence asclose().Trigger conditions for closing this issue
AsyncDropstabilized in stable Rust, ORReferences
docs/0.6.0/hitl-queue.mdENG3 resolution (2026-04-30, conf 80%)