読者です 読者をやめる 読者になる 読者になる

Servo Reading part2: ざっくり全体構成編

Servo
  • 初回はRust復習会だったんで、実質的な初回なんだけど。
  • とりあえず a4baa7fc でコードリーディング
  • ざっくり全体構成を知るのに終止
  • 獣道すら存在しない前人未踏のコードの繁みに分け入る楽しさ

servo.rc (/components/servo.rc)

  • 素直なことしか書いてない
  • メッセージチャンネルが値を受け取るまで待機状態で処理を止めるのを利用して、main関数からメインループの追放を行っている
    • Rustのメッセージチャンネルの使い方の好例
  • ProfilerとCompositorTaskを生成し、それらへのチャンネルをConstellation(ブラウザのインスタンスそのもの)に引き渡し、Servoを起動している

CompositorTask (/components/compositing/mod.rs)

  • 入出力関係を制御しているのがこれ
  • OSによって作成されたスレッド上で実行される事を明示している
    • とはいえ、Rust 0.8preではstd::task::SchedModeからPlatformThreadが消えてる?っぽいのでどうなることやら
  • CompositorTask::create()でタスクを生成し、CompositorTask::run_main_loop()でループを回し、イベント入力を待ち受ける
  • 毎回10msecのsleep挟んで、ループを回し続ける
    • ちなみにここのsleepにはlibuvのラッパー絡んでます(そんなにlibuv詳しくないし深く追えてない)
  • こいつが待ち受けるのは、レンダリングタスクと、ウィンドウシステムからやってくるタスクの二種類
  • run_main_loop()、メチャクチャデカくてクロージャ作りまくりで読み難いですが、クロージャ作る事で変数なんでも参照できて書きやすくしてるのが狙いとも言える感じ。
    • これclean upできないかなー?

Constellation (/components/main/constellation.rs)

  • Servoのブラウザとしての機能を司る
  • 昔はengineって名前で、いつの間にかこの名前になりそのうち名前変えようかみたいな話も有ったりした
    • ECMAScriptで有名な某日本人のHNと被ってるのは偶然ぽい
      • とはいえネタとして大変に素晴らしい
  • Constellation::start()後にConstellation::run()してて、その中でループを回してるんだけど、ここでもメッセージの受け取りを使ってループを止めてる
    • Rustの非同期処理の常習パターンですね
  • ちなみにこのループもメッセージを受け取って、処理を振り分け続ける為のループ
    • 色々やってますよん
  • そして、URLを読み込む=静的なページ遷移が起こると、各ページに対してPipelineインスタンスを生成する(これはiframeの読み込みでも発生する)
    • で、ページ遷移が発生して、ブラウザの戻る・進む履歴からページが消えると、そのページのPipelineは破棄される

Pipeline (/components/main/pipeline.rs)

  • RenderTask, LayoutTask, ScriptTaskを生成する

だいたいここらへんで腹が減ったので、冷やしかつ丼食べに行って終わった