Manager::createComponent()
このメソッドは、RTコンポーネントを生成するためのルーチンである。マニュアルによると
指定したRTコンポーネントのインスタンスを登録されたFactory経由 で生成する。 インスタンス生成が成功した場合、併せて以下の処理を実行する。 * 外部ファイルで設定したコンフィギュレーション情報の読み込み,設定 * ExecutionContextのバインド,動作開始 * ネーミングサービスへの登録
となっている。では、詳細にソースコードを読んでみる。
引数
引数は、通常は、RTコンポーネントの名前であるが、char *comp_arg となっている。これは、生成するコンポネントの名前(ID)とオプション設定を同時に指定できるようになっている。
引数の形は、
id?key0=value0&key1=value1... RTC:[vendor]:[category]:impl_id:[version] RTC:::ID:となっており、最初に procComponentArgs関数を呼び出して、処理している。procComponentArgs関数では、RTコンポーネントのIDに関する処理も行っている。すなわち、OpenRTM-aistでは、RTコンポーネントのIDは、で表すようになっている。そのため、createComponent関数でIDのみを与えると、と変換されている。また、IDには、":"を入れてはいけないようにもなっている。
procComponentArgs(const char *comp_arg, coil::Properties& comp_id, coil::Properties& comp_conf);
を呼び出すと、comp_argsが処理され、
comp_id["RTC"]=id[0] comp_id["vendor"]=id[1] comp_id["category"]=id[2] comp_id["implementation_id"]=id[3] comp_id["version"]=id[4]
と分解される。
また、comp_argsがコンフィギュレーション付きである場合には、
comp_conf[key0]=value0 comp_conf[key1]=value1 ...となる。
createComponent の処理
createComponent メソッドでは、RTコンポーネントの生成に必要な手続きを行う。大まかにいうと次のようになる。
- 引数の処理し、comp_args -> comp_id, comp_propを得る。
- comp_propに "exportted_ports"があるかどうかを確認して、exported_portsの処理を行う。
- 予め設定された comp_idに対するFactoryを用いてRTコンポーネント生成する。Factoryがない場合には、ローダブルモジュールとみなしてモジュールをファイルから読み込みFactoryを設定する。これも失敗すれば、エラーとなる。
- coil::Properties prop = factory->profile()とする。さらに、comp_propの内容を propに追加する。
- inherit_propで定義しているプロパティについて設定されていなければ、m_configにある対応するプロパティを設定する。inherit_propは、以下のとおり。
const char* inherit_prop[] = { "exec_cxt.periodic.type", "exec_cxt.periodic.rate", "exec_cxt.evdriven.type", "naming.formats", "logger.enable", "logger.log_level", "naming.enable", "naming.type", "naming.formats", "" };
- RTObject_impl *comp = factory->create(this) でRTコンポーネンオブジェクトを生成する。
- configureComponent(comp, prop)を呼び出して、RTコンポーネントにプロパティを設定する。このときpropのプロパティにcategory.type_name.config_file,category.instance_name.config_fileに記載されている内容を上書きする。プロパティの優先度は、category.instance_name.config_fileの内容が最も高く、propの内容が最も低い。
- comp->initialize() を呼び出して初期化する。この処理は、RTコンポーネントの生成状態にあたる。詳細は、RTコンポーネントの振舞を参照。
- registerComponent(comp)を呼び出して生成したRTコンポーネントを登録し、compを返す。resisterComponent関数では、m_compManager.registerObjectを呼び出すとともに、NameServerに登録を行う。m_compManagerは、ObjectManagerオブジェクトであるが、std::vector<Object*>で生成されたオブジェクトを管理しているようである。