ORB の初期化とRootPOAの取得
ここでは、RtORBでORBを初期化している部分について述べる。RtORBでは、他のCORBAの実装となるべく同じAPIを使えるように実装をすすめた。RtORBが既存のCORBAとの互換性を無視して(と言ってもデータ通信はできますが)実装すれば、初期化ルーチンは,例えば、Init_RtORBという関数を作ってしまえば、良いと思っています。
以下では、omniORBやMICO、ORBit2を使っていた方々のために作った関数であることを補足しておく。
ORBの初期化
- 【関数】
CORBA_ORB CORBA_ORB_init(int *argc, char **argv, char orb_id, CORBA_Environment *env)
- 【動作】
- この関数は、ORBの初期化を行い、生成したORBを返します。この関数内で、コマンド引数の処理を行いMICOやomniORBと同じような引数(といっても限定していますが)でのオプション処理をする。
- 【処理の流れ】
- RtORB_calloc関数で、ORBのオブジェクト(構造体)の領域確保&初期化。
- 引数の処理、ORBServerId、ORBid、ORBListenEndpoints、ORBNoProprietaryActivation、ORBInitRef、ORBDefaultInitRef、ORBServerPortのオプションに応じた処理し、ORB内のcfg変数を更新する。
但し、現在のところORBInitRef、setDefaultInitRef、ORBServerPort以外の実装はない。 - orb->cfg.init_refが存在する場合(ORBInitRefでオブジェクトリファレンスをセットした場合)、一覧を表示する。
- CORBA_Ref_find_url(orb->cfg.init_ref, "NameService"); で初期定義にNameServerがあるかどうかを確認。
- orb->hostname = (char *)Get_IP_Address(); で起動されたマシンのIPアドレスを所得。(通常は、これがEndPointになる)
- PortableServer_POA_new("RootPOA", orb->cfg.port); でRootPOAの生成。
- RootPOAのstatus を POA_HOLDINGにセットする。
- The_ORBに生成したORBオブジェクトをセットし、The_ORBを返す。
POAの生成
- 【関数】
PortableServer_POA PortableServer_POA_new(char *id, unsigned short port)
- 【動作】
- POAの生成と初期化を行い、生成したPOA構造体を返す。
- 【処理の流れ】
- RtORB_calloc関数で、POAのオブジェクト(構造体)の領域確保&初期化。
- poa->object_map = createHashtable(64); CORBAサーバント用のハッシュ表を生成。
- poa->_server = GIOP_Connection__create(); GIOPのサーバー用ソケット構造体を生成。
- GIOP_Connection__open(poa->_server, port); GIOPのサーバー用ソケットを生成する。
- poa->requests を初期化。
- set_SockProfile_arg(poa->_server->sock, poa); GIOPのサーバー用ソケット構造体の引数としてpoaをセットする。
- poa->id = (char *)RtORB_strdup(id, "PortableServer_POA_new"); POAのIDをセットする。
RootPOAの取得
ORBの初期化処理が成功していれば、The_RootPOAという大域変数にRootPOAがセットされている