Expand description
リソース取得の同時実行を種別横断で制御する。
仕様は spec/resource_loading.md(実装順序の 4「キューを 1 本に統合し、
種別ごとの優先度を持たせる」に相当する最小実装)。
§なぜ要るのか
【2026-08-05】フォントと画像でワーカー上限を別々に持っていたため、
実際には最大 8 本が同時に TLS 接続を張っていた。
この自作 TCP/TLS スタックは同時接続に弱いことが既知で
(spec/TODO.md の「接続回数依存の劣化」)、
CSS/JS も非同期化したところメイン HTML が読み込めなくなった
([NET][STATS] total=3、正常時は 13)。
上限は種別ごとではなく全体で持たないと意味がない。 さらに、メイン HTML はページの他の何よりも優先される (それが無ければ描くものが無い)。
§方針
- 同時に走るリソース取得ワーカーの総数に上限を設ける
- メイン HTML の取得中はリソース取得を新たに始めない
グローバル状態を持つが、判定そのものは純粋関数へ切り出してあり
単体試験で固定してある(tests/src/test_fetch_limit.rs)。
Enums§
- Kind
- リソースの種別。値が小さいほど優先。
Constants§
- KIND_
FONT - 種別: フォントワーカー。
- KIND_
IMAGE - 種別: 画像ワーカー。
- MAX_
TOTAL_ FETCH_ WORKERS - 同時に走らせるリソース取得ワーカーの総数上限。
Statics§
- ACTIVE 🔒
- 現在走っているリソース取得ワーカーの総数。
- DRAW_
STAGE - ブラウザの
draw()がどの段にいるか。 - FONT_
WORKERS_ DIED - 死んだフォントワーカーの数(
font_queue::pumpが回収する)。 - IMAGE_
WORKERS_ DIED - 死んだ画像ワーカーの数(
image::pumpが回収する)。 - MAIN_
LOAD_ 🔒IN_ FLIGHT - メイン HTML を取得中か。
- OWNER_
KIND 🔒 - 所有者の記録。
pidの下位ビットに種別を混ぜず、別配列で持つ。 - OWNER_
PID 🔒 - 枠の所有者 PID。0 は空き。
Functions§
- active
- 現在のワーカー総数。
- claim
- ワーカーが自分の PID で枠の所有を宣言する。
- idle_
line - 取得の待機状態を 1 行で出す。
- main_
load_ in_ flight - may_
spawn - 新しいワーカーを起こしてよいかの判定(純粋関数)。
- may_
spawn_ lower - 低優先のワーカーを起こしてよいか(純粋関数)。
- on_
process_ died - パニックハンドラから呼ぶ。ロックを取らない。
- pick_
highest_ priority - 優先度の高い順に取り出すべき添字を返す(純粋関数)。
- release
- ワーカーの枠を返す。
- set_
draw_ stage - set_
main_ load_ in_ flight - メイン HTML の取得開始/終了を記録する。
- take_
font_ deaths - 死んだフォントワーカー数を取り出して 0 に戻す。
- take_
image_ deaths - 死んだ画像ワーカー数を取り出して 0 に戻す。
- try_
acquire - ワーカーを 1 本起こしてよいか判定し、よければ枠を確保する。
- unclaim
- 正常終了時に所有を外す(
release()と対で呼ぶ)。