BEA Logo BEA Tuxedo Release 8.0

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

 

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

 


tpcall(3c)

名前

tpcall()-サービス要求を送信し、その応答を待つルーチン

形式

int tpcall(char *svc, char *idata, long ilen, char **odata, long \ 
*olen, long flags)

機能説明

tpcall() は、要求を送り、それと同期してその応答を待ちます。この関数への呼び出しは、tpacall() を呼び出した後、即座に tpgetrply() を呼び出すのと同じことです。tpcall() は、svc が指定するサービスに要求を送ります。この要求は、以前の tpspri() で変更されていないかぎり、svc に対して定義されている優先順位で送信されます。要求のデータ部分は、idata によって示されます。これは、あらかじめ tpalloc() によって割り当てられるバッファです。ilen は、送信する idata の大きさを指定します。なお、idata は、長さの指定を必要としないタイプのバッファを指している場合 (たとえば、FML のフィールド化バッファ)、ilen の値は無視されます (あるいは 0) にします。また、idata を NULL にすることもできますが、この場合には、ilen は無視されます。idata のタイプとサブタイプは、svc が認識するタイプおよびサブタイプのいずれかと一致しなければなりません。

odata は、応答が読み込まれるバッファを指すアドレス、olen は、その応答の長さを示します。*odata は、もともと tpalloc() によって割り当てられたバッファを指していなければなりません。同じバッファを送信と受信の両方に使用する場合には、odataidata のアドレスに設定してください。FMLFML32 バッファは、通常最小サイズ 4096 バイトを確保します。したがって、応答が 4096 バイトより大きい場合には、バッファ・サイズは返されるデータを入れるのに十分な大きさに拡大します。また、tpcall() が呼び出されたときに idata と *odata が同じであり、*odata が変更された場合、idata は有効なアドレスを指しません。古いアドレスの使用は、データの破損やプロセスの例外の原因になります。 リリース 6.4 では、バッファに対するデフォルトの割り当ては 1024 バイトです。また、最近使用したバッファの履歴情報が保持され、最適サイズのバッファをリターン・バッファとして再利用できます。

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

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

*olen が戻り時に 0 であると、応答にはデータ部がなく、*odata も、それが指すバッファも変更されていません。*odata または *olen が NULL であると、エラーになります。

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

TPNOTRAN

呼び出しプロセスがトランザクション・モードにあり、このフラグが設定されていると、svc が呼び出されたときに、このプロセスは呼び出し元のトランザクションの一部として実行されません。svc が依然としてトランザクション・モードで起動される場合がありますが、それは同じトランザクションでないことに注意してください。svc は、コンフィギュレーション属性で、自動的にトランザクション・モードで呼び出されるようにすることができます。このフラグを設定するトランザクション・モードの呼び出し元は、トランザクション・タイムアウトの影響を受けます。このフラグをセットして起動したサービスが異常終了した場合、呼び出し元のトランザクションは影響されません。

TPNOCHANGE

デフォルトの設定では、*odata で示されるバッファとタイプの異なるバッファを受け取った場合、受信プロセスが入ってくるバッファのタイプを認識できるかぎり、*odata のバッファ・タイプが受信バッファのタイプに変わります。このフラグを設定しておくと、*odata が指すバッファのタイプは変更されません。つまり、受信したバッファのタイプとサブタイプは、*odata が指すバッファのタイプとサブタイプと一致しなければなりません。

TPNOBLOCK

ブロッキング条件が存在する場合、要求は送られません (たとえば、メッセージを受け取るバッファがいっぱいのときなど)。ただし、このフラグは tpcall() の送信部分にしか適用されません。この関数は応答を待ってブロックすることがあります。TPNOBLOCK が指定されていないときにブロッキング条件が存在すると、呼び出し元は、その条件が解消されるか、またはタイムアウト (トランザクションまたはブロッキング) が発生するまではブロックされます。

TPNOTIME

このフラグは、呼び出し元が無制限にブロックでき、ブロッキング・タイムアウトの対象にならないようにすることを指定します。ただし、呼び出し元がトランザクション・モードの場合、このフラグの効果はありません。この場合、呼び出し元はトランザクション・タイムアウトの制限に従います。トランザクション・タイムアウトは依然として発生する可能性があります。

TPSIGRSTRT

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

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

戻り値

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

異常終了すると、tpcall() は -1 を返し、tperrno() を設定してエラー条件を示します。呼び出しが特定の tperrno() 値で異常終了した場合、中間の ATMI 呼び出しを省略して引き続き tperrordetail() を呼び出すと、生成されたエラーの詳細が提供されます。詳細については、tperrordetail(3c) リファレンス・ページを参照してください。

エラー

異常終了時には、tpcall()tperrno() を次のいずれかの値に設定します(特に指定がない限り、障害は、呼び出し元のトランザクションに影響しません)。

[TPEINVAL]

無効な引数が指定されました (たとえば、svc が NULL である場合、あるいは flags が無効である場合など)。

[TPENOENT]

プロセスが存在しないか、会話サービスであるか、または名前が "." で始まるため、svc に送信できません。

[TPEITYPE]

idata のタイプとサブタイプが、svc が受け付けることのできるものでありません。

[TPEOTYPE]

応答のタイプおよびサブタイプは呼び出し元が認識できないものです。あるいは、TPNOCHANGEflags に設定されているか、*odata のタイプとサブタイプがそのサービスから送られた応答のタイプおよびサブタイプと一致しません。*odata、その内容、そして *olen はいずれも変更されません。サービス要求が呼び出し元の現在のトランザクションの一部として発行されると、応答が捨てられるためそのトランザクションは「アボートのみ」とマーク付けされます。

[TPETRAN]

svc が、トランザクションをサポートしていないサーバに属しており、TPNOTRAN が設定されていませんでした。

[TPETIME]

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

[TPESVCFAIL]

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

[TPESVCERR]

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

[TPEBLOCK]

送信呼び出しでブロッキング条件が検出されましたが、TPNOBLOCK が指定されていました。

[TPGOTSIG]

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

[TPEPROTO]

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

[TPESYSTEM]

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

[TPEOS]

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

関連項目

tpacall(3c)tpalloc(3c)tperrordetail(3c)tpforward(3c)tpfree(3c)tpgprio(3c)tprealloc(3c)tpreturn(3c)tpsprio(3c)tpstrerrordetail(3c)tptypes(3c)

 

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