(1)IDLマッピング
IDL言語でシーケンス型sequenceを指定した場合、C言語では以下の構造体(シーケンス構造体)にマッピングされます。また、シーケンス構造体の領域獲得関数(関数名:“モジュール名_インタフェース名_構造体名_alloc”。以降XX_alloc関数と呼ぶ)と、データ域(_buffer)の領域獲得関数(関数名:“モジュール名_インタフェース名_構造体名_allocbuf”。以降XX_allocbuf関数と呼ぶ)が生成されます。
シーケンス構造体の構造を以下に示します。
struct { CORBA_unsigned_long _maximum; /* シーケンス配列の最大個数 */ CORBA_unsigned_long _length; /* シーケンス配列の使用個数 */ void *_buffer; /* データ域 */ };
以降では、以下のIDL定義例をもとに説明します。
module ODsample{ interface seqtest{ typedef sequence<long> sampleseq; sampleseq op1(in sampleseq seq1, out sampleseq seq2, inout sampleseq seq3 ); }; };
typedef struct { CORBA_unsigned_long _maximum; CORBA_unsigned_long _length; CORBA_long *_buffer; } sampleseq;
(2)クライアントアプリケーションで扱うパラメタ
クライアントアプリケーションのパラメタの扱いについて以下に示します。
パラメタ | サーバへ渡すパラメタ | サーバから渡されたパラメタ |
---|---|---|
in | シーケンス構造体/データ域(_buffer)を獲得する場合は、XX_alloc関数/XX_allocbuf関数を使用します。 | - |
inout | シーケンス構造体/データ域(_buffer)を獲得する場合は、XX_alloc関数/XX_allocbuf関数を使用します。 リリースフラグにCORBA_TRUEが設定されていると、データ部の領域はスタブにより解放されます。 | 領域は、スタブで自動的に獲得されます(各メンバも設定されます)。 |
out | - | 領域は、スタブで自動的に獲得されます(各メンバも設定されます)。このとき、リリースフラグにCORBA_TRUEが設定されます。 (inoutパラメタと同じ) |
注意
クライアントおよびスタブで獲得した領域は、不要になった時点でCORBA_free()で解放する必要があります。このとき、データ域の領域(XX_allocbuf関数で獲得)を解放するかどうかを、リリースフラグで指定します。
リリースフラグの参照/設定は、以下の関数/フラグを使用します。
[関数]
CORBA_boolean CORBA_sequence_get_release( void * ); void CORBA_sequence_set_release( void *, CORBA_boolean );
[フラグ]
CORBA_TRUE
CORBA_free()発行時、シーケンスデータ領域も解放されます。
CORBA_FALSE
CORBA_free()発行時、シーケンスデータ領域は解放されません(デフォルト)。
なお、スタブで獲得されたパラメタ(out,復帰)のリリースフラグは、CORBA_TRUEに設定されます。
ただし、シーケンス型/any型のsequenceをin/inoutに使用する場合は、XX_allocbuf関数で獲得したシーケンス型/any型の領域に対して、リリースフラグにCORBA_TRUEを設定してください。また、out/inout/復帰値に使用する場合、シーケンス型の_bufferの型がシーケンス型/any型の場合、かつ_bufferがNULLでない場合は、CORBA_free()で領域を解放する前に、_buffer領域に対してリリースフラグにCORBA_TRUEを設定してください。
クライアントアプリケーションでの処理例を以下に示します。
ODsample_seqtest_sampleseq *seq1, *seq2, *seq3, *ret; CORBA_Object obj; CORBA_Environment env; CORBA_long *smp; int i; /* inパラメタ */ seq1 = ODsample_seqtest_sampleseq_alloc(); /* 領域獲得 */ seq1->_maximum = seq1->_length = 2; seq1->_buffer = ODsample_seqtest_sampleseq_allocbuf(2); for( i = 0; i < 2; i++ ){ smp = &(seq1->_buffer[i]); *smp = i; } CORBA_sequence_set_release( seq1, CORBA_TRUE ) ; /* リリースフラグ設定 */ /* inoutパラメタ */ seq3 = ODsample_seqtest_sampleseq_alloc(); seq3->_maximum = seq3->_length = 3; seq3->_buffer = ODsample_seqtest_sampleseq_allocbuf(3); for( i = 0; i < 3; i++ ){ smp = &(seq3->_buffer[i]); *smp = i*10; } CORBA_sequence_set_release( seq3, CORBA_TRUE ) ; /* リリースフラグ設定 */ /* サーバ呼出し */ ret = ODsample_seqtest_op1( obj, seq1, &seq2, seq3, &env ); /* 領域解放 */ CORBA_free( seq1 ); /* inパラメタ */ CORBA_free( seq2 ); /* outパラメタ */ CORBA_free( seq3 ); /* inoutパラメタ */ CORBA_free( ret ); /* 復帰パラメタ */
(3)サーバアプリケーションで扱うパラメタ
サーバアプリケーションのパラメタの扱いについて以下に示します。
パラメタ | クライアントから渡されたパラメタ | クライアントへ渡すパラメタ |
---|---|---|
in | 各領域(シーケンス構造体/データ域)は、スケルトンで自動的に獲得/解放されます。 | - |
inout | 各領域(シーケンス構造体/データ域)は、スケルトンで自動的に獲得されます。このとき、リリースフラグにCORBA_TRUEが設定されます。 | inoutデータの領域を更新する場合は、以下の処理を行ってください。 リリースフラグにCORBA_TRUEを設定する、またはリリースフラグを設定しない場合、領域はスケルトンで自動的に解放されます。 |
out | - | XX_alloc関数/XX_allocbuf関数でシーケンス構造体/データ域(_buffer)を獲得します。 リリースフラグにCORBA_TRUEを設定する場合、領域はスケルトンで自動的に解放されます。 |
サーバアプリケーションでの処理例を以下に示します。
ODsample_seqtest_sampleseq *ODsample_seqtest_op1( ODsample_seqtest obj, ODsample_seqtest_sampleseq *seq1, ODsample_seqtest_sampleseq **seq2, ODsample_seqtest_sampleseq *seq3, CORBA_Environment *env ) { ODsample_seqtest_sampleseq *seq; CORBA_long *smp; int i; /* outパラメタ */ seq = *seq2 = ODsample_seqtest_sampleseq_alloc(); /* 領域獲得 */ seq->_maximum = seq->_length = 4; /* メンバ設定 */ seq->_buffer = ODsample_seqtest_sampleseq_allocbuf(4); /* データ域獲得 */ for( i = 0; i < 4; i++ ) { smp = &(seq->_buffer[i]); *smp = i*100; } CORBA_sequence_set_release( *seq2, CORBA_TRUE ); /* リリースフラグ設定 */ /* inoutパラメタ */ seq3->_maximum = seq3->_length = 5; CORBA_free( seq3->_buffer ); /* 領域解放(データ域) */ seq3->_buffer = ODsample_seqtest_sampleseq_allocbuf(5); /* 領域再獲得(データ域) */ for( i = 0; i < 5; i++ ) { /* パラメタ設定 */ smp = &(seq3->_buffer[i]); *smp = i*1000; } CORBA_sequence_set_release( seq3, CORBA_TRUE ); /* リリースフラグ設定 */ /* 復帰パラメタ */ seq = ODsample_seqtest_sampleseq_alloc(); /* 領域獲得 */ seq->_maximum = seq->_length = 6; /* メンバ設定 */ seq->_buffer = ODsample_seqtest_sampleseq_allocbuf(6); /* データ域獲得 */ for( i = 0; i < 6; i++ ) { smp = &(seq->_buffer[i]); *smp = i*10000; } CORBA_sequence_set_release( seq, CORBA_TRUE ); /* リリースフラグ設定 */ return( seq ); }