BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedoホーム   |   BEA Tuxedo C リファレンス   |   先頭へ   |   前へ   |   次へ   |   目次

 


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() から正常に終了した場合、あるいは tperrno()TPESVCFAIL に設定された状態で終了した場合、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]

タイムアウトが発生しました。呼び出し元がトランザクション・モードの場合は、トランザクション・タイムアウトが発生し、そのトランザクションは「アボートのみ」とマークされます。トランザクション・モードでなければ、ブロッキング・タイムアウトが発生し、TPNOBLOCKTPNOTIME も指定されていませんでした。いずれの場合も、*data、その内容、および *len はいずれも変更されません。*cd は、呼び出し元がトランザクション・モードでなければ (そして、TPGETANY が設定されていない場合) そのまま有効です。トランザクション・タイムアウトが発生すると、トランザクションがアボートされない限り、新しいリクエストの送信や未処理の応答の受信はできません (ただし、1 つの例外を除く)。これらの操作を行おうとすると、TPETIME が発生して失敗します。1 つの例外とは、ブロックされず、応答を期待せず、かつ呼び出し元のトランザクションのために送信されない (つまり、TPNOTRANTPNOBLOCK および TPNOREPLY が設定された状態で tpacall() が呼び出される場合) 要求です。

[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)

 

先頭へ戻る 前のトピックへ 次のトピックへ