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

Tuxedo C リファレンス

 Previous Next Contents View as PDF  

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

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

エラー

異常終了時には、tpcall()tperrno を次のいずれかの値に設定します(特に記述した場合を除いては、エラーが呼び出し元のトランザクションに影響を及ぼすことはありません)。

[TPEINVAL]

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

[TPENOENT]

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

[TPEITYPE]

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

[TPEOTYPE]

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

[TPETRAN]

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

[TPETIME]

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

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

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

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

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

 

Back to Top Previous Next
Contact e-docsContact BEAwebmasterprivacy