RtORBにおいてCORBAサーバントを作成する基本的な流れ
ここでは、RtORBにおけるCOBRAオブジェクトをどのような手順で作成するかの基本的な流れを説明します。タイトルで「CORBAサーバント」という言葉が出てきましたが、サーバント(Servant)とは、サーバー機能とクライアント機能を同時に持つようなオブジェクトのことを指します。
以下では、サーバー側のプログラムとクライアント側のクライアントの基本的な流れを説明します。サーバーにもクライアントにもなるCORBAオブジェクトを使うプログラムを実装する場合には、サーバー側のプログラムと同じになります。
サーバー側のプログラムの流れ
- ORBの初期化:
orb = (CORBA_ORB)CORBA_ORB_init(&argc, argv, 0, &env);
を実行、CORBA_ORB_initの返り値は、orbだが、この時大域変数のThe_ORB、The_RootPOAがセットされる。
- RootPOAの取得:
- 本来であれば、CORBA_ORB_resolve_initial_references関数を実行してRootPOAのCORBAオブジェクトを取得し、narrowでRootPOAを取得。現在が、CORB_ORB_initの時に、大域変数にセットされている。
- CORBAサーバントの生成:
- 次に、サーバントを生成する。サーバントの生成する関数は、idlコンパイラで生成されているはずである。
例えば、サーバントのクラス名がEchoだとするとEcho myEcho = (Echo)impl_Echo__create(poa, &env); catchDefaultException(&env);
となる。catchDefaultException関数は、エラーイベントハンドラである。(C言語では、例外の発生はできないため)
- CORBAサーバントのネームサービスへの登録:
- 生成したCORBAサーバントをNameServerに登録する。
- POAManagerの生成:
- 本来は、POAの状態を管理するのは、POAManagerの役割。そのため、POAManagerを生成する。現在は、POAManagerとPOAは同一オブジェクトになっており、かつ、POAは、RootPOAしか許さないようになっているので、
PortableServer_POA__get_the_POAManager(poa, &env);
の結果は、The_RootPOAと同じになる。
- POAの活性化:
- POAManagerを介してPOAを有効化する。
- ORBの実行:
- CORBA_ORB_run関数を実行して、CORBAのイベントループを起動させる。(ここは無限ループ?)
- ORBの終了:
- CORBA_ORB_run関数で実行されているイベントループの終了後処理。すべてのCORBAサーバント、POA、ORBを解放する。
クライアント側のプログラムの流れ
- ORBの初期化:
orb = (CORBA_ORB)CORBA_ORB_init(&argc, argv, 0, &env);
を実行、CORBA_ORB_initの返り値は、orbだが、この時大域変数のThe_ORB、The_RootPOAがセットされる。
- CORBAオブジェクトの取得:
- ''(IORが既知の場合)''
CORBA_ORB_string_to_object関数を使って、IORからオブジェクトに変換する。この時返り値は、CORBA_Objectになっているので、オオブジェクトの型をCORBA_Object__narrowを使って特殊化する。
''(ネームサーバーからIORを取得する場合)''
CORBA_ORB_resolve_initial_references関数を使ってNameServerのIORを取得。対象となりCORBAオブジェクト用のCosNaming_Nameを生成する。CosNaming_NamingContext_resolve関数で対象のCORBAオブジェクトを取得。
- リモートメッソドの実行:
- 上記で、取得したCORBAオブジェクトに対して、リモートメソッドをコールする。
- ORBの終了と破棄:
- CORBA_ORB_shutdown関数でORBを停止させ、CORBA_ORB_destroy関数でORBを破棄する。
OpenRTM-aist内でのRtORBの動作
OpenRTM-aistでは、RTコンポーネントは、原則としてサーバントとして存在する。RTコンポーネントやORB等の管理は、RTC_Managerで行っており、初期化については、RTC_Manager_initORB関数内で実行されている。
OpenRTM-aist内でのRtORBの初期化プロセスは、下記の通り。
【RTC_Manager_initORB関数】
- mgr->m_pORB = (CORBA_ORB)CORBA_ORB_init(&mgr->argc, mgr->argv, 0, &env); この実行によりORBを初期化し、Managerオブジェクトのm_pORBにORBをセットする。
- mgr->m_pPOA = The_RootPOA; この実行でManagerオブジェクトのm_pPOAにRootPOAをセットする。
- mgr->m_pPOAManager = (PortableServer_POAManager)PortableServer_POA__get_the_POAManager(mgr->m_pPOA, &env); この実行で、POAManagerを生成する。Managerオブジェクトのm_pPOAManagerにPOAManagerをセットする。
- PortableServer_POAManager_activate(mgr->m_pPOAManager, &env); POAの活性化。