OmniRpcHandleを用いたプログラミング

OmniRpcHandleは、特定のリモート実行プログラムとのコネクションを表現す るためのデータ構造です。これを使うことにより、リモート実行プログラム側 を状態を保持し たプログラミングが可能になります。また、リモート実行プログラムを特定の リモートホストに割り当てることも可能です。

OmniRpcHandleとは
OmniRpcHandleを用いたプログラミング
ホスト情報の取得

OmniRpcHandleとは

OmniRpcHandleは、特定のリモート実行プログラムとのコネクションを表現す るためのデータ構造です。OmniRpcHandleは、OmniRpcCreateHandleによって、 モジュールに対応するリモート実行プログラムを起動することによって作られ ます。いったん、実行を開始したリモート実行プログラムはそれに含まれる関 数を実行した後でも終了せずに、モジュールに含まれる他の関数呼び出しを受 け付けることができます。

これを使うことにより、以下のことができます。

OmniRpcCallでは、リモート関数名のみを指定して、リモート関数を呼び出し ます。関数名から、その関数があるモジュールを検索し、それに 対応するリモート実行モジュールを適当なリモートホストを起動し、割り当て ます。しかし、OmniRpcHandleを使った場合には、どの実行モジュールに対し、 割り当てるのかについてプログラミングしなくてはなりません。また、リモー ト実行モジュールが停止したり、タイムアウトで使えなくなったりする場合にも ユーザが対処しなくてはなりません。

OmniRpcHandleを用いたプログラミング

簡単な例として、関数setABでセットした値を、加算して取り出す関数plusABで 取り出すプログラムとIDLファイルを示します。

Define Sample;

Globals {
 int a,b;
}

Define setAB(int in a0, int in b0)
{
   a = a0; b = b0;
}

Define plusAB(int out ab[])
{
     *ab = a + b;
}

Globalsで、モジュール全体で使われるCの変数の宣言をします。Globals文で は、モジュール定義に使う任意のCの文を記述することができます。

このモジュールをomrpc-ccでコンパイルし、できたSample.rexをリモートホス トalice.is.tsukuba.ac.jpに登録しておきます。

#include <OmniRpc.h>
#include <stdio.h>

int main(int argc,char *argv[]){
   int ab;
   OmniRpcHandle handle;

   OmniRpcInit(&argc,&argv);
   handle = OmniRpcCreateHandle("alice.is.tsukuba.ac.jp","Sample");

   OmniRpcCallbyHandle(handle,"setAB",10,20);
   OmniRpcCallbyHandle(handle,"plusAB",&ab);
   printf("a+b=%d\n",ab);
  
   OmniRpcHandleDestroy(handle);

   OmniRpcFinalize();
   exit(0);
}

初期化したあと、最初にOmniRpcCreateHandleでモジュールに対するリモート 実行プログラムを起動し、それに対するOmniRpcHandleを得ます。これに対し て、OmniRpcCallbyHandleを使ってモジュール内の関数を呼び出すことができ ます。最後に、OmniRpcDestroyHandleを使ってリモート実行プログラムを停止 します。

この他に、非同期呼び出しを行うOmniRpcCallAsyncByHandleを使うことができ ます。

ホスト情報の取得

OmniRpcCreateHandleでは、リモート実行モジュールを起動するホスト名を指 定しますが、これがNULLの場合にはモジュールが登録されている適当なホスト に起動します。

実行時に指定されたhostファイルに記述されたホストから、適当なホストを選 択することも考えられます。情報を取得するAPIには以下のものがあります。 (未実装)