﻿
		IPRPC - Inter Process Remote Procedure Call


							　　2013.01.08   V.0.5.0
							　　2013.01.14   V.0.6.0
							　　2013.01.19   V.0.8.0

■　INTRODUCTION
　このライブラリは同一のコンピュータ内のプロセス間でRPCを実現するためのものである。
このライブラリは以下のモデルでRPCのプログラミングを行う。

__________　　__________　　__________　　__________　　__________　　__________
|　　　　|--->|　　　　|　　|　　　　|　　|　　　　|　　|　　　　|　　|　　　　|
|　　　　|　　|　　　　|--->|　　　　|　　|　　　　|　　|　　　　|　　|　　　　|
|　　　　|　　|　　　　|　　|　　　　|--->|　　　　|　　|　　　　|　　|　　　　|
|　　　　|　　|　　　　|　　|　　　　|　　|　　　　|--->|　　　　|　　|　　　　|
|　　　　|　　|　　　　|　　|　　　　|　　|　　　　|　　|　　　　|--->|　　　　|
|呼出関数|　　|ラッパー|　　|STUB LIB|　　|SKELTON |　　|ラッパー|　　|実行関数|
|　　　　|　　|　　　　|　　|　　　　|　　|   LIB  |　　|　　　　|<---|　　　　|
|　　　　|　　|　　　　|　　|　　　　|　　|　　　　|<---|　　　　|　　|　　　　|
|　　　　|　　|　　　　|　　|　　　　|<---|　　　　|　　|　　　　|　　|　　　　|
|　　　　|　　|　　　　|<---|　　　　|　　|　　　　|　　|　　　　|　　|　　　　|
|　　　　|<---|　　　　|　　|　　　　|　　|　　　　|　　|　　　　|　　|　　　　|
~~~~~~~~~~　　~~~~~~~~~~　　~~~~~~~~~~　　~~~~~~~~~~　　~~~~~~~~~~　　~~~~~~~~~~

　STUB LIBとSKELTON LIBの間はプロセス間通信(IPC)を使って実現されており、このライ
ブラリでは共有メモリと、Mutex/Condを使ったメッセージキューにより実装されている。
その他は通常の関数コールで実現される。
　呼出関数、実行関数と、STUB側およびSKELTON側のラッパー関数は利用者が作成する必要
があるが、STUB LIBとSKELTON LIBはライブラリが提供する。

