bea ホーム | 製品 | dev2dev | support | askBEA
BEA Logo Tuxedo
 ドキュメントのダウンロード   サイトマップ   用語集 
検索
0

Tuxedo C リファレンス

 Previous Next Contents View as PDF  

tpgetrply(3c)

名前

tpgetrply()−以前の要求に対する応答を受信するためのルーチン

形式

#include <atmi.h>
int tpgetrply(int *
cd, char **data, long *len, long flags)

機能説明

tpgetrply() は、以前に送られた要求に対する応答を返します。この関数の最初の引数 cd は、tpacall() が返す呼び出し記述子を指します。デフォルトの設定では、この関数は、*cd と一致する応答が届くか、タイムアウトが発生するまで処理を進めません。

data は、以前に tpalloc() で割り当てたバッファを指すポインタのアドレスでなければならず、lentpgetrply() が正常に受信したデータ量を設定する long 型の値を指すようにしてください。正常終了時には、*data は、その応答を収めたバッファを指し、*len には、そのデータのサイズが入ります。FML と FML32 バッファは、通常最小サイズ 4096 バイトを確保します。応答が 4096 バイトより大きい場合には、バッファ・サイズは返されるデータを入れるのに十分な大きさに拡大します。リリース 6.4 では、バッファに対するデフォルトの割り当ては 1024 バイトです。また、最近使用したバッファの履歴情報が保持され、最適サイズのバッファをリターン・バッファとして再利用できます。

容量まで満たされていないかもしれない送信者側のバッファ (たとえば、FML または FML32 バッファ) は、送信に使用されたサイズになります。システムは、受信データのサイズを任意の量で拡大します。これは、受信者が送信者の割り当てたバッファ・サイズより小さく、送信されたデータのサイズより大きいバッファを受け取ることを意味します。

受信バッファのサイズは、増加することも減少することもあります。また、アドレスもシステムがバッファを内部で交換するごとに常に変更されます。応答バッファのサイズが変わったどうか (また変わったとしたらどれくらい変わったのか) を決定するには、tpgetrply() が *len とともに発行される前に、合計サイズを比べてください。バッファ管理の詳細については、C 言語アプリケーション・トランザクション・モニタ・インターフェイスについてを参照してください。

返されたときに *len が 0 の場合は、応答にはデータ部分がなく、*data やそれが指示するバッファは変更されていません。

*data または len が NULL であるとエラーになります。

マルチスレッド・プログラムの各コンテキスト内では、次の条件があります。

これらの制限のどちらかに違反する tpgetrply() 呼び出しを発行した場合は、-1 が返され、tperrnoTPEPROTO に設定されます。

次のような呼び出しの発行は受け付けられます。

次に、有効な flags の一覧を示します。

TPGETANY

このフラグは、tpgetrply() が、cd によって示される記述子を無視し、存在する応答があればそれらを返し、返された応答の呼び出し記述子を指すよう cd を設定します。応答が存在しなければ、tpgetrply() は 1 つの応答が届くまで待機します (デフォルトの設定の場合)。

TPNOCHANGE

デフォルトでは、*data が指すバッファ型と異なるバッファ型を受信すると、*data のバッファ型は受信したバッファ型に変更されます (受信プロセスがそのバッファ型を認識できる場合)。このフラグが設定されていると、*data が指すバッファのタイプは変更されません。つまり、受信されたバッファのタイプおよびサブタイプは、それぞれ *data が指すバッファのタイプおよびサブタイプと一致しなければなりません。

TPNOBLOCK

tpgetrply() は、応答が送られてくるまで待機しません。応答がキューから取り出せる状態であれば、tpgetrply() はその応答を取り込み、終了します。このフラグの指定がなく、応答もキューから取り出せる状態にない場合、呼び出し元は、応答が到着するまであるいはタイムアウト (トランザクション・タイムアウトまたはブロッキング・タイムアウト) が発生するまでブロックされます。

TPNOTIME

このフラグは、呼び出し元をその応答に対して無期限にブロックでき、ブロッキング・タイムアウトの影響も受けないようにすることを指定します。ただし、トランザクション・タイムアウトは発生する可能性があります。

TPSIGRSTRT

シグナルが関数内部のシステム・コールを中断すると、中断されたシステム・コールは出しなおされます。

後に示す場合以外は、*cd はその応答を受信した後は有効でなくなります。

マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpgetrply() の呼び出しを発行できません。

戻り値

tpgetrply() が正常に終了した場合、あるいは tperrnoTPESVCFAIL に設定されて終了した場合、tpurcode() には、tpreturn() の一部として送信されたアプリケーションが定義した値が入ります。

異常終了すると、tpgetrply() は -1 を返し、tperrno を設定してエラー条件を示します。

エラー

