RtORBにおけるCORBAオブジェクトの構成図
Simple Wiki Based Contents Management System
ソフトウェア関連 >> ライブラリ >> RtORBについて >> RtORBの動作について >> RtORBにおけるCORBAオブジェクトの構成図

RtORBにおけるCORBAオブジェクトの構成図

ここでは、RtORBでCORBAプログラムを作成する場合に、呼ばれる主な関数によって生成されるオブジェクトについて図を交えて説明を行います。

ORBの初期化

RtORBで、CORBAオブジェクトを使用するには、最初にORBを初期化する必要があります。ORBの初期化は、CORBA_ORB_init関数で行い、内部では下の図のようなオブジェクトが生成されています。

この図で、赤枠で示されたオブジェクトが、各関数内で生成されるもので、赤矢印のものがその時に代入処理が実施されたものです。RtORBでは、複数のORBやPOAを作成可能ですが、ほとんどのCOBRAプログラミング(OpenRTM-aistを含めて)では、ORBもPOAも1つあれば十分です。そのため、最新のRtORBでは、ORBもPOAもただ1つしか利用しないことを前提として開発が進められています。
この初期化のフェーズでは、ORB,POAが1つづつ生成される、それぞれ、The_ORB, The_POAという大域変数に代入されています。

CORBAサーバーの生成

次に、CORBAサーバーを生成する場合について見ていきます。RtORBでは、例えば、XXXというクラス名のCORBAサーバーオブジェク卜の生成する場合には、impl_XXX__create関数を呼ぶことによって生成することができます。例えば、exampleとして作成している Echoには、impl_Echo__create関数が使われ、ネームサーバーでは、impl_CosNaming_CosNamingContext__create関数が使われます。
下図に、impl_XXX__create関数で生成されるオブジェクトの概要を示します。

CORBAサーバーを生成するimpl_XXX__create関数では、まず、実装オブジェクトである、Impl_POA_XXXの生成が行われます。そして、POA_XXX__init関数では、PortableServer_ServantBase__init関数、RtORB_POA_Object__create関数が順に呼ばれて、CORBAサーバーオブジェクトの生成が完了します。
PortableServer_ServantBase__init関数では、PortableServer_ServantBase__epvの設定を行っていますが、このPortableServer_ServantBase__epvは、CORBAオブジェクトに必要な基本メソッド(finalize, defaultPOA, is_a, non_existent, add_ref, remove_ref)の実関数の関数ポインタを設定しています。これらの基本メソッドは、RtORBでは共通という前提を持っていますので、必要ないかもしれません。将来的には、この関数自体を削除していくかもしれません。
RtORB_POA_Object__create関数では、Impl_POA_XXXに対応するCORBA_ObjectとRtORB_POA_Objectの生成を行っています。この図から分かるように、Impl_POA_XXXとRtORB_POA_ObjectとCORBA_Objectは相互に参照ポインタが設定されています。そのため、いずれかのオブジェクトを削除する場合には、それぞれを削除する必要があります。
この構成は、少し複雑で、冗長な実装になっていますので、整理する方向で見当を進めています。例えば、RtORB_POA_Objectを省略して、PortableServer_ClassInfoをImpl_POA_XXXに実装させる方法も考えることができます。
次に、生成したCORBAサーバーの有効化を行うために、PortableServer_POA_activate_object関数を実行します。この関数では、Impl_POA_XXXに対応するCORBA_ObjectのIORの設定とPOAのオブジェクト管理テーブルに、Impl_POA_XXXに対応するRtORB_POA_ObjectをObject_IDをキーとして登録を行います。
これらの処理によりCORBAサーバーは、下記のような構成になっています。

上記の構成ではRtORB_POA_Objectの存在意義が小さいので、将来的には下図のように変更したいと思います。


CORBAクライアントの生成

CORBAクライアントを生成するには、2つの方法があります。まず、対象となるCORBAサーバーのIOR文字列が既知である場合には、CORBA_ORB_string_to_object関数を用います。別の方法は、ネームサーバーアクセスして、対象となるCORBAオブジェク卜を生成します。
まず、CORBA_ORB_string_to_object関数の場合です。この関数は、ネームサーバーのCORBAオブジェクト取得のときにも使われます。下の図は、ネームサーバーに対するCORBAオブジェクトを生成するときのものです。

この図から分かるように、CORBAクライアントのオブジェクトは、サーバーに比べると非常にシンプルになっています。クライアント側では、もちろん実装はありませんので、ネットワーク越しに通信するためのGIOP_Connectionがあるのみです。
次にネームサーバーから対象となるオブジェクトを取得する場合には、どうでしょうか。ネームサーバーからCORBAオブジェク卜を取得するには、CosNaming_NamingContext_resolve関数を使います。下にこの関数の概要を示します。

この関数の引数となるrootContextは、ネーミングサーバーに対するCORBAオブジェクトです。通常、ネームサーバーは独立したプログラムですので、クライアントプログラムの内部では invokeMethod_via_GIOP関数が呼ばれ、その結果をdemarshal_by_typecode関数でCORBAクライアントオブジェクトを変換することになります。
上記の2つのCORBAクライアントオブジェクトを比較してみると、どちらもGIOP_Connectionをもつことには違いがありませんが、それを生成するための関数が parseCorbaURL関数なのかそれともparseIOR関数なのかというくらいしか違いがありません。この部分も将来的には、同じ手続にしたいと思っています。