　このライブラリではRPCの機能のうち
　　１：同期型のRPCと非同期型のRPC
　　２：タイムアウト
　　３：実行のキャンセル
　　４：Multicast型のRPC
をサポートしている。
　非同期型のRPCとは実行関数の実行依頼をすると一旦呼び出し側に制御が戻り、実行関数
の動作が完了すると呼び出し側へはコールバック関数により結果が通知される仕組みであ
る。これにより呼び出し元は呼び出し先の動作の完了を待つことなく次の動作を実行する
ことができる。
　タイムアウトは呼び出し時に実行関数のタイムアウト時間を設定し、タイムアウトが発
生すると、エラーとして呼び出し元に制御が戻る仕組みである。実行関数内でタイムアウト
機能が実装されていなくても、STUB LIBないでタイムアウト機能が組み込まれているため、
タイムアウトが発生した場合は呼び出し元に制御が戻るようになっている。その場合、
STUB LIBでタイムアウトが発生した後、実行関数からリターンがあっても結果は捨てられ
るので注意する。
　実行のキャンセル機能は、一旦呼び出し元から呼び出し先の実行関数がコールされた後、
呼び出し元から実行されている動作をキャンセルするためのものである。キャンセル機能
はライブラリにキャンセル実行の動作を伝えるのみで、実際に動作のキャンセルができる
かどうかは実行関数の実装による。従って、キャンセル呼び出しの関数が成功で返ってき
ても本当に動作がキャンセルできるかは実装依存となる。
　Multicast RPCは1度の関数呼び出しで複数の相手に実行制御を渡すことができる。例え
ば呼び出し側はFUNC-Aという関数の呼び出しに対し、PROCESS BのFUNC-B、PROCESS Cの
FUNC-C、PROCESS DのFUNC-Dが実行されるようなケースである(下記図）。この場合SKELTON
側（実際に関数を実行する側）は通常のRPCと同一の動作となるが、STUB側（関数を呼び出
す側）は戻り値が通常はそれぞれ呼び出し先の実行関数から返ってくるため複数となる。
従って、戻り値の配列として結果が返ってくる。また、タイムアウトが発生した場合もエ
ラーとせずタイムアウト時間までに返ってきた戻り値は結果として返すようにしている。
　ここで注意してほしいのは、このライブラリでは通常のRPCにおいても呼び出し元と呼び
出し先が同一のプロセスであっても正しく動作する、ということである。従って、
MULTICAST RPCにおいても、呼び出し先のプロセスが呼び出し元のプロセスと同一であって
も動作するので、同一プロセス内でのMULTICAST関数呼び出しにも使える、ということであ
る。

　　　　　　　　　　　　　　　　　　　　　__________　　__________　　__________
　　　　　　　　　　　　　　　　　　　　　|　　　　|　　|　　　　|　　|　　　　|
　　　　　　　　　　　　　　　　　　　　　|　　　　|　　|　　　　|　　|　　　　|
　　　　　　　　　　　　　　　　　　　 |->|SKELTON |--->|ラッパー|--->|実行関数|
　　　　　　　　　　　　　　　　　　　 |　|   LIB  |　　|　　　　|　　|A 　　　|
　　　　　　　　　　　　　　　　　　　 |　|　　　　|　　|　　　　|　　|　　　　|
　　　　　　　　　　　　　　　　　　　 |　~~~~~~~~~~　　~~~~~~~~~~　　~~~~~~~~~~
__________　　__________　　__________ |　__________　　__________　　__________
|　　　　|　　|　　　　|　　|　　　　| |　|　　　　|　　|　　　　|　　|　　　　|
|　　　　|　　|　　　　|　　|　　　　| |　|　　　　|　　|　　　　|　　|　　　　|
|呼出関数|--->|ラッパー|--->|STUB LIB|--->|SKELTON |--->|ラッパー|--->|実行関数|
|　　　　|　　|　　　　|　　|　　　　| |　|   LIB  |　　|　　　　|　　|B 　　　|
|　　　　|　　|　　　　|　　|　　　　| |　|　　　　|　　|　　　　|　　|　　　　|
~~~~~~~~~~　　~~~~~~~~~~　　~~~~~~~~~~ |　~~~~~~~~~~　　~~~~~~~~~~　　~~~~~~~~~~
　　　　　　　　　　　　　　　　　　　 |　__________　　__________　　__________
　　　　　　　　　　　　　　　　　　　 |　|　　　　|　　|　　　　|　　|　　　　|
　　　　　　　　　　　　　　　　　　　 |　|　　　　|　　|　　　　|　　|　　　　|
　　　　　　　　　　　　　　　　　　　 |->|SKELTON |--->|ラッパー|--->|実行関数|
　　　　　　　　　　　　　　　　　　　　　|   LIB  |　　|　　　　|　　|C　　　|
　　　　　　　　　　　　　　　　　　　　　|　　　　|　　|　　　　|　　|　　　　|
　　　　　　　　　　　　　　　　　　　　　~~~~~~~~~~　　~~~~~~~~~~　　~~~~~~~~~~

　また、MULTICASTで呼び出した先の手続きの中でさらにMULTICAST RPCを呼び出すことも
可能である。但し、戻り値の処理がかなり複雑になるのでMULTICAST RPCの先でさらに
MULTICAST RPCを実行することはやらない方がよいであろう。

　このライブラリでは追加の機能としてランデブを実装している。ランデブはスレッド間
で同期をとるためのものである。例えば以下のようにランデブポイントに対して、スレッド
AがスレッドBにメッセージXを送信し、スレッドBがスレッドAに対してメッセージYを送信
するような場合、スレッドAがRendezvSendを呼び出しても、スレッドBがRendezvRecvと
RendezvReplyを呼び出さないと次の動作に進まない。またスレッドBもRendezvRecvを呼
び出さしても、スレッドAがRendezvSendを呼び出さないと次の動作に進まない。すなわち、
スレッド間で実行の同期が起こる。

　　　スレッドA 　　　　　　　　　　　　　　　　　スレッドB 　　　
　　　　　| 　　　　　　　　　　　　　　　　　　　　　 |　　　　　
　　　　　| 　　　　　　　ランデブポイント　　　　　　 |　　　　　
　　　　　| 　　　　　　　　__________　　　　　　　　 |　　　　　
　　　　　| 　RendezvSend 　|　　　　|　　　　　　　　 |　　　　　
　　　　　|---------------->|　　　　|　　　　　　　　 |　　　　　
　　　　　| 　　SEND X　　　|　　　　|　RendezvRecv 　 |　　　　　
　　　　　| 　　　　　　　　|　　　　|<----------------|　　　　　
　　　　　| 　　　　　　　　|　　　　|　　　Return　　 |　　　　　
　　　　　| 　　　　　　　　|　　　　|---------------->|　　　　　
　　　　　| 　　　　　　　　|　　　　|　　RECV X　　　 |　　　　　
　　　　　| 　　　　　　　　|　　　　|　　　　　　　　 |　　　　　
　　　　　| 　　　　　　　　|　　　　|　RendezvReply　 |　　　　　
　　　　　| 　　　　　　　　|　　　　|<----------------|　　　　　
　　　　　| 　　　　　　　　|　　　　|　　SEND Y　　　 |　　　　　
　　　　　| 　　　　　　　　|　　　　|　　　　　　　　 |　　　　　
　　　　　| 　　　Return　　|　　　　|---------------->|　　　　　
　　　　　|<----------------|　　　　|　　　　Return　 |　　　　　
　　　　　| 　　RECV Y　　　|　　　　|　　　　　　　　 |　　　　　
　　　　　| 　　　　　　　　~~~~~~~~~~　　　　　　　　 |　　　　　
　　　　　| 　　　　　　　　　　　　　　　　　　　　　 |　　　　　
　　　　　| 　　　　　　　　　　　　　　　　　　　　　 |　　　　　



■　BUILD THE LIBRARY

　このライブラリを生成するには以下の手順で行う。

　　　$ ./configure prefix=/usr/local USE_HASH=YES OS_TYPE=LINUX
　　　　　　...
　　　$ make

　この時点で上記コマンドを実行したディレクトリにライブラリが生成される。ライブラ
リはstaticなものとsharedなもの両方が生成される。
　この後、インストールのために以下のコマンドを実行する。

　　　$ make install

　これで、configureコマンドで指定したディレクトリ（指定しなかった場合は通常/usr/
local/下）にライブラリがインストールされる。但し、installは一旦rootになって実行
した方がよいかもしれない。



■　GETTING STARTED

　１：テストプログラム実行
　ライブラリ作成後、以下のコマンドを実行することによってテストプログラムがコンパ
イルされる。

　　　$ make test

その結果、ipcTest.outが生成される。このプログラムは以下のように４つのプロセスを
生成してプロセス間でRPCを実行する（IPRPC）。


　　　　　　　　　　　　　　　　__________________
　　　　　　　　　　　　　　　　|　　　　　　　　|
　　　　　　　　　　　　　　　　|　MAIN PROCESS　| PROCESS A, B, C, Dを生成
　　　　　　　　　　　　　　　　|　　　　　　　　|
　　　　　　　　　　　　　　　　~~~~~~~~~~~~~~~~~~
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
　　　　　　　　　　---------------------
　　____________　　| 　____________　　| 　____________　　　　____________
　　|　　　　　|　　| 　|　　　　　|　　| 　|　　　　　|　　　　|　　　　　|
　　|　　　　　|　　| 　|　　　　　|　　--->|　　　　　|　　　　|　　　　　|
　　|　　　　　|　　| 　|　　　　　|　　　　|　　　　　|　　　　|　　　　　|
　　|PROCESS A |----- 　|PROCESS B |------->|PROCESS C |------->|PROCESS D |---
　　|　　　　　|　　　　|　　　　　|　　　　|　　　　　|　　　　|　　　　　|　|
　　|　　　　　|　　--->|　　　　　|　　　　|　　　　　|　　　　|　　　　　|　|
　　|　　　　　|　　| 　|　　　　　|　　　　|　　　　　|　　　　|　　　　　|　|
　　~~~~~~~~~~~~　　| 　~~~~~~~~~~~~　　　　~~~~~~~~~~~~　　　　~~~~~~~~~~~~　|
　　　　　　　　　　|----------------------------------------------------------


プロセスAは最初の呼び出しの起点となるプロセスであり、従ってSTUBの機能しか持たな
い。プロセスB、プロセスC、プロセスDは巡回してIPRPCを呼び出す。最終的には巡回は止
まって逆のルートで結果を戻す。
　このプログラムを起動するには以下のにコマンドを入力する

　　　$ ./ipcTest.out 1 0 0

　このコマンドは３つに引数を持ち、最初の引数がマスタープロセスかどうかを示すフラ
グ、2番目がSTUBを使用するかどうかのフラグ、3番目がSKELTONを使用するかどうかのフラ
グである。なおこのコマンドを実行すると４つのプロセスが生成されるが、それぞれ生成
されたプロセスはこのコマンドと同じ実行ファイル、すなわち"./ipcTest.out"を実行する
ようになっている。

　実際にこのコマンドを実行すると以下のようなログが出力される。

./ipcTest.out PID:0xff4; masterProcess:1; useSkelton:0; useStub:0;
　　　　　　　→　MAIN PROCESS
CREATED PROCESS PID:0xff5; AND NOW REGISTER SKELTON MAIN FUNCTION FUNCID:0xfff2001; FUNC:0x804af41; ... ...DONE
CREATED PROCESS PID:0xff6; AND NOW REGISTER SKELTON MAIN FUNCTION FUNCID:0xfff1001; FUNC:0x80494a0; ... ...DONE
CREATED PROCESS PID:0xff7; AND NOW REGISTER SKELTON MAIN FUNCTION FUNCID:0xfff1002; FUNC:0x8049583; ... ...DONE
CREATED PROCESS PID:0xff8; AND NOW REGISTER SKELTON MAIN FUNCTION FUNCID:0xfff1003; FUNC:0x8049666; ... ...DONE
MAIN  :DEBUG1:NOW WAIT CHILD PROCESS TO EXIT PID:0xff4;
MAIN  :DEBUG1:NOW EXEC TEST PROGRAM PID:0xff5; --- CHILD --- ARG1:0; ARG2:0; ARG3:1;
MAIN  :DEBUG1:NOW EXEC TEST PROGRAM PID:0xff7; --- CHILD --- ARG1:0; ARG2:1; ARG3:1;
MAIN  :DEBUG1:NOW EXEC TEST PROGRAM PID:0xff8; --- CHILD --- ARG1:0; ARG2:1; ARG3:1;
./ipcTest.out PID:0xff8; masterProcess:0; useSkelton:1; useStub:1;
　　　　　　　→　PROCESS D
MAIN  :DEBUG1:NOW EXEC TEST PROGRAM PID:0xff6; --- CHILD --- ARG1:0; ARG2:1; ARG3:1;
./ipcTest.out PID:0xff6; masterProcess:0; useSkelton:1; useStub:1;
　　　　　　　→　PROCESS B
./ipcTest.out PID:0xff7; masterProcess:0; useSkelton:1; useStub:1;
　　　　　　　→　PROCESS C
./ipcTest.out PID:0xff5; masterProcess:0; useSkelton:0; useStub:1;
　　　　　　　→　PROCESS A
MAIN  :DEBUG1:NOW CALL SkeltonTest PID:0xff6; SkeltonFunc:0x80494a0; 
SKLTN :DEBUG1:IN SkeltonTest1 PID:0xff6; 
　　　　　　　→　PROCESS Bの起動
MAIN  :DEBUG1:NOW CALL SkeltonTest PID:0xff8; SkeltonFunc:0x8049666; 
SKLTN :DEBUG1:IN SkeltonTest3 PID:0xff8;
　　　　　　　→　PROCESS Dの起動
MAIN  :DEBUG1:NOW CALL SkeltonTest PID:0xff5; SkeltonFunc:0x804af41; 
STUB  :DEBUG1:IN StubTestA PID:0xff5;
　　　　　　　→　PROCESS Aの起動
MAIN  :DEBUG1:NOW CALL SkeltonTest PID:0xff7; SkeltonFunc:0x8049583; 
SKLTN :DEBUG1:IN SkeltonTest2 PID:0xff7;
　　　　　　　→　PROCESS Cの起動
STUB  :DEBUG1:IN FunctioncStubA PID:0xff5;, count:6; fromProcess:StubTest1; toProcess:SkeltonTest2;
STUB  :DEBUG1:IN IPC_CallStubSync PID:0xff5; funcID:0xfff0002; inData:0xb82080b8; inSize:96; outData:0xbfb65254; outSize:0xbfb65258; timeOut:10000;
　　　　　　　→　PROCESS AによるSTUBの呼び出し
SKLTN :DEBUG1:IN skeltonFuncB PID:0xff5; seqNum:0x1; inData:0xb82080b8; inSize:0x60, outData:0xb4f552fc; outSize:0xb4f55300; timeOut:10000;
SKLTN :DEBUG1:IN FunctionB PID:0xff7; count:6; fromProcess:StubTest1; toProcess:SkeltonTest2;
　　　　　　　→　PROCESS Cによる実行関数の呼び出し
SKLTN :DEBUG1: NOW CALL FunctionStubB count:5; from:SkeltonTest2; to:SkeltonTest3;
STUB  :DEBUG1:IN FunctioncStubB PID:0xff7;, count:5; fromProcess:SkeltonTest2; toProcess:SkeltonTest3;
STUB  :DEBUG1:IN IPC_CallStubSync PID:0xff7; funcID:0xfff0003; inData:0xb82080b8; inSize:96; outData:0xb4f4e964; outSize:0xb4f4e968; timeOut:10000;
　　　　　　　→　PROCESS CによるSTUBの呼び出し
SKLTN :DEBUG1:IN skeltonFuncC PID:0xff7; seqNum:0x1; inData:0xb82080b8; inSize:0x60, outData:0xb4eea2fc; outSize:0xb4eea300; timeOut:10000;
SKLTN :DEBUG1:IN FunctionC PID:0xff8; count:5; fromProcess:SkeltonTest2; toProcess:SkeltonTest3;
　　　　　　　→　PROCESS Dによる実行関数の呼び出し
SKLTN :DEBUG1: NOW CALL FunctionStubC count:4; from:SkeltonTest3; to:SkeltonTest1;
STUB  :DEBUG1:IN FunctioncStubC PID:0xff8;, count:4; fromProcess:SkeltonTest3; toProcess:SkeltonTest1;
STUB  :DEBUG1:IN IPC_CallStubSync PID:0xff8; funcID:0xfff0001; inData:0xb82080b8; inSize:96; outData:0xb4ee3964; outSize:0xb4ee3968; timeOut:10000;
　　　　　　　→　PROCESS DによるSTUBの呼び出し
SKLTN :DEBUG1:IN skeltonFuncA PID:0xff8; seqNum:0x1; inData:0xb82080b8; inSize:0x60, outData:0xb4f1d2fc; outSize:0xb4f1d300; timeOut:10000;
SKLTN :DEBUG1:IN FunctionA PID:0xff6; count:4; fromProcess:SkeltonTest3; toProcess:SkeltonTest1;
　　　　　　　→　PROCESS Bによる実行関数の呼び出し
SKLTN :DEBUG1: NOW CALL FunctionStubA count:3; from:SkeltonTest1; to:SkeltonTest2;
STUB  :DEBUG1:IN FunctioncStubA PID:0xff6;, count:3; fromProcess:SkeltonTest1; toProcess:SkeltonTest2;
STUB  :DEBUG1:IN IPC_CallStubSync PID:0xff6; funcID:0xfff0002; inData:0xb82080b8; inSize:96; outData:0xb4f16964; outSize:0xb4f16968; timeOut:10000;
　　　　　　　→　PROCESS BによるSTUBの呼び出し
SKLTN :DEBUG1:IN skeltonFuncB PID:0xff6; seqNum:0x1; inData:0xb82080b8; inSize:0x60, outData:0xb57562fc; outSize:0xb5756300; timeOut:10000;
SKLTN :DEBUG1:IN FunctionB PID:0xff7; count:3; fromProcess:SkeltonTest1; toProcess:SkeltonTest2;
　　　　　　　→　PROCESS Cによる実行関数の呼び出し
SKLTN :DEBUG1: NOW CALL FunctionStubB count:2; from:SkeltonTest2; to:SkeltonTest3;
STUB  :DEBUG1:IN FunctioncStubB PID:0xff7;, count:2; fromProcess:SkeltonTest2; toProcess:SkeltonTest3;
STUB  :DEBUG1:IN IPC_CallStubSync PID:0xff7; funcID:0xfff0003; inData:0xb82080b8; inSize:96; outData:0xb574f964; outSize:0xb574f968; timeOut:10000;
　　　　　　　→　PROCESS CによるSTUBの呼び出し
SKLTN :DEBUG1:IN skeltonFuncC PID:0xff7; seqNum:0x2; inData:0xb82080b8; inSize:0x60, outData:0xb56eb2fc; outSize:0xb56eb300; timeOut:10000;
SKLTN :DEBUG1:IN FunctionC PID:0xff8; count:2; fromProcess:SkeltonTest2; toProcess:SkeltonTest3;
　　　　　　　→　PROCESS Dによる実行関数の呼び出し
SKLTN :DEBUG1: NOW CALL FunctionStubC count:1; from:SkeltonTest3; to:SkeltonTest1;
STUB  :DEBUG1:IN FunctioncStubC PID:0xff8;, count:1; fromProcess:SkeltonTest3; toProcess:SkeltonTest1;
STUB  :DEBUG1:IN IPC_CallStubSync PID:0xff8; funcID:0xfff0001; inData:0xb82080b8; inSize:96; outData:0xb56e4964; outSize:0xb56e4968; timeOut:10000;
　　　　　　　→　PROCESS DによるSTUBの呼び出し
SKLTN :DEBUG1:IN skeltonFuncA PID:0xff8; seqNum:0x2; inData:0xb82080b8; inSize:0x60, outData:0xb571e2fc; outSize:0xb571e300; timeOut:10000;
SKLTN :DEBUG1:IN FunctionA PID:0xff6; count:1; fromProcess:SkeltonTest3; toProcess:SkeltonTest1;
　　　　　　　→　PROCESS Bによる実行関数の呼び出し
SKLTN :DEBUG1: ##### OK COUNT IS 0, SO FINISH IN FunctionA PID:0xff6; #####
SKLTN :DEBUG1:OUT FunctionA PID:0xff6; RET:0x1;
　　　　　　　→　PROCESS Bによる実行関数の戻り
SKLTN :DEBUG1:OUT skeltonFuncA PID:0xff8; seqNum:0x2;
STUB  :DEBUG1:OUT IPC_CallStubSync PID:0xff8; funcID:0xfff0001; outData:0xb82080b8; outSize:80;
　　　　　　　→　PROCESS DによるSTUBの戻り
STUB  :DEBUG1:OUT FunctioncStubC PID:0xff8; RET-CODE:0xa; from:SkeltonTest1; to:SkeltonTest3;
SKLTN :DEBUG1: RETURN FunctionStubC retVal:10; fromRet:SkeltonTest1; toRet:SkeltonTest3;
SKLTN :DEBUG1:OUT FunctionC PID:0xff8; RET:0x1;
　　　　　　　→　PROCESS Dによる実行関数の戻り
SKLTN :DEBUG1:OUT skeltonFuncC PID:0xff7; seqNum:0x2;
STUB  :DEBUG1:OUT IPC_CallStubSync PID:0xff7; funcID:0xfff0003; outData:0xb82080b8; outSize:80;
　　　　　　　→　PROCESS CによるSTUBの戻り
STUB  :DEBUG1:OUT FunctioncStubB PID:0xff7; RET-CODE:0xc; from:SkeltonTest3; to:SkeltonTest2;
SKLTN :DEBUG1: RETURN FunctionStubB retVal:12; fromRet:SkeltonTest3; toRet:SkeltonTest2;
SKLTN :DEBUG1:OUT FunctionB PID:0xff7; RET:0x1;
　　　　　　　→　PROCESS Cによる実行関数の戻り
SKLTN :DEBUG1:OUT skeltonFuncB PID:0xff6; seqNum:0x1;
STUB  :DEBUG1:OUT IPC_CallStubSync PID:0xff6; funcID:0xfff0002; outData:0xb82080b8; outSize:80;
　　　　　　　→　PROCESS BによるSTUBの戻り
STUB  :DEBUG1:OUT FunctioncStubA PID:0xff6; RET-CODE:0xb; from:SkeltonTest2; to:SkeltonTest1;
SKLTN :DEBUG1: RETURN FunctionStubA retVal:11; fromRet:SkeltonTest2; toRet:SkeltonTest1;
SKLTN :DEBUG1:OUT FunctionA PID:0xff6; RET:0x1;
　　　　　　　→　PROCESS Bによる実行関数の戻り
SKLTN :DEBUG1:OUT skeltonFuncA PID:0xff8; seqNum:0x1;
STUB  :DEBUG1:OUT IPC_CallStubSync PID:0xff8; funcID:0xfff0001; outData:0xb82080b8; outSize:80;
　　　　　　　→　PROCESS DによるSTUBの戻り
STUB  :DEBUG1:OUT FunctioncStubC PID:0xff8; RET-CODE:0xa; from:SkeltonTest1; to:SkeltonTest3;
SKLTN :DEBUG1: RETURN FunctionStubC retVal:10; fromRet:SkeltonTest1; toRet:SkeltonTest3;
SKLTN :DEBUG1:OUT FunctionC PID:0xff8; RET:0x1;
　　　　　　　→　PROCESS Dによる実行関数の戻り
SKLTN :DEBUG1:OUT skeltonFuncC PID:0xff7; seqNum:0x1;
STUB  :DEBUG1:OUT IPC_CallStubSync PID:0xff7; funcID:0xfff0003; outData:0xb82080b8; outSize:80;
　　　　　　　→　PROCESS CによるSTUBの戻り
STUB  :DEBUG1:OUT FunctioncStubB PID:0xff7; RET-CODE:0xc; from:SkeltonTest3; to:SkeltonTest2;
SKLTN :DEBUG1: RETURN FunctionStubB retVal:12; fromRet:SkeltonTest3; toRet:SkeltonTest2;
SKLTN :DEBUG1:OUT FunctionB PID:0xff7; RET:0x1;
　　　　　　　→　PROCESS Cによる実行関数の戻り
SKLTN :DEBUG1:OUT skeltonFuncB PID:0xff5; seqNum:0x1;
STUB  :DEBUG1:OUT IPC_CallStubSync PID:0xff5; funcID:0xfff0002; outData:0xb82080b8; outSize:80;
　　　　　　　→　PROCESS AによるSTUBの戻り
STUB  :DEBUG1:OUT FunctioncStubA PID:0xff5; RET-CODE:0xb; from:SkeltonTest2; to:StubTest1;
STUB  :DEBUG1: ##### OK SUCCESS TO RETURN SYNC FUNC RET-VAL:0xb; fromRet:SkeltonTest2; toRet:StubTest1; #####
SKLTN :DEBUG1:OUT SkeltonTest1 PID:0xff6;
MAIN  :DEBUG1:RETURN SkeltonTest PID:0xff6;
MAIN  :DEBUG1:NOW PROCESS IS EXITED PID:0xff6; MASTER:0; SKELTON:1; STUB:1;
SKLTN :DEBUG1:OUT SkeltonTest3 PID:0xff8;
MAIN  :DEBUG1:RETURN SkeltonTest PID:0xff8;
MAIN  :DEBUG1:NOW PROCESS IS EXITED PID:0xff8; MASTER:0; SKELTON:1; STUB:1;
MAIN  :DEBUG1:RETURN FROM WAIT PID:0xff6; STATUS:0x0;
MAIN  :DEBUG1:RETURN FROM WAIT PID:0xff8; STATUS:0x0;
SKLTN :DEBUG1:OUT SkeltonTest2 PID:0xff7;
MAIN  :DEBUG1:RETURN SkeltonTest PID:0xff7;
MAIN  :DEBUG1:NOW PROCESS IS EXITED PID:0xff7; MASTER:0; SKELTON:1; STUB:1;
MAIN  :DEBUG1:RETURN FROM WAIT PID:0xff7; STATUS:0x0;
STUB  :DEBUG1:OUT StubTestA PID:0xff5;
MAIN  :DEBUG1:RETURN SkeltonTest PID:0xff5;
MAIN  :DEBUG1:NOW PROCESS IS EXITED PID:0xff5; MASTER:0; SKELTON:0; STUB:1;
MAIN  :DEBUG1:RETURN FROM WAIT PID:0xff5; STATUS:0x0;
MAIN  :DEBUG1:END WAIT CHILD PROCESS TO EXIT PID:0xff4;
MAIN  :DEBUG1:NOW PROCESS IS EXITED PID:0xff4; MASTER:1; SKELTON:0; STUB:0;



　２：ライブラリを使ってIPRPCプログラミング

　　・実行関数のラッパー関数の実装
　　　目的の機能を実現するための実行関数を呼び出すラッパー関数を実装する必要があ
　　　る。ラッパー関数の関数仕様は以下に規定されるものでなければならない。

　　　IpcResult_t (*IPC_SkeltonFunc_t)(
　　　　　　uint32_t processId, 
　　　　　　uint32_t seqNum, 
　　　　　　void *inData ,
　　　　　　uint32_t inSize, 
　　　　　　void **outData, 
　　　　　　int32_t *outSize, 
　　　　　　uint32_t timeOut);

　　　上記テストプログラムでは以下のように実装されている。

static RpcResult_t skeltonFuncA(uint32_t processId, uint32_t seqNum, void *inData ,uint32_t inSize, void **outData, int32_t *outSize, uint32_t timeOut) {
　　　　　....
	if((ret = IPC_Unmarshal(inData, inSize, inParam, 1024*10)) != RPC_SUCCESS) {
　　　　　....
		return IPC_FATAL_ERROR;
	}
	fromPid = *((uint32_t*)((RpcParamData_t*)inParam)[0].paramData);
	count = *((uint32_t*)((RpcParamData_t*)inParam)[1].paramData);
	memcpy(fromProcess,((RpcParamData_t*)inParam)[2].paramData,((RpcParamData_t*)inParam)[2].paramSpec.paramLeng);
	fromProcess[((RpcParamData_t*)inParam)[2].paramSpec.paramLeng] = 0;
	memcpy(toProcess, ((RpcParamData_t*)inParam)[3].paramData, ((RpcParamData_t*)inParam)[3].paramSpec.paramLeng);
	toProcess[((RpcParamData_t*)inParam)[3].paramSpec.paramLeng] = 0;
	if((ret = FunctionA(count,fromProcess, toProcess,  &retVal, fromRet, toRet)) != RPC_SUCCESS) {
　　　　　....
		return IPC_FATAL_ERROR;
	}
	if((ret = setSkeltonParam(retVal, fromRet, toRet, retParam, outData, outSize)) != RPC_SUCCESS) {
　　　　　....
		return IPC_FATAL_ERROR;
	}
　　　　　....
	return RPC_SUCCESS;
}

　　　ここでは以下の３つの事柄を行っている。
　　　　・入力パラメタを変換し実行関数に渡せる形式にする。
　　　　　　　→IPC_UnMarshal関数を使用する。
　　　　・実行関数の呼び出し。
　　　　　　　→FunctionAの呼び出し
　　　　・実行関数からの出力パラメタを変換し呼び出し元プロセスに渡せる形式にする
　　　　　　　→IPC_Marshal関数を使用する。上記プログラムではsetSkeltonParam内
　　　　　　　　で呼ばれている。


　　・実行関数のラッパー関数の登録
　　　SKELTON側に実行関数のラッパー関数をデータベースに登録しなければならない。
　　　登録するためには以下の関数を使用する

　　　RpcResult_t IPC_SkeltonRegisterFunction(
　　　　　　uint32_t funcId,
　　　　　　IPC_SkeltonFunc_t func,
　　　　　　IPC_SkeltonCancelFunc_t cancelFunc);

　　　上記テストプログラムでは以下のように実装されている。

RpcResult_t SkeltonTest1(void) {
　　　　　....
	if((ret = IPC_RegisterFuncDBEntry(IPC_FUNCTION_A_FUNC_ID, pid, skeltonFuncA,skeltonFuncCancelA)) != RPC_SUCCESS) {
　　　　　....
	}
　　　　　....
	return RPC_SUCCESS;
}

　　　なお、上記テストプログラムではキャンセル関数のラッパー関数も登録しているが、
　　　とりあえずはNULLでも構わない。
　　　上記ではデータベースのライブラリ関数を使って登録をしているが、実装する際は
　　　スケルトンの登録関数を使うこと。

　　・STUBのラッパー関数の実装
　　　STUBの呼び出し(RPC)は以下のように定義されている（同期RPCの場合）。

　　　RpcResult_t IPC_CallStubSync(
　　　　　　uint32_t funcID, 
　　　　　　void *inData, 
　　　　　　uint32_t inSize, 
　　　　　　void **outData, 
　　　　　　uint32_t *outSize, 
　　　　　　uint32_t timeOut, 
　　　　　　uint32_t *errCode);

　　　この関数を呼び出すためのラッパー関数を実装する必要がある。上記テストプログ
　　　ラムでは以下のように実装している。

RpcResult_t FunctionStubA(uint32_t count, char *fromProcess, char *toProcess, uint32_t *retVal, char *fromRet, char *toRet) {
　　　　　....
	if((ret = setStubParam(inData, pid, count, fromProcess, toProcess, &outData, &outSize)) != RPC_SUCCESS) {
		return ret;
	}
	timeOut = 1000*10;
	if((ret = IPC_CallStubSync(IPC_FUNCTION_B_FUNC_ID, outData, outSize, &retData, &retSize,timeOut, &errCode)) != RPC_SUCCESS) {
　　　　　....
		return ret;
	}
　　　　　....
	if((ret = IPC_Unmarshal(retData, retSize, retParam, retParamSizee)) != RPC_SUCCESS) {
　　　　　....
		return ret;
	}
	*retVal = *((uint32_t*)((RpcParamData_t*)retParam)[0].paramData);
	memcpy(fromRet,((RpcParamData_t*)retParam)[1].paramData,((RpcParamData_t*)retParam)[1].paramSpec.paramLeng);
	fromRet[((RpcParamData_t*)retParam)[1].paramSpec.paramLeng] = 0;
	memcpy(toRet, ((RpcParamData_t*)retParam)[2].paramData, ((RpcParamData_t*)retParam)[2].paramSpec.paramLeng);
	toRet[((RpcParamData_t*)retParam)[2].paramSpec.paramLeng] = 0;
　　　　　....
	return ret;
}

　　　ここでは以下の３つの事柄を行っている。
　　　　・実行関数への入力パラメタを変換し相手プロセスに渡せる形式にする。
　　　　　　　→IPC_Marshal関数を使用する。上記プログラムではsetStubParam内で呼ば
　　　　　　　　れている。
　　　　・STUBの呼び出し(RPC)
　　　　　　　→IPC_CallStubSyncの呼び出し
　　　　・実行関数からの出力パラメタを変換し呼び出し元の関数に渡せる形式にする。
　　　　　　　→IPC_Unmarshal関数を使用する。

　　・呼び出し元プロセス用の関数、呼び出し先プロセス用の関数を実装
　　　呼び出し元および呼び出し先のプロセスを実行する関数は以下のライブラリ初期化
　　　関数を実行する必要がある。

　　　RpcResult_t IPC_InitIprpc(
　　　　　　RpcBool_t masterProcess, 
　　　　　　RpcBool_t useSkelton, 
　　　　　　RpcBool_t useStub, 
　　　　　　RpcLogLevel_t logLevel);

　　　この関数を呼び出したあと、呼び出し先プロセス用関数であれば、実行関数のラッ
　　　パー関数をSKELTONに登録し、呼び出し元プロセス用関数であれば、STUBのラッパー
　　　関数を呼び出せばよい。



■　CONFIGURATION

　このライブラリのコンフィグレーションとして、configureコマンド実行時に設定する
ものと、プログラムのヘッダファイルで設定するものの2種類ある。

　１：configure
　configureコマンドで設定するものとしては以下のものがある。但しconfigureで一般的
に設定する項目、たとえがCコンパイラの設定など、についてはここでは述べない。
なお下記記述で[]で示された値がデフォルトとなる。

　　　OS_TYPE：[LINUX]/...：システムのOSを設定する。
　　　USE_DOUBLE_COND：[YES]/NO：メッセージキューの制御のためにモニターの条件変数
　　　　　　を２つ（emptyとfull）使うかどうかのフラグ。使用する場合はYESを、使用
　　　　　　しない場合はNOを設定する。NOを設定した場合は、条件変数は１つでインス
　　　　　　トールされる。条件変数が１つの場合はメッセージキューの実行効率が若干
　　　　　　ではあるが落ちるケースがある。
　　　USE_SEMAPHORE：[YES]/NO：STUBおよびランデブの制御においてセマフォを使って
　　　　　　スレッドの動作制御をするかどうかのフラグ。使用する場合はYESを、使用し
　　　　　　ない場合はNOを設定する。セマフォーを使用しない場合は、MutexとCondでス
　　　　　　レッドの動作制御をする。
　　　USE_HASH：YES/[NO]：メッセージキューおよびランデブの検索にハッシュ関数を使
　　　　　　用するかどうかのフラグ。使用する場合はYESを、使用しない場合はNOを設定
　　　　　　する。
　　　USE_MULTICAST：YES/[NO]：マルチキャストIPRPCを使用するかどうかのフラグ。使用
　　　　　　する場合はYESを、使用しない場合はNOを設定する。
　　　USE_RENDEZVOUS：YES/[NO]：ランデブ機能をインストールするかどうかのフラグ。
　　　　　　インストールする場合はYESを、インストールしない場合はNOを設定する。
　　　DEBUG：YES/[NO]：デバッグフラグ。YESにするとコンパイル時に"-g"オプションが
　　　　　　付加される。またデバッグ用の各種テストルーチンもインストールされる。

　２：ipcConf.h
　プログラムのヘッダファイルで設定するものは以下のものがある。以下の設定情報はす
べてipcConf.hに定義されている。

/* ----- SHM ----- */
#define	IPC_MARSHAL_SHARED_MEM_NAME				"/IpcMarshal"
/* マーシャリングのための共有メモリ領域の名前 */
#define	IPC_DATABASE_SHARED_MEM_NAME				"/IpcDatabase"
/* データベースのための共有メモリ領域の名前 */
#define	IPC_MSG_QUE_SHARED_MEM_NAME				"/IpcMsgQue"
/* メッセージキューのための共有メモリ領域の名前 */

#define	IPC_MARSHAL_SHARED_MEM_REAL_SIZE			(1024*1024)	/* 1MB  FOR EXT DATA */
/* マーシャリングのための共有メモリ領域のサイズ */
#define	IPC_DATABASE_SHARED_REAL_MEM_SIZE			(1024*100)	/* 100KB FOR DATABASE */
/* データベースのための共有メモリ猟奇のサイズ */
#define	IPC_MSG_QUE_SHARED_REAL_MEM_SIZE			(1024*100)	/* 100KB FOR MSG QUE */
/* メッセージキューのための共有メモリ領域のサイズ */

#define	IPC_SHM_MIN_FREE_SIZE					64	/* MIN FREE SIZE */
/* 共有メモリ領域でアロケーションする最小単位 */
#define	IPC_DEVIDE_MAX_ALLOC_SIZE				4
/* 共有メモリ領域でアロケーションできる最大のサイズ、共有メモリ領域からこの値で割った値が最大値 */

#define	IPC_MSG_QUE_SHARED_MEM_ADDR				0xB8000000
/* メッセージキューのための共有メモリ領域のアドレス */
#define	IPC_DATABASE_SHARED_MEM_ADDR				0xB8100000
/* データベースのための共有メモリ領域のアドレス */
#define	IPC_MARSHAL_SHARED_MEM_ADDR				0xB8200000
/* マーシャリングのための共有メモリ領域のアドレス */


/* ----- QUE ----- */
#define	IPC_MSG_QUE_MAX_QUE_SIZE				256
/* メッセージキューのキューの最大値 */
#define	IPC_MSG_QUE_DEFAULT_TIMEOUT				10*1000	/* msec */
/* メッセージキューのデフォルトのタイムアウト値 */

#define	IPC_SHM_MSG_QUE_MEM_SIZE				IPC_MSG_QUE_SHARED_REAL_MEM_SIZE
#define	IPC_SHM_MSG_QUE_NUM_OF_DEV				1
/* メッセージキューのための共有メモリの分割管理数 */
#define	IPC_SHM_MSG_QUE_MIN_SIZE				64	/* DUMMY */
#define	IPC_SHM_MSG_QUE_RATE_OF_MAGNIFY				2	/* DUMMY */

#ifdef	USE_HASH_IN_IPC
#define	IPC_USE_HASH_FUNC_FOR_MSG_QUE

#define	IPC_GLOBAL_MSG_QUE_HASH_TABLE				256
/* 共有メモリ上でのメッセージキューで使用するハッシュ用のテーブルのサイズ */
#define	IPC_LOCAL_MSG_QUE_HASH_TABLE				25
/* ローカルメモリ上でのメッセージキューで使用するハッシュ用テーブルのサイズ */
#endif	/* USE_HASH_IN_IPC */


/* ----- SHM DB ----- */
#define	IPC_SHM_DATABASE_MEM_SIZE				IPC_DATABASE_SHARED_REAL_MEM_SIZE
#define	IPC_SHM_DATABASE_NUM_OF_DEV				1
/* データベースのための共有メモリの分割管理数 */
#define	IPC_SHM_DATAABSE_MIN_SIZE				64	/* DUMMY */
#define	IPC_SHM_DATABASE_RATE_OF_MAGNIFY			2	/* DUMMY */

#define	IPC_HASH_RAND_NUM_SIZE_OF_TBL_NUM			4
/* ハッシュ値計算用の乱数表の数 */
#define	IPC_HASH_RAND_NUM_SIZE_OF_TABLE				256
/* ハッシュ値計算用の１つの乱数表のサイズ */

#define	IPC_SHM_DATABASE_FUNC_DB_HASH_TABLE			512
/* データベースのためのハッシュテーブルのサイズ */


/* ----- MARSHAL ----- */
#define	IPC_MARSHAL_DATA_SHARED_MEM_NAME			IPC_MARSHAL_SHARED_MEM_NAME
#define	IPC_SHM_MARSHAL_NUM_OF_DEV				6
/* マーシャリングのための共有メモリの分割管理数 */
#define	IPC_SHM_MARSHAL_MIN_SIZE				64
/* マーシャリングのための共有メモリの最小分割管理のサイズ */
#define	IPC_SHM_MARSHAL_RATE_OF_MAGNIFY				2
/* マーシャリングのための共有メモリの分割管理サイズの逓倍数 */


/* ----- SKELTON ----- */
#define	IPC_SKELTON_MANAGE_QUE_SIZE				32
/* スケルトン管理用メッセージキューのサイズ */
#define	IPC_SKELTON_MANAGE_TASK_SCHED_POLICY			SCHED_FIFO
/* スケルトン管理用タスク（スレッド）のスケジュールポリシー */
#define	IPC_SKELTON_MANAGE_TASK_PRIORITY			RPC_SCHED_PRIO_MID_H
/* スケルトン管理用タスク（スレッド）のプライオリティ */
#define	IPC_SKELTON_MANAGE_TASK_DETACH_STATE			PTHREAD_CREATE_DETACHED
/* スケルトン管理用タスク（スレッド）のデタッチステート */
#define	IPC_SKELTON_MANAGE_TASK_STACK_SIZE			(64 * 1024)
/* スケルトン管理用タスク（スレッド）のスタックサイズ */

#define	IPC_SKELTON_START_NUM_OF_TASK_RESOURCE			5
/* スケルトン実行用タスク（スレッド）の初期化時の数 */
#define	IPC_SKELTON_START_NUM_OF_QUE_RESOURCE			IPC_SKELTON_NUM_OF_TASK_RESOURCE
/* スケルトン実行用メッセージキューの初期化時の数 */
#define	IPC_SKELTON_QUE_SIZE					16
/* スケルトン実行用メッセージキューの数 */
#define	IPC_SKELTON_TASK_SCHED_POLICY				SCHED_FIFO
/* スケルトン実行用タスク（スレッド）のスケジュールポリシー */
#define	IPC_SKELTON_TASK_PRIORITY				IPC_SCHED_PRIO_LOW_L
/* スケルトン実行用タスク（スレッド）のプライオリティ */
#define	IPC_SKELTON_TASK_DETACH_STATE				PTHREAD_CREATE_DETACHED
/* スケルトン実行用タスク（スレッド）のデタッチステート */
#define	IPC_SKELTON_TASK_STACK_SIZE				(1024 * 1024)
/* スケルトン実行用タスク（スレッド）のスタックサイズ */

#define	IPC_SKELTON_MAX_NUM_OF_TASK_RESOURCE			20
/* スケルトン実行用タスク（スレッド）の最大数 */
#define	IPC_SKELTON_MAX_NUM_OF_QUE_RESOURCE			IPC_SKELTON_MAX_NUM_OF_TASK_RESOURCE
/* スケルトン実行用メッセージキューの最大数 */


/* ----- STUB ----- */
#define	IPC_STUB_START_NUM_OF_CB_TASK_RESOURCE			3
/* コールバック実行用タスクの初期化時の数 */
#define	IPC_STUB_CB_TASK_SCHED_POLICY				SCHED_FIFO
/* コールバック実行用タスク（スレッド）のスケジュールポリシー */
#define	IPC_STUB_CB_TASK_PRIORITY				RPC_SCHED_PRIO_MID_M
/* コールバック実行用タスク（スレッド）のプライオリティ */
#define	IPC_STUB_CB_TASK_DETACH_STATE				PTHREAD_CREATE_DETACHED
/* コールバック実行用タスク（スレッド）のデタッチステート */
#define	IPC_STUB_CB_TASK_STACK_SIZE				(64 * 1024)
/* コールバック実行用タスク（スレッド）のスタックサイズ */

#define	IPC_STUB_START_NUM_OF_QUE_RESOURCE			5
/* スタブ実行用メッセージキューの初期化時の数 */
#define	IPC_STUB_QUE_SIZE					16
/* スタブ実行用メッセージキューのサイズ */

#define	IPC_STUB_MAX_NUM_OF_CB_TASK_RESOURCE			10
/* コールバック実行用タスク（スレッド）の最大数 */
#define	IPC_STUB_MAX_NUM_OF_QUE_RESOURCE			20
/* スタブ実行用のメッセージキューの最大数 */

#define	IPC_STUB_DEFAULT_TIMEOUT				(30*1000)	/* msec */
/* スタブ実行時のデフォルトのタイムアウト */

#ifdef	USE_MULTICAST_RPC
#define	IPC_STUB_START_NUM_OF_MLTCST_RESOURCE			3
/* マルチキャスト実行のリソースの初期化時の数 */
#define	IPC_STUB_MAX_NUM_OF_MLTCST_RESOURCE			5
/* マルチキャスト実行のリソースの最大値 */
#endif	/* USE_MULTICAST_RPC */


/* ----- RENDEZVOUS ----- */
#ifdef	USE_RENDEZVOUS

#define	IPC_RENDEZV_DATA_SHARED_MEM_NAME			IPC_MSG_QUE_SHARED_MEM_NAME
/* ランデブのための共有メモリ領域の名前 */

#define	IPC_RENDEZV_DEFAULT_TIMEOUT				30*1000	/* msec */
/* ランデブのデフォルトのタイムアウト */

#define	IPC_RENDEZV_SLEEP_FOR_SWITCH_TASK			1	/* msec */
/* ランデブの動作切替のためのスリープ時間 */

#ifdef	USE_HASH_IN_IPC
#define	IPC_USE_HASH_FUNC_FOR_RENDEZV

#define	IPC_GLOBAL_RENDEZV_HASH_TABLE				256
/* 共有メモリ上でのランデブで使用するハッシュ用のテーブルのサイズ */
#define	IPC_LOCAL_RENDEZV_HASH_TABLE				256
/* ローカルメモリ上でのランデブで使用するハッシュ用のテーブルのサイズ */
#endif	/* USE_HASH_IN_IPC */
#endif	/* USE_RENDEZVOUS */



■　REFERENCE MANUAL

　このライブラリで定義される関数の戻り値はほとんどが以下で定義するRpcResult_t又は
RpcBool_tの値を返す。

typedef enum {
	RPC_ERROR_UNKNOWN = 0,
	RPC_SUCCESS = 1,
	RPC_FATAL_ERROR = -1,
	RPC_TIMEOUT_ERROR = -2,
	RPC_NO_MORE_RESOURCE = -3,
	RPC_PARAM_ERROR = -4,
	RPC_CAN_NOT_EXEC = -5,
	RPC_BUSY_ERROR = -6,
	RPC_INTERUPTTED = -7,
	RPC_LOCKING = -8,
	RPC_NOT_READY = -9,
	RPC_SYSCALL_ERROR = -10,
	RPC_ERROR_MAX
} RpcResult_t;

typedef enum {
	RPC_TRUE = 1,
	RPC_FALSE = 0,
	RPC_BOOL_MAX
} RpcBool_t;

　また多くの関数では戻り値以外にエラーコードとして以下に定義する値を返す。

#define	RPC_NO_ERROR				(0)
#define	RPC_ERR_EACCES				(1)
#define	RPC_ERR_EEXIST				(2)
#define	RPC_ERR_EINVAL				(3)
#define	RPC_ERR_ENOENT				(4)
#define	RPC_ERR_ENAMETOOLONG			(5)
#define	RPC_ERR_EFAULT				(6)
#define	RPC_ERR_ELOOP				(7)
#define	RPC_ERR_EISDIR				(8)
#define	RPC_ERR_ENOTDIR				(9)
#define	RPC_ERR_EPERM				(10)
#define	RPC_ERR_EROFS				(11)
#define	RPC_ERR_ETXTBSY				(12)
#define	RPC_ERR_EBADF				(13)
#define	RPC_ERR_ENODEV				(14)
#define	RPC_ERR_EOVERFLOW			(15)
#define	RPC_ERR_EMFILE				(16)
#define	RPC_ERR_ENFILE				(17)
#define	RPC_ERR_ENOMEM				(18)
#define	RPC_ERR_EINTR				(19)
#define	RPC_ERR_EIO				(20)
#define	RPC_ERR_EAGAIN				(21)
#define	RPC_ERR_EFBIG				(22)
#define	RPC_ERR_ENOSYS				(23)
#define	RPC_ERR_E2BIG				(24)
#define	RPC_ERR_ELIBBAD				(25)
#define	RPC_ERR_ENOEXEC				(26)
#define	RPC_ERR_ECHILD				(27)
#define	RPC_ERR_ETIMEDOUT			(28)
#define	RPC_ERR_OTHER				(99)

注）STUBからIPRPCを呼び出す際のパラメタにerrCodeを返すパラメタがあるが、これは
　　基本的にスケルトン側で実行した実行関数の戻り値（RpcResult_t）をキャストして
　　返しているので注意する。


　１：初期化
　このライブラリを使用するためにすべてのプロセスは以下の初期化関数を実行する。

　・IPC_InitIprpc
　　・関数仕様
　　　RpcResult_t IPC_InitIprpc(
　　　　　　RpcBool_t masterProcess, 
　　　　　　RpcBool_t useSkelton, 
　　　　　　RpcBool_t useStub, 
　　　　　　RpcLogLevel_t logLevel);

　　・意味
　　　各プロセスでiprpcを利用できるようにするために初期化を実行する。初期化は以下
　　　のことを行う。
　　　　　・ログの初期化と設定
　　　　　・共有メモリの設定
　　　　　・共有メモリ上のデータベースの初期化
　　　　　・メッセージキューの初期化
　　　　　・MARSHAL/STUB/SKELTONの初期化
　　　ログについては後述するLOGの項目を参照せよ。

　　・パラメタ
　　　masterProcess：IN：マスタープロセスかどうかのフラグ。マスタープロセスならば
　　　　　　IPC_TRUE、そうでなければIPC_FALSEを設定する。マスタープロセスはシステ
　　　　　　ム内で１つのみであり、必ず最初にこの初期化関数を呼ぶ。
　　　useSkelton：IN：スケルトンを使用するかどうかのフラグ。スケルトンを使用する
　　　　　　ならばIPC_TRUEを、使用しなければIPC_FALSEを設定する。プロセス内にある
　　　　　　関数をプロセス外部から呼び出すようにする場合は必ずIPC_TRUEを設定する。
　　　useStub：IN：スタブを使用するかどうかのフラグ。スタブを使用するならば
　　　　　　IPC_TRUEを、使用しなければIPC_FALSEを設定する。プロセス外の関数を呼び
　　　　　　出す場合は必ずIPC_TRUEを設定する。
　　　logLevel：IN：各モジュールが出力するログのレベルを設定する。通常は
　　　　　　IPC_LOG_LEVEL_DEFAULTをセットすればよい。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを返す。エラーの場合はそれ以外の値
　　　　　　を返す。エラーが発生した場合の原因はerrCodeに格納される。


　２：MARSHALLING
　このライブラリを使って他のプロセスへの手続き呼出しをする際に渡すパラメタ、ある
いは手続きが完了し元のプロセスに制御を戻す際に渡すパラメタを、ローカルなパラメタ
データから転送構文（パッケージ）、または転送構文（パッケージ）からローカルなパラ
メタデータへの変換をする。ローカルなパラメタデータは以下のデータ構造である。

typedef enum {
	RPC_TYPE_UNKNOWN = 0,
	RPC_INT_TYPE,
	RPC_UINT_TYPE,
	RPC_FLOAT_TYPE,
	RPC_STRING_TYPE,
	RPC_ENUM_TYPE,
	RPC_OTHER_TYPE,
	RPC_MAX_TYPE
} RpcParamType_t;

typedef struct {
	RpcParamType_t paramType;
	uint32_t paramLeng;
} RpcParamSpec_t;

typedef struct {
	RpcParamSpec_t paramSpec;
	uint8_t *paramData;
} RpcParamData_t;

変換関数の仕様は以下の通りである。

　・IPC_Marshal
　　・関数仕様
　　　RpcResult_t IPC_Marshal(
　　　　　　RpcParamData_t *inData, 
　　　　　　void **outData, 
　　　　　　uint32_t *outSize);

　　・意味
　　　inDataで指定されたパラメタをパッケージ化しoutDataに格納する。パッケージ化
　　　　　　したデータを格納する領域は関数内で共有メモリ上から確保する。

　　・パラメタ
　　　inData：IN：パッケージ化するパラメタデータの配列。パラメタデータ配列の最後
　　　　　　はUNKNOWNタイプでなければならない。
　　　outData：OUT：パッケージ化されたパラメタデータを格納する領域。関数内で共有
　　　　　　メモリ領域を割り当てる。
　　　outSize：OUT：関数内で割り当てたoutDataのサイズ。バイト単位で指定する。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを返す。エラーの場合はそれ以外の値
　　　　　　を返す。

　・IPC_Unmarshal
　　・関数仕様
　　　RpcResult_t IPC_Unmarshal(
　　　　　　void *inData, 
　　　　　　uint32_t inSzie, 
　　　　　　void *outData, 
　　　　　　uint32_t outSize);

　　・意味
　　　パッケージ化されたパラメタデータinDataをアンパーケージし、パラメタデータを
　　　outDataに格納する。outDataにアンパーケージ化されたパラメタデータが
　　　IPFFC_ParamDataの配列として格納される。パラメタの値もoutData内に格納される。
　　　inDataは共有メモリ上に確保されている必要があり、この関数を呼び出すとinData
　　　は解放される。

　　・パラメタ
　　　inData：IN：パッケージ化されたパラメタデータ。パラメタデータ最後はUNKNOWN
　　　　　　タイプでなければならない。共有メモリ上に確保された領域でなければなら
　　　　　　ない。この関数を呼び出した後inDataは解放されているのでアクセスしては
　　　　　　いけない。
　　　inSize：IN：inDataのサイズ。バイト単位で指定する。
　　　outData：OUT：アンパーケージされたパラメタデータを格納する領域。呼び出し側
　　　　　　が用意する。outDataは8バイト境界に合わせること。
　　　outSize：IN：呼び出し側が用意したoutDataのサイズ。バイト単位で指定する。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを返す。エラーの場合はそれ以外の値
　　　　　　を返す。

　・IPC_FreeMarshaledSharedData
　　・関数仕様
　　　void IPC_FreeMarshaledSharedData(
　　　　　　void *data);

　　・意味
　　　IPC_Marshal関数を実行して共有メモリ上に割り当てられたメモリ領域を解放する。
　　　　　　通常は使用しなくてもよい。

　　・パラメタ
　　　data：IN：共有メモリ上に割り当てられたメモリ領域のポインタ。IPC_Marshal関数
　　　　　　のoutDataを代入する。

　　・戻り値
　　　なし

　・IPC_GetMarshaledDataSize
　　・関数仕様
　　　 uint32_t IPC_GetMarshaledDataSize(
　　　　　　void *data);

　　・意味
　　　IPC_Marshal関数を実行して共有メモリ上に割り当てられたメモリ領域のサイズを
　　　　　　求める

　　・パラメタ
　　　data：IN：共有メモリ上に割り当てられたメモリ領域のポインタ。IPC_Marshal関数
　　　　　　のoutDataを代入する。

　　・戻り値
　　　入力パラメタdataで示される共有メモリ上に割り当てられたメモリ領域のサイズ。

　・IPC_DuplicateMarshaledData
　　・関数仕様
　　　void *IPC_DuplicateMarshaledData(
　　　　　　void *packedData,
　　　　　　uint32_t packedDataSize);

　　・意味
　　　IPC_Marshal関数を実行して共有メモリ上に割り当てられたメモリ領域の内容を、
　　　同じ共有メモリ領域上に領域を確保しデータをコピーする。

　　・パラメタ
　　　packedData：IN：共有メモリ上に割り当てられたメモリ領域
　　　packedDataSize：IN：packedDataのサイズ。バイト単位で指定する

　　・戻り値
　　　void*：コピーしたメモリ領域の先頭のポインタ


　３：STUB
　非同期型のRPCを呼び出した場合は、手続きの実行の結果はライブラリからコールバック
関数を呼び出すことで結果を返す。コールバック関数のタイプは以下の通りである。

　・IPC_CallbackFunc_t
　　・関数仕様
　　　void (*IPC_CallbackFunc_t)(
　　　　　　uint32_t seqNum,
　　　　　　void *outData,
　　　　　　uint32_t outSize,
　　　　　　uint32_t errCode);

　　・パラメタ
　　　seqNum：OUT：コールバック関数呼出しに関連付けられるシーケンス番号。シーケン
　　　　　　ス番号は非同期RPCを呼び出したときに割り当てられる。
　　　outData：OUT：RPCの戻りパラメタ。転送構文の形式でパラメタが格納されている
　　　　　　ので、IPC_Unmarshal関数を使ってローカルなパラメタデータに変換する必要
　　　　　　がある。
　　　outSize：OUT：outDataのサイズ。バイト単位で指定される。
　　　errCode：OUT：RPCを実行したときのエラーコードを格納する。RPCが成功した場合
　　　　　　は、IPC_NO_ERRRORが格納される。

　　・戻り値
　　　なし

　STUB関数の仕様は以下の通りである。

　・IPC_CallStubSync
　　・関数仕様
　　　RpcResult_t IPC_CallStubSync(
　　　　　　uint32_t funcID, 
　　　　　　void *inData, 
　　　　　　uint32_t inSize, 
　　　　　　void **outData, 
　　　　　　uint32_t *outSize, 
　　　　　　uint32_t timeOut, 
　　　　　　uint32_t *errCode);

　　・意味
　　　同期型のスタブ関数を呼び出す。入力パラメタはパッケージ化された状態でinData
　　　に格納する。出力パラメタはoutDataに格納される。入力パラメタinDataはスケルト
　　　ン側にそのまま渡されるので、共有メモリ上になければならない。出力パラメタは
　　　スケルトン側から渡された共有メモリ上の領域をそのまま渡す。

　　・パラメタ
　　　funcID：IN：呼び出し関数のID
　　　inData：IN：パッケージ化された入力パラメタデータ。パラメタデータ最後は
　　　　　　UNKNOWNタイプでなければならない。共有メモリ上になければならない。
　　　　　　inDataはこの関数を呼び出したあとはアクセスしてはいけない。
　　　inSize：IN：inDataのサイズ。バイト単位で指定する。
　　　outData：OUT：パッケージ化された出力パラメタデータを格納する領域。共有メモ
　　　　　　リ上の領域となる。
　　　outSize：IN：outDataのサイズ。バイト単位で指定される。
　　　timeOut：IN：関数実行のタイムアウト時間を指定する。単位はmSec。0を指定した
　　　　　　場合はデフォルト（30秒）となる。
　　　errCode：OUT：エラーコードを格納する。成功した場合はRPC_NO_ERRORを格納する。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを返す。エラーの場合はそれ以外の値
　　　　　　を返す。エラーが発生した場合の原因はerrCodeに格納される。

　・IPC_CallStubAsync
　　・関数仕様
　　　RpcResult_t IPC_CallStubAsync(
　　　　　　uint32_t funcID, 
　　　　　　void *inData, 
　　　　　　uint32_t inSize, 
　　　　　　uint32_t timeOut,
　　　　　　IPC_CallbackFunc_t callback , 
　　　　　　uint32_t *seqNum,
　　　　　　uint32_t *errCode);

　　・意味
　　　非同期型のスタブ関数を呼び出す。入力パラメタはパッケージ化された状態で
　　　inDataに格納する。入力パラメタinDataはスケルトン側にそのまま渡されるので、
　　　共有メモリ上になければならない。

　　・パラメタ
　　　funcID：IN：呼び出し関数のID
　　　inData：IN：パッケージ化された入力パラメタデータ。パラメタデータ最後は
　　　　　　UNKNOWNタイプでなければならない。共有メモリ上になければならない。
　　　　　　この関数を呼び出したあとはアクセスしてはいけない。
　　　inSize：IN：inDataのサイズ。バイト単位で指定する。
　　　timeOut：IN：関数実行のタイムアウト時間を指定する。単位はmSec。0を指定した
　　　　　　場合はデフォルト（30秒）となる。
　　　callback：IN：結果を返すコールバック関数を指定する。
　　　errCode：OUT：エラーコードを格納する、成功した場合はRPC_NO_ERRORSを返す。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを返す。エラーの場合はそれ以外の値
　　　　　　を返す。エラーが発生した場合の原因はerrCodeに格納される。

　・IPC_StubSyncCancel
　　・関数仕様
　　　RpcResult_t IPC_StubSyncCancel(
　　　　　　IpcTaskID_t taskId,
　　　　　　uint32_t *errCode);

　　・意味
　　　同期型スタブ関数の実行をキャンセルする。実際に実行する関数の仕様としてキャ
　　　ンセルをサポートしていない場合があるため、スケルトン側のキャンセルが実行さ
　　　れる保証はされない。スケルトン側でキャンセル関数が実行できれば成功を返す。
　　　ただし、成功を返してもキャンセルが実行できるとは限らないので注意すること。

　　・パラメタ
　　　taskID：IN：同期型スタブ関数を実行しているタスクIDを指定する。
　　　errCode：OUT：エラーコードを格納する。キャンセルが成功した場合は
　　　　　　RPC_NO_ERRORを返す。 

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを返す。エラーの場合はそれ以外の値
　　　　　　を返す。エラーが発生した場合の原因はerrCodeに格納される。

　・IPC_StbuAsyncCancel
　　・関数仕様
　　　RpcResult_t IPC_StbuAsyncCancel(
　　　　　　uint32_t seqNum,
　　　　　　uint32_t *errCode);

　　・意味
　　　非同期型スタブ関数の実行をキャンセルする実際に実行する関数の仕様としてキャ
　　　ンセルをサポートしていない場合があるため、スケルトン側のキャンセルが実行さ
　　　れる保証はされない。スケルトン側でキャンセル関数が実行できれば成功を返す。
　　　ただし、成功を返してもキャンセルが実行できるとは限らないので注意すること。

　　・パラメタ
　　　seqNum：IN：シーケンス番号。非同期スタブ関数で返されるseqNumを指定する。
　　　errCode：OUT：エラーコードを格納する。キャンセルが成功した場合は
　　　　　　RPC_NO_ERRORを返す。 

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを返す。エラーの場合はそれ以外の値
　　　　　　を返す。エラーが発生した場合の原因はerrCodeに格納される。


　４：SKELTON
　スタブから呼び出された関数コールは、一旦スケルトンで受けてそのあと、ユーザが
実装した関数を呼び出す。キャンセル関数も同様にスタブから呼び出されたキャンセル関
数コールをいったんスケルトンで受けたあと、ユーザが実装したキャンセル関数を呼び出
す。ユーザが実装する関数およびキャンセル関数の仕様は以下の通りである。

　・IPC_SkeltonFunc_t
　　・関数仕様
　　　RpcResult_t (*IPC_SkeltonFunc_t)(
　　　　　　uint32_t processId, 
　　　　　　uint32_t seqNum, 
　　　　　　void *inData ,
　　　　　　uint32_t inSize, 
　　　　　　void **outData, 
　　　　　　int32_t *outSize, 
　　　　　　uint32_t timeOut);

　　・パラメタ
　　　processId：IN：この関数を呼び出したプロセスのプロセスID
　　　seqNum：IN：この関数を呼び出したプロセスのSTUBが生成したシーケンス番号。
　　　　　　processIdとseqNumですべてのトランザクションが特定できる。
　　　inData：IN：呼出し元が設定したこの関数の入力パラメタ。パッケージ化された
　　　　　　データ。
　　　inSize：IN：inDataのサイズ。バイト単位で指定される。
　　　outData：OUT：この関数の出力パラメタ。この関数内で設定される。パッケージ化
　　　　　　されたデータでなければならない。
　　　outSize：OUT：outDataのサイズ。バイト単位で設定される。
　　　timeOut：IN：この関数のタイムアウト時間をmsec単位で指定する。この関数内で
　　　　　　タイムアウト機能が実装されていなくても、STUB内でタイムアウトが発生す
　　　　　　れば、呼出し元へはタイムアウトが発生したものとして処理される。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。

　・IPC_SkeltonCancelFunc_t
　　・関数仕様
　　　RpcResult_t (*IPC_SkeltonCancelFunc_t)(
　　　　　　uint32_t processId, 
　　　　　　uint32_t seqNum);

　　・パラメタ
　　　processId：IN：キャンセルを実行するトランザクションを特定するための、呼出し
　　　　　　元のプロセスID。
　　　seqNum：IN：キャンセルを実行するトランザクションクを特定するためのシーケン
　　　　　　ス番号。processIdとseqNumでキャンセルを実行するトランザクションを特定
　　　　　　する。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。

　SKLETON関数の仕様は以下の通りである。

　・IPC_SkeltonRegisterFunction
　　・関数仕様
　　　RpcResult_t IPC_SkeltonRegisterFunction(
　　　　　　uint32_t funcId,
　　　　　　IPC_SkeltonFunc_t func,
　　　　　　IPC_SkeltonCancelFunc_t cancelFunc);

　　・意味
　　　スケルトン側で実行する関数を登録する。登録する関数は本関数とキャンセル関数
　　　の２つ。キャンセル関数を実装しない場合はNULLとする。

　　・パラメタ
　　　funcID：IN：関数IDを指定する。
　　　func：IN：スケルトンから呼び出される関数を指定する。
　　　cancelFunc：IN：スケルトンから呼び出されるキャンセル関数を指定する。実装し
　　　　　　ていない場合はNULLを指定する。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。

　・IPC_SkeltonUnregisterFunction
　　・関数仕様
　　　RpcResult_t IPC_SkeltonUnregisterFunction(
　　　　　　uint32_t funcId);

　　・意味
　　　登録されている関数を解除する。

　　・パラメタ
　　　funcId：IN：関数IDを指定する。
　　　errCode：OUT：：エラーコードを格納する。登録の解除に成功した場合は
　　　　　　RPC_NO_ERRORを設定する。 

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。


　５：SHARED MEMORY
　このライブラリはプロセス間の通信(IPC)のために共有メモリを使用している。以下に
共有メモリから領域を割り当てたりするための関数を説明する。但し、ここでは利用者に
とって有益と思われるもののみを説明する。

　・IPC_GetShmInfo
　　・関数仕様
　　　RpcResult_t IPC_GetShmInfo(
　　　　　　char *name, 
　　　　　　int32_t *fd, 
　　　　　　void **addr, 
　　　　　　uint32_t *size);

　　・意味
　　　このライブラリで使用している共有メモリのディスクリプタ、アドレス、サイズを
　　　取得する。このライブラリでは、
　　　　　・共有データベース用の共有メモリ
　　　　　・プロセス間のメッセージ通信のためのキュー用の共有メモリ
　　　　　・関数のパラメタデータなど、そのほかのデータための共有メモリ
　　　の３つの共有メモリ領域を確保している。この関数ではそれぞれの共有メモリの
　　　領域の情報を取得することができる。

　　・パラメタ
　　　name：IN：共有メモリを示すファイルのパス。パス名はコンフィグレーション情報
　　　　　　を参照すること。
　　　fd：OUT：共有メモリのファイルディスクリプタ
　　　addr：OUT：共有メモリの先頭のアドレス
　　　size：OUT：割り当てられている共有メモリのサイズ

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。

　・IPC_AllocShmMem
　　・関数仕様
　　　void *IPC_AllocShmMem(
　　　　　　int fd, 
　　　　　　uint32_t size);

　　・意味
　　　指定された共有メモリのディスクリプタから指定したサイズのメモリを割り当てる。
　　　割り当てに失敗した場合はNULLを返す。

　　・パラメタ
　　　fd：IN：共有メモリのファイルディスクリプタ
　　　size：IN：割り当てるメモリのサイズ

　　・戻り値
　　　void *：割り当てられたメモリの先頭のアドレス。割り当てられなかった場合には
　　　　　　NULLを返す。

　・IPC_FreeShmMem
　　・関数仕様
　　　void IPC_FreeShmMem(
　　　　int fd, 
　　　　void *addr);

　　・意味
　　　割り当てられている共有メモリ上の領域を解放する。この関数を呼び出した後は元
　　　の領域にアクセスしてはいけない。

　　・パラメタ
　　　fd：IN：共有メモリのファイルディスクリプタ
　　　addr：IN：割り当てられている領域の先頭アドレス

　　・戻り値
　　　なし

　・IPC_AllocatedSizeShmMem
　　・関数仕様
　　　uint32_t IPC_AllocatedSizeShmMem(
　　　　　　int fd, 
　　　　　　void *addr);

　　・意味
　　　割り当てられている共有メモリの領域のサイズを返す。

　　・パラメタ
　　　fd：IN：共有メモリのファイルディスクリプタ
　　　addr：IN：割り当てられている領域の先頭アドレス

　　・戻り値
　　　uint32_t：指定された領域のサイズを返す。

　・IPC_ReallocShmMem
　　・関数仕様
　　　void *IPC_ReallocShmMem(
　　　　　　int fd, 
　　　　　　void *addr, 
　　　　　　uint32_t newSize);

　　・意味
　　　すでに割り当てられている共有メモリ上の領域の再割り当てを行う。この関数以降
　　　は元の領域にアクセスしていはいけない。

　　・パラメタ
　　　fd：IN：共有メモリのファイルディスクリプタ
　　　add：IN：割り当てられている領域の先頭アドレス
　　　newSize：IN：割り当てるべき新しい領域のサイズ

　　・戻り値
　　　void *：割り当てられた新しい領域の先頭のアドレスを返す。失敗した場合はNULL
　　　　　　を返す。


　６：LOG
　このシステムで使われているログ出力ためのライブラリルーチンである。現在の実装で
はログはfprintf関数を使って実装され、stdoutに出力するようにしている。
　ログモジュール毎にログの出力レベルを設定することができる。定義されている
モジュールとログのレベルを以下に示す。

typedef enum {
	RPC_LOG_MODULE_UNKNOWN = 0,
	RPC_LOG_MODULE_MAIN,
	RPC_LOG_MODULE_SYSCALL,
	RPC_LOG_MODULE_MSG_QUE,
	RPC_LOG_MODULE_SHM,
	RPC_LOG_MODULE_SHM_DB,
	RPC_LOG_MODULE_LIB,
	RPC_LOG_MODULE_MARSHAL,
	RPC_LOG_MODULE_STUB,
	RPC_LOG_MODULE_SKELTON,
	RPC_LOG_MODULE_RENDEZV,
	RPC_LOG_MODULE_MLTCST,
	RPC_LOG_MODULE_MAX
} RpcLogModule_t;

typedef enum {
	RPC_LOG_LEVEL_UNKNOWN = 0,
	RPC_LOG_LEVEL_INFO,
	RPC_LOG_LEVEL_DEBUG3,
	RPC_LOG_LEVEL_DEBUG2,	
	RPC_LOG_LEVEL_DEBUG1,
	RPC_LOG_LEVEL_WARNING,
	RPC_LOG_LEVEL_DEFAULT,	/* NOT USE THIS LEVEL IN LogPrint */
	RPC_LOG_LEVEL_ERROR,
	RPC_LOG_LEVEL_FATAL,
	RPC_LOG_LEVEL_URGENT,
	RPC_LOG_LEVEL_MAX
} RpcLogLevel_t;

後述するが、ログのレベルでRPC_LOG_LEVEL_DEFAULTはモジュールの出力設定にのみ使用
すること。ログ出力時には使用してはいけない。

　ログの出力設定関数、ログ出力関数は以下の通りである。

　・RPC_LogSetLevel
　　・関数仕様
　　　RpcResult_t RPC_LogSetLevel(
　　　　　　RpcLogModule_t module, 
　　　　　　RpcLogLevel_t level);

　　・意味
　　　特定のモジュールのログの出力レベルを設定する。この設定をすると、そのモ
　　　ジュールは設定されたログの出力レベル以上のものでないと出力しない。

　　・パラメタ
　　　module：IN：出力レベルを設定するモジュールを指定する。
　　　level：IN：出力レベルを指定する。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。

　・RPC_LogSetAll
　　・関数仕様
　　　RpcResult_t RPC_LogSetAll(
　　　　　　RpcLogLevel_t level);

　　・意味
　　　すべてのモジュールのログの出力レベルを設定する。IPC_InitIprpcではこの関数
　　　を呼び出してログのレベルを設定している。

　　・パラメタ
　　　level：IN：出力レベルを設定する。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。

　・RPC_LogPrint
　　・関数仕様
　　　RpcResult_t RPC_LogPrint(
　　　　　　RpcLogModule_t module, 
　　　　　　RpcLogLevel_t level, 
　　　　　　char *format, ...);

　　・意味
　　　ログを出力する。この関数の内部で指定されたモジュールの設定されている出力
　　　レベルを比較し、設定されているレベルがこの関数で指定されるレベル以下であれ
　　　ばログを出力する。実際に出力するフォーマットはfprintf等で指定するフォーマット
　　　パラメタと同一である。ニューライン文字('\n')は自動てきに付加される。
　　　出力する形式は以下の通りである。
　　　　　MAIN  :DEBUG1:　....
　　　すなわち、ログを出力するモジュール名とログのレベルが行の先頭に付加される。

　　・パラメタ
　　　module：IN：モジュールを指定する
　　　level：IN：出力するレベルを指定する。IPC_LOG_LEVEL_DEFAULTは指定していはい
　　　　　けない。
　　　format,,,：IN：出力するログのフォーマットを指定する。基本的にfprintf等で指
　　　　　　定するケースと同一である。例えば、
　　　　　　　　　　"OUTPUT PARAM:0x%x", outParam
　　　　　　のように指定する。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。

　・RPC_LogPrintNomark
　　・関数仕様
　　　RpcResult_t RPC_LogPrintNomark(
　　　　　　RpcLogModule_t module, 
　　　　　　RpcLogLevel_t level, 
　　　　　　char *fmt, ...);

　　・意味
　　　ログを出力する。この関数の内部で指定されたモジュールの設定されている出力
　　　レベルを比較し、設定されているレベルがこの関数で指定されるレベル以下であれ
　　　ばログを出力する。実際に出力するフォーマットはfprintf等で指定するフォーマット
　　　パラメタと同一である。ニューライン文字('\n')は付加されない。またモジュール
　　　名、ログのレベルも出力されない。

　　・パラメタ
　　　module：IN：モジュールを指定する
　　　level：IN：出力するレベルを指定する。IPC_LOG_LEVEL_DEFAULTは指定していはい
　　　　　けない。
　　　format,,,：IN：出力するログのフォーマットを指定する。基本的にfprintf等で指
　　　　　　定するケースと同一である。例えば、
　　　　　　　　　　"OUTPUT PARAM:0x%x", outParam
　　　　　　のように指定する。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。

　・RPC_LogConvertResultCode
　　・関数仕様
　　　char *IRPC_LogConvertResultCode(
　　　　　　RpcResult_t ret);

　　・意味
　　　retを文字列に変換する。例えば、retにIPC_TIMEOUT_ERRORを指定すると、戻り値
　　　として"TIMEOUT"を返す。

　　・パラメタ
　　　ret：IN：変換するRpcResult_t型の値を指定する。

　　・戻り値
　　　char *：変換した結果の文字列のポインタを返す。

　・RPC_LogConvertErrCode
　　・関数仕様
　　　char *RPC_LogConvertErrCode(
　　　　uint32_t errCode);

　　・意味
　　　エラーコードを文字列に変換する。例えば、errCodeにIPC_ERR_ETXTBSYを指定する
　　　と、戻り値として"ETXTBSY"を返す。

　　・パラメタ
　　　errCode：IN：文字列に変換するエラーコードを指定する。

　　・戻り値
　　　char *：変換した結果の文字列のポインタを返す。


　７：MULTICAST

　7.1：MULTICAST RPCの登録
　・IPC_RegisterMulticastFunc
　　・関数仕様
　　　RpcResult_t IPC_RegisterMulticastFunc(
　　　　　　uint32_t mltcstFuncId);

　　・意味
　　　MULTICAST RPCの関数IDを登録する。

　　・パラメタ
　　　mltcstFuncId：IN：MULTICAST RPCの関数ID

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する

　・IPC_UnregisterMulticastFunc
　　・関数仕様
　　　RpcResult_t IPC_UnregisterMulticastFunc(
　　　　　　uint32_t mltcstFuncId);

　　・意味
　　　登録されているMULTICAST RPCの関数IDを削除する。

　　・パラメタ
　　　mltcstFuncId：IN：MULTICAST RPCの関数ID

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。

　・IPC_SignupMulticastFunc
　　・関数仕様
　　　RpcResult_t IPC_SignupMulticastFunc(
　　　　　　uint32_t mltcstFuncId, 
　　　　　　uint32_t funcId);

　　・意味
　　　MULTICAST RPCの関数IDに特定の関数IDを結びつける。これによって、呼び出し元
　　　がmltcstFuncIdでRPCの呼び出しをすると、funcIdのSKELTON側の動作関数を呼び出す。
　　　funcIdの動作関数を動作させるためには、IPC_SkeltonRegisterFunctionで登録を
　　　する必要がある。なお、mltcstFuncIdが登録されていない場合はmltcstFuncIdの登
　　　録も行う。
　　　なおfuncIdとしてMULTICAST RPCのIDを登録しても実際のMULTICAST RPCを呼び出す
　　　ことはできない。

　　・パラメタ
　　　mltcstFuncId：IN：MULTICAST RPCの関数ID
　　　funcId：IN：SKELTON側の動作関数を示すfuncId。ここにmltcstFuncIdを指定する
　　　　　　ことはできない。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。

　・IPC_ResignMulticastFunc
　　・関数仕様
　　　IPC_ResignMulticastFunc(
　　　　　　uint32_t mltcstFuncId, 
　　　　　　uint32_t funcId);

　　・意味
　　　MULTICAST RPCの実行先として登録されているfuncIdをMULTICAST RPCから削除する。

　　・パラメタ
　　　mltcstFuncId：IN：MULTICAST RPCの関数ID
　　　funcId：IN：SKELTON側の動作関数を示すfuncId。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。


　7.2：MULTICAST RPCの呼び出し
　MULTICAST RPCの戻り値は以下に定義する構造体の配列で結果を返す。

typedef struct {
	uint32_t resPid;
	uint32_t errCode;
	void *retParam;
	uint32_t retParamSize;
} IpcMulticastRetData_t;

　MULTICAST RPCのSTUB側のラッパー実装者は上記データ構造で返される結果を解析して
元の呼び出し元に結果を返すようにする。ここでretParamはここのSKELTON側から返された
結果であり、通常のRPCと同様IPC_Unmarshal関数を使って出力パラメタの取り出しをする。
　非同期型のMULTICAST RPCを呼び出した場合は、手続きの実行の結果はライブラリから
コールバック関数を呼び出すことで結果を返す。コールバック関数のタイプは以下の通り
である。

　・IPC_MultticastCallbackFunc_t
　　・関数仕様
　　　void (*IPC_MultticastCallbackFunc_t)(
　　　　　　uint32_t seqNum,
　　　　　　uint32_t numOfRet,
　　　　　　IpcMulticastRetData_t *retData,
　　　　　　uint32_t errCode);

　・IPC_CallStubSyncMulticast
　　・関数仕様
　　　RpcResult_t IPC_CallStubSyncMulticast(
　　　　　　uint32_t mltcstFuncId,
　　　　　　void *inParams,
　　　　　　uint32_t inParamsSize,
　　　　　　uint32_t *numOfRet,
　　　　　　IpcMulticastRetData_t **retData,
　　　　　　uint32_t timeOut,
　　　　　　uint32_t *errCode);

　　・意味
　　　MULTICAST RPCを呼び出す。この関数内ではmltcstFuncIdに対応付けられた各Funcid
　　　からそれぞれの実行関数を呼び出す。実行関数の呼び出しは非同期のRPCで呼び出す。
　　　従って、各実行関数の実行は並行して行われる。
　　　各実行関数の結果はretDataに配列として呼び出し元に返される。途中でタイムアウ
　　　トが発生した場合は、それまでに結果が返ってきたものについては呼び出し元に結
　　　果を返す。それ以外のエラーが発生した場合は原則として結果を返さない。実行関
　　　数の結果は構造体IpcMulticastRetData_t内のretParamに格納されるが、IPC_Marshal
　　　でパックされた状態で出力パラメタが格納されているので、STUB側のラッパー関数
　　　内でIPC_Unpackeを使って各出力パラメタと取り出す必要がある。またretDataの領
　　　域はこの関数内で動的に確保されるので、この関数を呼び出した後
　　　IPC_FreeMulticastOutParamsで領域を解放する必要がある。

　　・パラメタ
　　　mltcstFuncId：IN：MULTICAST RPCの呼び出すための関数IDを指定する。このIDは
　　　　　　事前にIPC_RegisterMulticastFuncで登録する必要がある。
　　　inParams：IN：各実行関数に渡す入力パラメタ、IPC_Marshalでパック化してある
　　　　　　ものを渡す。
　　　inParamsSize：IN：inParamsのサイズ。バイト単位で指定する。
　　　numOfRet：OUT：実行関数から結果が戻ってきた数。retDataで指定される出力パラ
　　　　　　メタIpcMulticastRetData_tの配列の数。
　　　retData：OUT：各実行関数からの結果を格納。IpcMulticastRetData_tの配列。配列
　　　　　　の領域はこの関数内で動的に確保する。
　　　timeOut：IN：この関数呼び出しのタイムアウト時間をmsec単位で指定する。タイム
　　　　　　アウトが発生した場合は、それまでに実行関数から返ってきた結果のみを呼
　　　　　　び出し元に返す。
　　　errCode：OUT：：エラーコードを格納する。成功した場合はRPC_NO_ERRORを返す。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。エラーが発生した場合の原因はerrCodeに格納する。


　・IPC_CallStubAsyncMulticast
　　・関数仕様
　　　RpcResult_t IPC_CallStubAsyncMulticast(
　　　　　　uint32_t mltcstFuncId,
　　　　　　void *inParams,
　　　　　　uint32_t inParamsSize,
　　　　　　uint32_t timeOut,
　　　　　　IPC_MultticastCallbackFunc_t mltcstCallback, 
　　　　　　uint32_t *seqNum, 
　　　　　　uint32_t *errCode);

　　・意味
　　　MULTICAST RPCを非同期で呼び出す。この関数内ではmltcstFuncIdに対応付けられた
　　　各Funcidからそれぞれの実行関数を呼び出す。実行関数の呼び出しは非同期のRPCで
　　　呼び出す。従って、各実行関数の実行は並行して行われる。
　　　各実行関数の結果はコールバック関数で呼び出し元に返す。各実行関数の結果は配
　　　列としてコールバック関数のパラメタで渡される。途中でタイムアウトが発生した
　　　場合は、それまでに結果が返ってきたものについてはコールバック関数で呼び出し
　　　元に結果を返す。それ以外のエラーが発生した場合は原則として結果を返さない。
　　　実行関数の結果は構造体IpcMulticastRetData_t内のretParamに格納されるが、
　　　IPC_Marshalでパックされた状態で出力パラメタが格納されているので、コールバッ
　　　ク関数内でIPC_Unpackeを使って各出力パラメタと取り出す必要がある。また結果を
　　　格納する領域はコールバック関数を呼び出す前に動的に確保されるので、コール
　　　バック関数内で解放する必要がある。

　　・パラメタ
　　　mltcstFuncId：IN：MULTICAST RPCの呼び出すための関数IDを指定する。このIDは
　　　　　　事前にIPC_RegisterMulticastFuncで登録する必要がある。
　　　inParams：IN：各実行関数に渡す入力パラメタ、IPC_Marshalでパック化してある
　　　　　　ものを渡す。
　　　inParamsSize：IN：inParamsのサイズ。バイト単位で指定する。
　　　timeOut：IN：この関数呼び出しのタイムアウト時間をmsec単位で指定する。タイム
　　　　　　アウトが発生した場合は、それまでに実行関数から返ってきた結果のみを呼
　　　　　　び出し元に返す。
　　　mltcstCallback：IN：結果を返すコールバック関数を指定する。このパラメタを
　　　　　　NULLに指定した場合は結果を返さない。
　　　seqNum：OUT：この呼び出しのシーケンス番号を返す。シーケンス番号はプロセス
　　　　　　内で一意の値となる。
　　　errCode：OUT：：エラーコードを格納する。成功した場合はRPC_NO_ERRORを返す。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。エラーが発生した場合の原因はerrCodeに格納する。

　・IPC_FreeMulticastOutParams
　　・関数仕様
　　　void IPC_FreeMulticastOutParams(
　　　　　　IpcMulticastRetData_t *retData);

　　・意味
　　　IPC_CallStubSyncMulticastを呼び出したときの各実行関数の結果を格納する領域、
　　　またはIPC_CallStubAsyncMulticastを呼び出した後、結果を返すコールバック関数
　　　で実行関数の結果を格納する領域は、それぞれ内部で動的に割り当てられた領域に
　　　格納される。その領域を解放するために必ずこの関数を呼び出す。

　　・パラメタ
　　　retData：IN：実行関数の結果を格納する領域、IPC_CallStubSyncMulticastでretData
　　　　　　で渡された値、またはコールバック関数で渡された値。

　　・戻り値
　　　なし


　８：RENDEZVOUS

　・IPC_InitRendezv
　　・関数仕様
　　　RpcResult_t IPC_InitRendezv(
　　　　　　RpcBool_t masterProcess);

　　・意味
　　　ランデブポイントを管理する領域の初期化をする。ランデブを利用するプロセスは
　　　最初にこの関数を呼ぶ。ランデブポイントは共有メモリ上またはローカルメモリ上
　　　に生成される。

　　・パラメタ
　　　masterProcess：IN：マスタープロセスかどうかのフラグ。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。


　・IPC_CreateRendezv
　　・関数仕様
　　　RpcResult_t IPC_CreateRendezv(
　　　　　　RpcBool_t IpcFlag, 
　　　　　　uint32_t *rendezvId);

　　・意味
　　　ランデブポイントを生成する。ランデブポイントの生成場所は同期をとるスレッド
　　　が同一プロセス上のものかかまたは違うプロセス上のものかで異なる。（同一プロ
　　　セス上であっても共有メモリ上に生成したランデブポイントならば同期をとることが
　　　できる。）

　　・パラメタ
　　　IpcFlag：IN：ランデブポイント生成する場所を示すフラグ。RPC_TRUEなら共有メモ
　　　リ上に生成され、RPC_FALSEならローカルメモリ上に生成される。
　　　rendezvId：OUT：生成されたランデブポイント示すID。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。


　・IPC_DestoryRendezv
　　・関数仕様
　　　RpcResult_t IPC_DestoryRendezv(
　　　　　　uint32_t rendezvId);

　　・意味
　　　ランデブポイントを破棄する。ランデブポイントが使用中の場合は破棄することが
　　　できない。

　　・パラメタ
　　　rendezvId：IN：破棄するランデブポイントのID。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。


　・IPC_RendezvSend
　　・関数仕様
　　　RpcResult_t IPC_RendezvSend(
　　　　　　uint32_t rendezvId, 
　　　　　　RpcTaskID_t recvTask,
　　　　　　void *sendData, 
　　　　　　uint32_t sendSize,
　　　　　　void **replyData, 
　　　　　　uint32_t *replySize, 
　　　　　　uint32_t timeOut);

　　・意味
　　　ランデブポイントでデータを送信する。送信するデータは送信側が用意する。受信
　　　タスクへはデータのポインタとサイズのみが渡されるので、宛先のスレッドがプロ
　　　セス内であればスタティック上またはヒープ上に、別のプロセスであれば共有メモ
　　　リ上になければならない。また指定するランデブポイントも、宛先のスレッドが別
　　　のプロセスならば共有メモリ上のランデブポイントでないといけない。
　　　送信側から渡すデータは受信側がフリー等の処理をしなければならない。またこの
　　　関数内でエラーが発生した場合、戻り値がRPC_INTERUPTTEDの場合はデータが受信
　　　側に渡っていることをしめし、受信側でフリー等の処理をするが、そうでない場合
　　　は送信側が後処理をしなければならない。

　　・パラメタ
　　　rendezvId：IN：使用するランデブポイントのID
　　　recvTask：IN：宛先のスレッド。宛先のスレッドを指定しない場合は0を指定設定
　　　　　　する。
　　　sendData：IN：宛先のスレッドに送信するデータ。宛先のスレッドへはポインタのみ
　　　　　　が渡される。
　　　sendSize：IN：送信するデータのサイズ
　　　replyData：OUT：相手のスレッドから渡されるリプライデータ。ポインタのみが渡
　　　　　　される。渡されたデータ領域は受け取った側がフリー等の処理をする。
　　　replySize：OUT：渡されたデータのサイズ
　　　timeOut：IN：タイムアウト時間

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。エラーの場合の戻り値がRPC_INTERUPTTEDの場合は送信
　　　　　　データは受信側に渡っているが、そうでない場合は送信データは受信側に渡
　　　　　　っていない。


　・IPC_RendezvSendByTask
　　・関数仕様
　　　RpcResult_t IPC_RendezvSendByTask(
　　　　　　RpcBool_t IPCFlag, 
　　　　　　RpcTaskID_t recvTask,
　　　　　　void *sendData, 
　　　　　　uint32_t sendSize,
　　　　　　void **replyData, 
　　　　　　uint32_t *replySize, 
　　　　　　uint32_t timeOut);

　　・意味
　　　ランデブポイントでデータを送信する。送信するデータは送信側が用意する。受信
　　　タスクへはデータのポインタとサイズのみが渡されるので、宛先のスレッドがプロ
　　　セス内であればスタティック上またはヒープ上に、別のプロセスであれば共有メモ
　　　リ上になければならない。また指定するランデブポイントも、宛先のスレッドが別
　　　のプロセスならば共有メモリ上のランデブポイントでないといけない。
　　　送信側から渡すデータは受信側がフリー等の処理をしなければならない。またこの
　　　関数内でエラーが発生した場合、戻り値がRPC_INTERUPTTEDの場合はデータが受信
　　　側に渡っていることをしめし、受信側でフリー等の処理をするが、そうでない場合
　　　は送信側が後処理をしなければならない。
　　　指定した受信側のスレッドがランデブポイントで待機中でない場合は新たにランデ
　　　ブポイントが生成される。

　　・パラメタ
　　　IpcFlag：IN：ランデブポイントを生成する場所を示すフラグ。RPC_TRUEならば共有
　　　　　　メモリ上に、RPC_FALSEならばローカルメモリ上にとられる。
　　　recvTask：IN：宛先のスレッド。
　　　sendData：IN：宛先のスレッドに送信するデータ。宛先のスレッドへはポインタのみ
　　　　　　が渡される。
　　　sendSize：IN：送信するデータのサイズ
　　　replyData：OUT：相手のスレッドから渡されるリプライデータ。ポインタのみが渡
　　　　　　される。渡されたデータ領域は受け取った側がフリー等の処理をする。
　　　replySize：OUT：渡されたデータのサイズ
　　　timeOut：IN：タイムアウト時間

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。エラーの場合の戻り値がRPC_INTERUPTTEDの場合は送信
　　　　　　データは受信側に渡っているが、そうでない場合は送信データは受信側に渡
　　　　　　っていない。


　・IPC_RendezvSendByRendezvId
　　・関数仕様
　　　RpcResult_t IPC_RendezvSendByRendezvId(
　　　　　　uint32_t rendezvId, 
　　　　　　void *sendData, 
　　　　　　uint32_t sendSize,
　　　　　　void **replyData, 
　　　　　　uint32_t *replySize, 
　　　　　　uint32_t timeOut);

　　・意味
　　　ランデブポイントでデータを送信する。送信するデータは送信側が用意する。受信
　　　タスクへはデータのポインタとサイズのみが渡されるので、宛先のスレッドがプロ
　　　セス内であればスタティック上またはヒープ上に、別のプロセスであれば共有メモ
　　　リ上になければならない。また指定するランデブポイントも、宛先のスレッドが別
　　　のプロセスならば共有メモリ上のランデブポイントでないといけない。
　　　送信側から渡すデータは受信側がフリー等の処理をしなければならない。またこの
　　　関数内でエラーが発生した場合、戻り値がRPC_INTERUPTTEDの場合はデータが受信
　　　側に渡っていることをしめし、受信側でフリー等の処理をするが、そうでない場合
　　　は送信側が後処理をしなければならない。

　　・パラメタ
　　　rendezvId：IN：ランデブポイントのID
　　　sendData：IN：宛先のスレッドに送信するデータ。宛先のスレッドへはポインタのみ
　　　　　　が渡される。
　　　sendSize：IN：送信するデータのサイズ
　　　replyData：OUT：相手のスレッドから渡されるリプライデータ。ポインタのみが渡
　　　　　　される。渡されたデータ領域は受け取った側がフリー等の処理をする。
　　　replySize：OUT：渡されたデータのサイズ
　　　timeOut：IN：タイムアウト時間

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。エラーの場合の戻り値がRPC_INTERUPTTEDの場合は送信
　　　　　　データは受信側に渡っているが、そうでない場合は送信データは受信側に渡
　　　　　　っていない。


　・IPC_RendezvRecv
　　・関数仕様
　　　RpcResult_t IPC_RendezvRecv(
　　　　　　uint32_t rendezvId, 
　　　　　　RpcTaskID_t sendTask, 
　　　　　　void **recvData, 
　　　　　　uint32_t *recvSize, 
　　　　　　uint32_t timeOut);

　　・意味
　　　ランデブポイントで送信側から送られデータを受信する。受信したデータは受信側
　　　がフリー等の処理をしなければならない。
　　　受信側はこの関数を呼び出した後、IPC_RendezvReplyを呼び出さないと呼び出し側
　　　のスレッドがブロックしたままになっているので注意する。

　　・パラメタ
　　　rendezvId：IN：使用するランデブポイントのID。
　　　sendTask：IN：送信側のスレッド。送信側のスレッドを指定しない場合は0を指定
　　　　　　設定する。
　　　recvData：OUT：受信するデータ。データはポインタのみが渡される。
　　　recvSize：OUT：送信するデータのサイズ
　　　timeOut：IN：タイムアウト時間

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。


　・IPC_RendezvRecvByTask
　　・関数仕様
　　　RpcResult_t IPC_RendezvRecvByTask(
　　　　　　RpcBool_t IPCFlag,
　　　　　　RpcTaskID_t sendTask, 
　　　　　　uint32_t *rendezvId, 
　　　　　　void **recvData, 
　　　　　　uint32_t *recvSize, 
　　　　　　uint32_t timeOut);

　　・意味
　　　ランデブポイントで送信側から送られデータを受信する。受信したデータは受信側
　　　がフリー等の処理をしなければならない。この関数を呼び出したとき送信側がまだ
　　　ランデブポイントに到達していなければ、ランデブポイントを生成する。
　　　受信側はこの関数を呼び出した後、IPC_RendezvReplyを呼び出さないと呼び出し側
　　　のスレッドがブロックしたままになっているので注意する。

　　・パラメタ
　　　IpcFlag：IN：ランデブポイントを生成する場所を示すフラグ。RPC_TRUEならば共有
　　　　　　メモリ上に、RPC_FALSEならばローカルメモリ上にとられる。
　　　sendTask：IN：送信側のスレッド。
　　　rendezvId：OUT：生成された、または使用しているランデブポイントのID
　　　recvData：OUT：受信するデータ。データはポインタのみが渡される。
　　　recvSize：OUT：送信するデータのサイズ
　　　timeOut：IN：タイムアウト時間

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。


　・IPC_RendezvRecvByRendezvId
　　・関数仕様
　　　RpcResult_t IPC_RendezvRecvByRendezvId(
　　　　　　uint32_t rendezvId, 
　　　　　　void **recvData, 
　　　　　　uint32_t *recvSize, 
　　　　　　uint32_t timeOut);

　　・意味
　　　ランデブポイントで送信側から送られデータを受信する。受信したデータは受信側
　　　がフリー等の処理をしなければならない。
　　　受信側はこの関数を呼び出した後、IPC_RendezvReplyを呼び出さないと呼び出し側
　　　のスレッドがブロックしたままになっているので注意する。

　　・パラメタ
　　　rendezvId：IN：使用するランデブポイントのID。
　　　recvData：OUT：受信するデータ。データはポインタのみが渡される。
　　　recvSize：OUT：送信するデータのサイズ。
　　　timeOut：IN：タイムアウト時間。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。


　・IPC_RendezvReply
　　・関数仕様
　　　RpcResult_t IPC_RendezvReply(
　　　　　　uint32_t rendezvId, 
　　　　　　void *replyData, 
　　　　　　uint32_t replySize);

　　・意味
　　　リプライデータを送信側に送信する。この関数を呼び出すことによって送信側はブ
　　　ロック状態から解放される。

　　・パラメタ
　　　rendezvId：IN：使用するランデブポイントのID。
　　　replyData：IN：送信するデータ。データはポインタのみが渡される。送信したリプ
　　　　　　ライデータは送信側でフリー等の処理をしなければならない。
　　　replySize：IN：送信するデータのサイズ。

　　・戻り値
　　　RpcResult_t：成功した場合にはRPC_SUCCESSを設定する。エラーの場合はそれ以
　　　　　　外の値を設定する。この関数が成功しなかった場合は送信側にデータが送ら
　　　　　　れいないのでこの関数を呼び出した側で処理をする必要がある。



■　LICENSE

   This software is exhibited subject to observe terms and conditions of the 
 following article.

Copyright (C) 2012-2013 by Hiroyuki KAJIURA. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met:

    1:Redistributions of source code must retain the above copyright notice, 
      this list of conditions and the following disclaimer.
    2:Redistributions in binary form must reproduce the above copyright notice, 
      this list of conditions and the following disclaimer in the documentation 
      and/or other materials provided with the distribution.
    3:Neither the name of copyright owner nor the names of its contributors 
      may be used to endorse or promote products derived from this software 
      without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
OF THE POSSIBILITY OF SUCH DAMAGE.



