Skip to content

IOCP/kqueue: panic on c.result.? when a completion is reused while still queued (cursor-blink timer) #2

Description

@nanasess

この fork が持つ修正パッチの追跡用 issue(発見可能性を保つため)。修正は #1

症状

レンダラスレッドで散発的にパニック: Zig の attempt to use null value(STATUS_BREAKPOINT 0x80000003abort)。Windows/IOCP で Ghostty のカーソル点滅タイマー使用中、数十分〜数時間で発生。

根本原因

iocp.zig:271 が completion queue のエントリを c.result.? でアンラップしている(「Completion queue items MUST have a result set」)。この不変条件が completion 再利用レースで破られる: タイマーの再武装/reset が loop.timerc.* = .{...})を経由して result を null に戻すが、同じ completion がまだ completion queue に連結されたままのため、後続の completions.pop() が null result をアンラップしてパニックする。

同じ c.result.? パターンは kqueue.zig:440 にも存在するため、macOS も構造上は同様に脆弱(未検証)。

修正(#1

IOCP と kqueue 両方の completion ループで、pop したエントリの result が null の場合は stale エントリとして扱い、(再利用済みの)状態を書き換える前に読み飛ばす。再武装済みの completion は自身のタイミングで発火する。

  • IOCP: 実機検証済み(Debug ビルド + 複数日 soak で再発なし。先行していたスクロール停止の前兆も消失)。
  • kqueue: パリティ目的のみで未検証(消費側 ghostinthewsl は Windows 専用でこの経路を通らない)。

スコープ / upstream との関係

リンク

開示: 診断・修正は AI 支援で行い、実機で検証した。作者は Zig に深く精通しているわけではない。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions