Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス C言語編


tpacall

〈このページの構成〉

名称

リクエスト/レスポンス型サービスの呼び出し

形式

ANSI C,C++の形式

#include <xatmi.h>
int  tpacall(char *svc,char *data,long len,long flags)

K&R版 Cの形式

#include <xatmi.h>
int   tpacall(svc,data,len,flags)
char  *svc;
char  *data;
long  len;
long  flags;

機能

関数tpacall()は,svcで示すサービスにサービス要求のメッセージを送信します。dataがNULLでない場合は,dataはあらかじめtpalloc()で割り当てたバッファを指して,lenには送信するデータの長さを設定します。

Note:長さを指定する必要がないバッファ型をdataが指す場合,lenは無視されます(0にしてください)。長さが必要なバッファ型をdataが指す場合は,lenには0を設定しないでください。dataがNULLの場合,lenは無視されて,サービス要求はデータ部がないデータで送信されます。dataのtypeとsubtypeは,svcで指すサービスで認識しているtypeとsubtypeのうちのどれか一つに必ず一致させてください。

Note:トランザクションモードから送信した,それぞれのサービス要求に対する応答は,最終的には必ず受信するようにしてください。

『引数』

『●svc

要求するサービスのサービス名を設定します。』

『●data

送信データ格納領域へのポインタを設定します。』

『●len

送信データの長さを設定します。』

『●flags

flagsには,次に示す値を設定します。』

TPNOTRAN

呼び出し側がトランザクションモードで,かつ このフラグを設定している場合,起動されたsvcは,呼び出し側のトランザクションの一部にはなりません。呼び出し側がトランザクションモードで,かつsvcがトランザクション処理ができない場合は,このフラグを必ず設定してください。呼び出し側がトランザクションモードであれば,このフラグを設定していても,トランザクションタイムアウトは起こります(トランザクションモードでなければ起こりません)。このフラグで起動されたサービスが失敗しても,呼び出し側のトランザクションには影響しません。

TPNOREPLY

サービス要求に対する応答が不要であることを,tpacall()に設定します。TPNOREPLYを設定したとき,tpacall()は,正常に0をリターンしますが,その0は記述子としては意味を持ちません。呼び出し側がトランザクションモードである場合は,TPNOTRANと一緒に設定しなければ,このフラグは使えません。

TPNOBLOCK

ブロッキング状態の場合(例えば,送信しようとするメッセージで内部バッファが満杯),サービス要求は送信されません。TPNOBLOCKが設定されていないで,ブロッキング状態のときは,呼び出し側は状況が収まるか,タイムアウト(トランザクション,またはブロッキングタイムアウト)が起こるまで,ブロッキングしています。

TPNOTIME

呼び出し側を無期限にブロックして,ブロッキングタイムアウトが起こらないことを意味します。トランザクションタイムアウトは起こります。

TPSIGRSTRT

シグナルが実行中のシステムコールを中断したら,中断したシステムコールを再び呼びます。

リターン値

成功した場合,tpacall()は送信したサービス要求の応答を受信するために使う記述子を返します。エラー時には,-1をリターンして,tperrnoにエラーの状態を示す値を設定します。

エラー

次のような場合,tpacall()はエラーリターンして,次のうちどれか一つの値をtperrnoに設定します。特に示さないかぎり,失敗は呼び出し側のトランザクションに影響を与えません。

リターン値

リターン値(数値)

意味

TPEBLOCK

3

TPNOBLOCKを設定したtpacall()で送信したときに,ブロッキング状態になりました。

TPEINVAL

4

間違った引数が与えられました(例えば,svcがNULL,dataがtpalloc()に割り当てられた領域を指していない,flagsに設定した値が間違っている)。

TPELIMIT

5

解決していない非同期の送信要求が最大数に達したので,呼び出し側の要求は送信されません。

TPENOENT

6

svcで示すサービスが存在しないので,送信できません。

TPEOS

7

オペレーティングシステムにエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。

TPEPROTO

9

