Skip to main content

Module fetch_limit

Module fetch_limit 

Source
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() と対で呼ぶ)。