異常終了時には、tpgetrply()tperrno に対して行う設定は、次のようになります。TPGETANY が設定されていない場合は、特に明記されていないかぎり、*cd は無効になります。TPGETANY が設定されている場合は、cd は異常が発生した応答の記述子を指します。応答が取り出せるようになる前にエラーが発生した場合には、cd は 0 を指します。また、特に明記しないかぎり、異常終了は呼び出し元のトランザクションが存在していても、それには影響しません。呼び出しが異常終了して tperrno に特定の値が設定されたときは、中間の ATMI 呼び出しを省略して引き続き tperrordetail() を呼び出すと、エラーに関する詳細な情報が提供されます。詳細については、tperrordetail(3c) リファレンス・ページを参照してください。

[TPEINVAL]

無効な引数が与えられました (たとえば、cddata、*data または len が NULL、あるいは flags が無効など)。cd が NULL でない場合、エラーが発生した後もこの値は有効で、応答は未終了のまま残されます。

[TPEOTYPE]

応答のタイプとサブタイプが呼び出し元が認識しているものでありません。あるいは、TPNOCHANGEflags に設定されていて、*data のタイプとサブタイプがそのサービスから送られた応答のタイプおよびサブタイプと一致しません。*data の内容も *len も変更されていません。呼び出し元の現在のトランザクションのために応答が受信された場合は、そのトランザクションには中途終了マークが付けられます。

[TPEBADDESC]

cd が無効な記述子を指しています。

[TPETIME]

このエラー・コードは、タイムアウトが発生したか、または現在のトランザクションがすでに「ロールバックのみ」とマークされているにもかかわらず tpgetrply() が試行されたことを示します。

呼び出し元がトランザクション・モードにある場合、トランザクションはすでに「ロールバックのみ」になっているか、またはタイムアウトが発生しています (中途終了マークが付けられる)。呼び出し元がトランザクション・モードにない場合、ブロッキング・タイムアウトが発生しています。ブロッキング・タイムアウトは、TPNOBLOCK または TPNOTIME、あるいはその両方を指定した場合は発生しません。いずれのケースでも、*data、その内容、*len はどれも変更されません。*cd は、呼び出し元がトランザクション・モードでなければ (そして、TPGETANY が設定されていない場合) そのまま有効です。

トランザクション・タイムアウトが発生すると、1 つの例外を除き、トランザクションがアボートされない限り、新しいリクエストを送信したり、未処理の応答を受信しようとしても、TPETIME で異常終了します。1 つの例外とは、ブロックされず、応答を期待せず、かつ呼び出し元のトランザクションのために送信されない (つまり、TPNOTRANTPNOBLOCK および TPNOREPLY が設定された状態で tpacall() が呼び出される場合) 要求です。

サービスがトランザクション内部で失敗すると、そのトランザクションは TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。

[TPESVCFAIL]

呼び出し元の応答を送るサービス・ルーチンが、TPFAIL を設定した状態で tpreturn() を呼び出しました。これは、アプリケーション・レベルの障害です。サービスの応答の内容は (送信された場合) は、*data が指すバッファに入ります。呼び出し元のトランザクションの代わりにサービス要求が発行された場合、トランザクションは「アボートのみ」とマークされます。トランザクションがタイムアウトしたかどうかに関わりなく、トランザクションがアボートされる前の通信で有効であるのは、TPNOREPLYTPNOTRAN、および TPNOBLOCK を設定した tpacall() の呼び出しだけです。

[TPESVCERR]

サービス・ルーチンが、tpreturn() あるいは tpforward() でエラーを検出しました (たとえば、誤った引数が渡された場合など)。このエラーが発生すると、応答データは返されません (つまり、data、その内容、および *len はいずれも変更されません)。呼び出し元のトランザクションの代わりにサービス要求が発行された場合、トランザクションは「アボートのみ」とマークされます。トランザクションがタイムアウトしたかどうかに関わりなく、トランザクションがアボートされる前の通信で有効であるのは、TPNOREPLYTPNOTRAN、および TPNOBLOCK を設定した tpacall() の呼び出しだけです。UBBCONFIG ファイル中の SVCTIMEOUT か、TM_MIB 中の TA_SVCTIMEOUT が 0 でない場合にサービスのタイムアウトが発生すると、TPESVCERR が返されます。

[TPEBLOCK]

ブロッキング状態のため、TPNOBLOCK が指定されました。*cd はそのまま有効です。

[TPGOTSIG]

シグナルを受け取りましたが、TPSIGRSTRT が指定されていません。

[TPEPROTO]

tpgetrply() が不正に呼び出されました。

[TPESYSTEM]

BEA Tuxedo システムのエラーが発生しました。エラーの正確な内容がログ・ファイルに書き込まれます。

[TPEOS]

オペレーティング・システムのエラーが発生しました。リモート・ロケーションにあるメッセージ・キューがいっぱいの場合には、TPEOS が返される場合もあります。

関連項目

tpacall(3c)tpalloc(3c)tpcancel(3c)tperrordetail(3c)tprealloc(3c)tpreturn(3c)tpstrerrordetail(3c)tptypes(3c)

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy