ORB の初期化とRootPOAの取得
Simple Wiki Based Contents Management System
ソフトウェア関連 >> ライブラリ >> RtORBについて >> RtORBの動作について >> ORB の初期化とRootPOAの取得

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と同じような引数(といっても限定していますが)でのオプション処理をする。
【処理の流れ】
  1. RtORB_calloc関数で、ORBのオブジェクト(構造体)の領域確保&初期化。
  2. 引数の処理、ORBServerId、ORBid、ORBListenEndpoints、ORBNoProprietaryActivation、ORBInitRef、ORBDefaultInitRef、ORBServerPortのオプションに応じた処理し、ORB内のcfg変数を更新する。
    但し、現在のところORBInitRef、setDefaultInitRef、ORBServerPort以外の実装はない。
  3. orb->cfg.init_refが存在する場合(ORBInitRefでオブジェクトリファレンスをセットした場合)、一覧を表示する。
  4. CORBA_Ref_find_url(orb->cfg.init_ref, "NameService"); で初期定義にNameServerがあるかどうかを確認。
  5. orb->hostname = (char *)Get_IP_Address(); で起動されたマシンのIPアドレスを所得。(通常は、これがEndPointになる)
  6. PortableServer_POA_new("RootPOA", orb->cfg.port); でRootPOAの生成。
  7. RootPOAのstatus を POA_HOLDINGにセットする。
  8. The_ORBに生成したORBオブジェクトをセットし、The_ORBを返す。

POAの生成

【関数】
PortableServer_POA
PortableServer_POA_new(char *id, unsigned short port)
【動作】
POAの生成と初期化を行い、生成したPOA構造体を返す。
【処理の流れ】
  1. RtORB_calloc関数で、POAのオブジェクト(構造体)の領域確保&初期化。
  2. poa->object_map = createHashtable(64); CORBAサーバント用のハッシュ表を生成。
  3. poa->_server = GIOP_Connection__create(); GIOPのサーバー用ソケット構造体を生成。
  4. GIOP_Connection__open(poa->_server, port); GIOPのサーバー用ソケットを生成する。
  5. poa->requests を初期化。
  6. set_SockProfile_arg(poa->_server->sock, poa); GIOPのサーバー用ソケット構造体の引数としてpoaをセットする。
  7. poa->id = (char *)RtORB_strdup(id, "PortableServer_POA_new"); POAのIDをセットする。

RootPOAの取得

ORBの初期化処理が成功していれば、The_RootPOAという大域変数にRootPOAがセットされている