tpacall()が間違った状況で呼ばれました。

TPESYSTEM

12

コミュニケーションリソースマネジャシステムでエラーが起こりました。厳密なエラーの性質は,product-specificな方法で定義されます。

TPETIME

13

タイムアウトが起こりました。呼び出し側がトランザクションモードの場合は,これはトランザクションタイムアウトで,トランザクションはrollback_only状態となります。そうでない場合は,TPNOBLOCKもTPNOTIMEも設定されていない状態でブロッキングタイムアウトが起こったことを意味します。トランザクションタイムアウトが起こった場合は,トランザクションをロールバックするまでは,新しく送信しようとしていた送信や,解決していない応答は,TPETIMEでエラーリターンします。

TPETRAN

14

svcがトランザクション処理をできないにもかかわらず,TPNOTRANが設定されていません。

TPEGOTSIG

15

シグナルは受信されましたが,TPSIGRSTRTが設定されていません。

TPEITYPE

17

dataのtypeとsubtypeが,svcで使える形式ではありません。

関連項目

tpalloc(),tpcall(),tpcancel(),tpgetrply()

『OpenTP1で使う場合の注意事項』

  1. 『該当バージョンのOpenTP1では,TPNOBLOCKフラグは無効となります。そのため,TPEBLOCKがtperrnoに返ることはありません。OpenTP1では,ブロッキング状態のため通信ができない場合は,ネットワークダウンが原因で通信ができない場合と同様に,TPESYSTEMをリターンする仕様となっています。』

  2. 『該当バージョンのOpenTP1では,TPNOTIMEフラグは無効となります。』

  3. 『TPSIGRSTRTフラグは無効となります。このフラグの有無に関係なく,シグナル受信時には,中断したシステムコールを再び呼びます。TPEGOTSIGがリターンすることはありません。』

  4. 『該当バージョンのOpenTP1では,TPEITYPEはリターンされません。svcで使えないタイプのdataを渡した場合,tpacall()は正常に終了しますが,tpgetrply()を呼び出した時点でTPESYSTEMがリターンされて,エラーであることがわかります。もし呼び出し側がトランザクションモードであれば,rollback_only状態となります。』

  5. 『OpenTP1では,トランザクションタイムアウトが起こったときには,そのプロセスは異常終了します。そのため,TPETIMEがリターンされるのは,ブロッキングタイムアウトの場合だけとなります。』

  6. 『該当バージョンのOpenTP1では,ロールバックする必要があるデータは,X/Openで特に指定がないかぎり,TPESYSTEMとしています。ただし,TPESYSTEMがリターンしても,rollback_only状態とならない場合もあります。』

  7. 『該当バージョンのOpenTP1では,TPELIMITはリターンされません。』

  8. 『TP1/NET/OSI-TP-Extendedを使ったOSI TP通信をする場合,送信するデータの長さはNET/Library共通定義のNETバッファグループ定義nettbufにあるlengthオペランドに指定した値を超えないようにしてください。』

  9. 『次の場合,OSI TP通信では,tpcall,またはtpgetrplyでTPESVCERRのエラーになり,TCP/IP通信ではTPENOENT,またはTPESYSTEMのエラーになります。

    • 指定したサービスが要求先に存在しない

    • タイプトバッファがサーバに認識されない

    • サービス起動中にエラーになる』

  10. 『OSI TP通信で,システムのアソシエーション本数が足りない場合,ログメッセージを出力し,TPESYSTEMでリターンします。』

  11. 『OSI TP通信では,TPNOTIMEを指定しても,ブロッキングタイムアウトします。TCP/IP通信では,トランザクションでないとき,ブロッキングタイムアウトします。』

  12. 『OSI TP通信では,ユーザサービス定義のmessage_store_buflenは,nettbuf -gで指定したサイズ以上を定義してください。TCP/IP通信では,dc_rpc_callと同様です。』

  13. 『OSI TP通信をするXATMIのエラーは,従来のTCP/IPとエラー動作が異なる場合があります。』