[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .

バージョン依存性を解決するための fml ブートローダ

Table of Contents
例: 配送処理の場合
FML::Process:: クラスの階層構造
プロセス実行時の様子
議論: ml_name と ml_domain の値はどこで解決するのが正しいか?

fml8 には、 インストールされている fml のバージョン依存性を解決するために、 本章で述べるブートストラップ過程があります。

fml (libexec/distribute) が boot していく様子

       functions                class
       ----------------------------------------

       main::Bootstrap()        libexec/loader
            |
            V
       main::Bootstrap2()       FML::Process::Switch
            |
            V
       ProcessSwitch()          FML::Process::Switch
            |
            |
            | switch to ($obj = FML::Process:Distribute)
            |
            V                   
       ProcessStart($obj,$args) FML::Process::Flow

例: 配送処理の場合

たとえば配送処理の場合、 loader から次々とモジュールが呼ばれていく様子は次のようになります。

/usr/local/libexec/fml/distributre (の実体は /usr/local/libexec/fml/loader) は /usr/local/etc/fml/main.cf を読みこみ、 fml_version 変数から使うべきライブラリのバージョンを決めます。 たとえば fml_vesrion が 8.0.0 となっていれば、 /usr/local/lib/fml/8.0.0/ 以下にあるライブラリを使うといった具合です。

@INC を再設定した後、 loader は FML::Process::Switch をロードし、 $0 (プロセス名)を調べます。 プロセス名から自分の仕事は配送処理なので、 FML::Process::Distribute クラスをロードすればよいことを理解します。 このクラスをロードし、配送処理に移ります。 ここで、プロセス名とロードするべきクラスの対応関係は /usr/local/etc/fml/defaults/バージョン/modules (例 /usr/local/etc/fml/defaults/8.0.0/modules) に定義されています。

こういった処理は、 見かけ上 FML::Process::Flow::ProcessStart() という関数が制御しています。 ProcessStart() が引数として FML::Process::Distribute オブジェクトを渡され、 FML::Process::Distribute オブジェクトを実行していくという流れになります。

[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .
Copyright (C) 1993-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >