|
アプリケーション トランザクション モニタ インタフェース (ATMI: Application-to-Transaction Monitor Interface) は、アプリケーションとトランザクション処理システムとの間に介在し、ATMI インタフェースと呼ばれています。このインタフェースは、リソースのオープンとクローズ、トランザクションの管理、型付きバッファの管理、要求/応答型サービス呼び出しや会話型サービス呼び出しの起動などを行う関数呼び出しを提供します。
ATMI リファレンス ページに記述されている関数呼び出しには、特定のコミュニケーション モデルがあります。このモデルは、クライアント プロセスとサーバ プロセスが要求および応答の各メッセージを使用して如何にコミュニケートできるかという観点から表現されています。
コミュニケーションの基本的パラダイムとして、要求/応答型と会話型の 2 つがあります。要求/応答型サービスは、サービス要求とそれに関わるデータによって呼び出されます。要求/応答型サービスは、要求を 1 つだけ受け取ることができ (該当サービス ルーチンに入った時点で)、かつ応答も 1 つだけ送信することができます (該当サービス ルーチンから戻った時点で)。一方、会話型サービスは接続要求によって呼び出されます。このとき、オープンされた接続を参照する手段が必要です (すなわち、以後の接続ルーチンを呼び出す際に使用される記述子)。接続が確立され、サービス ルーチンが呼び出されると、以降、接続プログラムあるいは会話型サービスは、その接続が解除されるまでアプリケーションで定義されたようにデータの送受信を行えるようになります。
なお、プロセスは要求/応答型と会話型によるコミュニケーションのいずれをも行うことができますが、両方のサービス要求を受け付けることはできません。以下の節では、これら 2 種類のコミュニケーション パラダイムについてその概要を説明します。
| 注意 : | Oracle Tuxedo のマニュアルでは、さまざまな場所でスレッドについて説明しています。マルチスレッドのアプリケーションの説明で「スレッド」と記載されている場合は、文字どおりのスレッドを意味します。ただし、シングルスレッドとマルチスレッドの両方のアプリケーションに関するトピックで「スレッド」という言葉が使用される場合があります。このような場合にシングルスレッドのアプリケーションを実行していれば、「スレッド」はプロセス全体を指しているものと考えてください。 |
要求/応答型のコミュニケーションの場合、クライアントは要求を送り、応答を受け取ることができる 1 つのプロセスとして定義されています。定義によれば、クライアントは要求を受け取ったり、応答を送ったりすることはできません。その代わり、クライアントはいくつでも要求を送ることができ、またそれと同時に応答を待ったり、あるいは適宜ある一定数の応答を受け取ったりすることができます。場合によっては、クライアントは応答を必要としない要求を送ることもできます。tpinit() と tpterm() を使用すれば、クライアントは Oracle Tuxedo ATMI システム アプリケーションと結合および分離することができます。
一方、要求/応答型サーバは一度に 1 つのサービス要求を受け取り、その要求に対して 1 つの応答を返すことができるプロセスと定義されています。ただし、サーバがマルチスレッドであれば、一度に複数の要求を受け取り、一度に複数の応答を返すことができます。サーバは特定の要求を処理しながら、一方で要求/応答型要求あるいは会話型要求を出し、それらの応答を受け取ることにより、クライアントのように働くこともできます。サーバはこうした能力の故に、リクエスタと呼ばれることもあります。ただし、クライアント プロセスとサーバ プロセスはどちらもリクエスタになることができます (実際、クライアントはリクエスタ以外の何物でもありません)。
要求/応答型サーバは別の要求/応答型サーバに要求を送る (転送する) ことができます。この場合、最初のサーバは受け取った要求を別のサーバに渡すだけで、応答を受け取ることは期待しません。この連鎖の中の最後のサーバがその要求に対する応答をもとのリクエスタに送ります。この転送ルーチンの利用によって、もとのリクエスタは最終的にその応答を受け取ることができるのです。
サーバとサービス ルーチンの利用から、Oracle Tuxedo ATMI システム アプリケーションの作成に構造化手法をとることが可能になります。サーバサイドでは、アプリケーション作成者は、要求の受信や応答の送信といったコミュニケーションの詳細ではなく、サービスによって実行する事柄に関する作業に専念すればよいのです。コミュニケーション上の詳細の多くは Oracle Tuxedo ATMI システムの main が処理するため、サービス ルーチンを作成するときにはある一定の規則に従う必要があります。サーバは、そのサービス ルーチンを終了する時点で、tpreturn() を使用して応答を送ったり、あるいは tpforward() を使用して要求を転送したりできます。サービスはその他の作業を行ったり、この時点以後別のプロセスとコミニュニケートすることは許されません。そのため、サーバが実行するサービスは、要求が受け取られたときに開始され、応答が送信あるいは要求が転送された時点で終了します。
要求メッセージと応答メッセージとの間には、本質的に異なる点があります。要求にはそれが送信される以前には関連するコンテキストはありませんが、応答にはあるという点です。たとえば、ある要求を送る際に、呼び出し側はアドレッシング情報を与えなければなりませんが、応答は常にその要求を出したプロセスに返されます。つまり、応答の場合には、要求が出されるときに与えられたアドレッシング情報が維持されていて、応答の送信側はそのあて先になんら手を加えることはできません。この両者の相違点については、tpcall() のルーチンのパラメータと説明で明らかにされています。
要求メッセージはその送信時に特定の優先順位が付与されます。この優先順位にしたがって、要求はキューから取り出されます。つまり、サーバはキューの中で最も優先順位の高い要求から順に取り出すのです。ただし、要求がいつまでもキューの中に残されてしまうのを防ぐために、優先順位に関係なく、最も長くキューに入っている要求が一定間隔で取り出されます。デフォルト設定では、要求の優先順位はその要求が送られるサービス名に対応させて付けられます。サービス名にはシステムのコンフィグレーション時に優先順位を与えることができます (「UBBCONFIG(5)」参照)。特に定義されていない場合には、デフォルトの優先順位が使用されます。この優先順位は、tpcall(3c) に説明のあるルーチン (tpsprio()) を使用して実行時に設定することができます。呼び出し側はこの方法により、メッセージ送信時にコンフィグレーションまたはデフォルトの優先順位を変更できます。
会話型のコミュニケーションの場合、クライアントは、会話接続を行うことはできるが、接続要求を受け付けることはできないプログラムと定義されています。
一方、会話型サーバは、接続要求を受け取ることができるプログラムです。接続が確立され、サービス ルーチンが呼び出されると、以降、接続プログラムあるいは会話型サービスは、その接続が解除されるまでアプリケーションで定義されたようにデータの送受信を行えるようになります。会話は半二重方式で行われます。つまり、接続の一方の側が制御権をもってデータを送信し、他方の側は制御権を渡されるまではデータを送信できません。シングルスレッド サーバでは、接続中のサーバは「予約状態」になり、他のプログラムがそのサーバに接続することはできません。しかしマルチスレッド サーバに接続しても、そのサーバが 1 プロセスの専用サーバとして予約状態になることはなく、複数のクライアントのスレッドから要求を受け取ることができます。
要求/応答型サーバの場合と同様、会話型サーバは他の要求を出したり、他のサーバとの接続を行うことによりリクエスタとして機能できます。一方、要求/応答型サーバと異なり、会話型サーバは要求を別のサーバに転送することはできません。このため、会話型サーバによって実行される会話型サービスは、要求を受け取った時点で開始され、tpreturn() を介して最終的な応答が送信された時点で終了します。
接続が確立されると、その接続記述子から、参加プロセス (参加リソース) に関するアドレッシング情報を得るために必要なコンテキストが分かります。メッセージは、アプリケーション側の規定に従って送受信することができます。要求メッセージ応答メッセージとの間には本質的な相違はなく、またメッセージの優先順位に関する規定もありません。
会話モードの場合でも、要求/応答モードの場合でも、メッセージの送受信とは、アプリケーションの 2 つのユニット間のコミュニケーションを意味します。ほとんどの場合、メッセージによって応答または少なくとも承認が送られることになります。ですから、メッセージが確実に受信されたことが確認できます。しかし、メッセージ (システムが生成したメッセージやアプリケーションが生成したメッセージ) の中には、応答や承認を得ることができないものもあります。たとえば、システムは tpnotify() を TPACK() フラグなしで使用して非請求メッセージを送信でき、アプリケーションは tpacall() を TPNOREPLY() フラグ付きで使用して、メッセージを送信を行うことができます。受信プログラムのメッセージ キューがいっぱいになった場合は、メッセージは失われます。
送信側と受信側が別のマシンにある場合、コミュニケーションは、ネットワークでメッセージを送受信する BRIDGE プロセス間で行われます。回線異常により、配信失敗の可能性が生じます。このような状況によって、イベントの発生や ULOG メッセージの書き込みを行っても、このイベントや ULOG メッセージと失われたメッセージを結びつけることは容易ではありません。
Oracle Tuxedo ATMI システムの目的は広域ネットワークで大量のメッセージを処理することなので、前述のような小さな配信異常を検知して調整できるようにはプログラムされていません。このような理由から、すべてのメッセージを確実に配信できるという保証はありません。
tpsend() および tprecv() を使用してメッセージを交換する会話型モデルの場合、メッセージ ヘッダにシーケンス番号を付加し、送信された順番に受信します。サーバまたはクライアントが順序の誤ったメッセージを受け取ると会話が停止して、進行中のすべてのトランザクションはロールバックし、メッセージ LIBTUX 1572「会話型シーケンス番号が間違っています」がログに記録されます。
要求/応答モードでは、システムがメッセージを順序付けることはありません。アプリケーション ロジックが順番を付けた場合、アプリケーションがこのシーケンスをモニタし制御する責任があります。BRIDGE プロセス用の複数ネットワーク アドレスをサポートすることで実現する並列メッセージ送信を行うことにより、メッセージが送信順に受信されない可能性が高まります。関連するアプリケーションによって、各 BRIDGE プロセスで使用する単一ネットワークアドレスを指定することができ、またメッセージにシーケンス番号を付加したり、定期的な承認を要求したりすることもできます。
Oracle Tuxedo ATMI システムのキュー メッセージ モデルは、要求メッセージの完了を待たず、そのメッセージが後で処理されるようにキューに登録し、またオプションとしてキューに入れられた応答メッセージを介して応答が得られるようにします。メッセージをキューに登録したり応答をキューから取り出すための ATMI 関数は、tpenqueue() と tpdequeue() です。これらの関数は、Oracle Tuxedo ATMI システムのアプリケーション プロセスの全ての型 (クライアント、サーバ、会話型) のいずれのプロセスからも呼び出せます。キューに登録するアプリケーションもキューから取り出すアプリケーションも、サーバまたはクライアントとして指定されていない場合、関数 tpenqueue() と tpdequeue() をピア ツー ピア通信に使用することができます。
キュー メッセージ機能は、XA 準拠のリソース マネージャで提供されます。永続的なメッセージはトランザクション内でキューへの登録および取り出しが行われ、一度に処理されます。
Oracle Tuxedo ATMI システムは、トランザクションの定義および管理について、相互に排他的な 2 つの関数をサポートしています。Oracle Tuxedo システムの ATMI トランザクション境界関数 (名前の先頭が tp) と X/Open の TX インタフェース関数 (名前の先頭が tx_) です。X/Open では TX インタフェースのベースとして ATMI のトランザクション境界関数が使用されるので、TX インタフェースの構文およびセマンティクスは、ATMI とほとんど同じです。この項では、ATMI のトランザクション概念について概要を述べます。次の項では、TX インタフェースについて補足説明します。
Oracle Tuxedo ATMI システムにおけるトランザクションは、全体としてある結果を導く、あるいは何も結果を示さない 1 つの論理的な作業単位を定義するときに使用します。トランザクションにより、多くのプロセスによって (そして、おそらく様々な場所で) なされる作業を 1 つの作業単位として扱うことができます。トランザクションの開始者は tpbegin() および tpcommit() または tpabort() を使用してトランザクション内での操作内容を記述します。
開始プロセスはまた、tpsuspend() を呼び出して現在のトランザクションでの作業を中断することもできます。他のプロセスが tpresume() を呼び出して、中断されているトランザクションの開始プロセスの役割を引き継ぐこともできます。トランザクションの開始プロセスとして、プロセスは、tpsuspend()、tpcommit() または tpabort() のいずれかを呼び出す必要があります。したがって、あるプロセスがトランザクションを終了し、別のプロセスがトランザクションを開始することができます。
サービスを呼び出すプロセスがトランザクション モードにあると、呼び出されたサービス ルーチンも同じトランザクションのためにトランザクション モードに入ります。このプロセスがトランザクション モードでない場合、サービスがトランザクション モードで呼び出されるかどうかは、コンフィグレーション ファイルにおいて該当サービスにどのようなオプションが指定されているかによって決まります。トランザクション モードで呼び出されないサービスは、それが呼び出された時点から終了時点までの間に複数のトランザクションを定義できます。一方、トランザクション モードで呼び出されたサービス ルーチンは、1 つのトランザクションにのみ関与し、終了するまでそのトランザクションでの作業を続けます。なお、接続をトランザクション モードにアップグレードすることはできません。会話中に tpbegin() が呼び出されると、会話はそのトランザクションの外側で維持されます (tpconnect() が TPNOTRAN() フラグで呼び出された場合と同様)。
別のプロセスによって起動されたトランザクションに加わるサービスを、参加リソースと呼びます。トランザクションは常に、1 つの開始プロセスをもち、かついくつかの参加リソースをもつことができます。同じトランザクションでの作業を行うためにサービスを 2 回以上呼び出すことができます。tpcommit() あるいは tpabort() を呼び出すことができるのは、トランザクションの開始プロセスだけです (つまり、tpbegin() または tpresume() のいずれかを呼び出すプロセス)。参加リソースは、tpreturn() あるいは tpforward() を使用することによりトランザクションの結果に影響を与えます。これらの 2 つの呼び出しはそれぞれ、サービス ルーチンの終わり、およびそのルーチンがトランザクションの中で担当する部分を終了したことを示すものです。
TX インタフェースによって定義されるトランザクションは、ATMI 関数によって定義されるトランザクションと実質的に同じです。アプリケーション開発者は、クライアントとサービスのルーチンを作成する場合、どちらの関数も使用できますが、同一プロセス内に異なる関数を混在させることはできません。つまり、1 つのプロセスで tpbegin() を呼び出した後に tx_commit() を呼び出すことはできません。
TX インタフェースには、移植性の高い方法でリソース マネージャのオープンとクローズを行う 2 つの呼び出し tx_open() および tx_close() があります。トランザクションは、tx_begin() で開始され、tx_commit() または tx_rollback() のいずれかで完了します。tx_info() は、トランザクション情報を取り出す際に使用されます。また、トランザクションにオプションを設定する 3 つの呼び出し、tx_set_commit_return()、tx_set_transaction_control()、および tx_set_transaction_timeout() があります。TX インタフェースには、ATMI の tpsuspend() と tpresume() に相当するものはありません。
TX インタフェースには、ATMI トランザクションについて定義されているセマンティクスおよび規則の他にも、ここで説明しておくべきセマンティクスがいくつかあります。TX インタフェースを使用するサービス ルーチン開発者は、tpsvrinit() を呼び出す独自の tx_open() ルーチンを使用する必要があります。Oracle Tuxedo ATMI システムが提供するデフォルトの tpsvrinit() は、tpopen() を呼び出します。tpsvrdone() についても同じことがあてはまります。TX インタフェースを使用している場合は、サービス ルーチン開発者は、tx_close() を呼び出す独自の tpsvrdone() を使用しなければなりません。
次に、TX インタフェースには、ATMI にはない別のセマンティクスが 2 つあります。それは、連鎖および非連鎖トランザクションと、トランザクション特性です。
TX インタフェースは、トランザクション実行の連鎖モードおよび非連鎖モードをサポートしています。デフォルトでは、クライアント ルーチンおよびサービス ルーチンは、非連鎖モードで実行されます。この場合、アクティブなトランザクションが完了した際、新しいトランザクションは tx_begin() が呼び出されるまで開始されません。
連鎖モードでは、新しいトランザクションは、現在のトランザクションが完了すると、暗黙に開始されます。つまり、tx_commit() または tx_rollback() が呼び出されると、Oracle Tuxedo ATMI システムは、現在のトランザクションの完了を調整し、制御を呼び出し側に返す前に新しいトランザクションを開始します (異常終了の条件によっては、新しいトランザクションを開始できない場合もあります)。
クライアント ルーチンおよびサービス ルーチンは、tx_set_transaction_control() を呼び出すことによって連鎖モードのオンとオフを切り替えます。連鎖モードと非連鎖モードの間の遷移により、その次の tx_commit() 呼び出しまたは tx_rollback() 呼び出しの動作が変わります。tx_set_transaction_control() の呼び出しでは、呼び出し側のトランザクション モードのオンとオフの切り替えは行いません。
tx_close() は、呼び出し側がトランザクション モードにあるときには呼び出すことができないため、連鎖モードで実行中の呼び出し側が tx_close() を呼び出すには、非連鎖モードに切り替えて、現在のトランザクションを完了してから呼び出さなければなりません。
クライアント ルーチンまたはサービス ルーチンは、tx_info() を呼び出すことによって、そのルーチンのトランザクション特性の現在の値を取得したり、そのルーチンがトランザクション モードで実行中であるかどうかを判別したりすることができます。
アプリケーション プログラムの状態には、いくつかのトランザクション特性があります。呼び出し側は、tx_set_*() 関数の呼び出しによってこれらの特性を指定します。クライアント ルーチンまたはサービス ルーチンが特性の値を設定している場合は、異なる値を呼び出し側が指定するまでは、その値が有効のままです。呼び出し側が tx_info() を使用して特性の値を取得しても、これによって値が変更されることはありません。
多くの場合、ATMI 機能には 1 つまたは複数のエラー リターンがあります。エラーの条件は、エラーの他には考えられない戻り値で示されます。この値は通常、エラー時で -1、間違ったフィールド識別子 (BADFLDID) またはアドレスの場合 0 となります。エラー タイプは外部整数 tperrno でも参照することができます。正常な呼び出しによって tperrno がリセットされることはないので、エラーを検出した後にしか呼び出しのテストを行ってはいけません。
tpstrerror() 関数は標準エラー出力へのメッセージを生成します。この関数では 1 つの引数、つまり整数 (tperrno にセットされている) を必要とし、LIBTUX_CAT のエラー メッセージ テキストへのポインタを返します。このポインタは userlog() の引数として使用できます。
現行スレッドで最後の Oracle Tuxedo ATMI システム呼び出し時にエラーが発生した場合、エラーの詳細をさらに調べるには手順が 3 つあり、その第一段階として tperrordetail() を使用することができます。tperrordetail() は整数を返しますが、この整数は、エラーメッセージが含まれる文字列へのポインタを取り出す、tpstrerrordetail() の引数として使用します。ポインタは userlog または fprintf() の引数として使用できます。
エラーコードのうち、ATMI 関数で生成できるものについては、ATMI のマニュアル ページで説明しています。F_error() と F_error32() 関数は、FML エラーの標準エラー出力にメッセージを出力します。この関数は、パラメータを 1 つ (文字列) 取り、コロンと空白を付加してその引数文字列を出力します。次に、エラー メッセージとその後に続く復帰改行文字を出力します。表示されたエラー メッセージは Ferror() または Ferror32() で定義したエラー番号に対応しています。これらはエラーが発生した時点で設定されます。
エラー メッセージのテキストをメッセージ カタログから取り出す時、Fstrerror() およびこれに相当する Fstrerror32() を使用することができます。これらによって userlog の引数として使用できるポインタを返します。
エラー コードのうち、FML 機能で生成できるものについては、マニュアルの FML の項目で説明しています。
Oracle Tuxedo ATMI システムには 3 種類のタイムアウトがあります。1 つはトランザクションの開始から終了までの期間に関連するもの、2 つめはブロッキング コールで呼び出し側が制御権を再度入手するまでブロック状態を維持する最大時間に関連するものです。3 つめはサービスのタイムアウトです。これは呼び出しの秒数がコンフィグレーション ファイルの SERVICES セクションにおける SVCTIMEOUT パラメータで指定された秒数を越えた時に発生します。
最初のタイムアウトは、tpbegin() を使用してトランザクションを開始するときに指定します (詳細については、「tpbegin(3c)」を参照)。2 つ目のタイムアウトは、tpcall(3c) に定義されている Oracle Tuxedo ATMI システムのコミュニケーション ルーチンを使用する際に発生することがあります。これらのルーチンの呼び出し側は一般に、まだ届いていない応答を待っている間はブロック状態になります。これらの呼び出し側はデータの送信を行うこともブロックされることがあります (たとえば、要求キューがいっぱいの場合など)。呼び出し側がブロック状態になる最大時間は、Oracle Tuxedo ATMI システムのコンフィグレーション ファイルに記述されているパラメータによって決まります。詳細については、「UBBCONFIG(5)」の BLOCKTIME パラメータの項を参照してください。
ブロッキング タイムアウトは呼び出し側がトランザクション モードにないときにデフォルトの設定によって実行されます。クライアントあるいはサーバがトランザクション モードにあると、そのトランザクションが開始したときに指定されたタイムアウト値が働き、UBBCONFIG ファイルに指定されているブロッキング タイムアウト値の影響は受けません。
トランザクション タイムアウトが発生すると、トランザクション モードで行われた非同期の要求に対する応答は失効状態になることがあります。つまり、あるプロセスが、トランザクション モードで送信された要求に対する特定の非同期応答の到着を待っているときに、トランザクション タイムアウトが発生すると、その応答の記述子が無効になります。同様に、トランザクション タイムアウトが発生すると、そのトランザクションに関連付けられている記述子に対してイベントが生成され、その記述子は無効になります。一方、ブロッキング タイムアウトが発生した場合、該当する記述子は無効にならず、応答を待機しているプロセスはその応答を待機するための呼び出しを再度出すことができます。
サービス タイムアウト機構によって、未知の、または予期しないシステム エラーが原因でフリーズする可能性のあるプロセスについて、システムが強制終了を行うことができます。要求/応答サービス時にサービス タイムアウトが発生すると、Oracle Tuxedo ATMI システムによって、フリーズしたサービスを実行中のサーバ プロセスが強制終了され、エラーコード TPESVCERR が戻ります。サービス タイムアウトが会話型サービスで発生した場合は、TP_EVSVCERR イベントが返ります。
トランザクションがタイムアウトになった場合、そのトランザクションがアボートされる前の接続のうち、TPNOREPLY、TPNOTRAN、および TPNOBLOCK 付きの tpacall() への呼び出しのみが有効です。
リリース 6.4 から、TPESVCERR エラー コードに関する詳細が追加されました。タイムアウトのしきい値を超えたためにサービスが失敗した場合、イベント .SysServiceTimeout がポストされます。
デフォルトの設定では、サーバのサービスは、サーバのブート時に宣言され、サーバの停止時にその宣言が解除されます。サーバは、それが提供するサービス セットに対する制御を実行時に必要とする場合、tpadvertise() および tpunadvertise() を使用します。これらのルーチンは、該当サーバが複数サーバ、単一キュー (MSSQ) セットに属していないかぎり、呼び出し側サーバが提供するサービスだけに影響します。MSSQ セットのサーバはすべて同じサービス セットを提供しなければならないため、これらのルーチンもまた呼び出し側の MSSQ セットを共有するすべてのサーバの宣言に影響します。
プロセスはその生成当初、バッファをもちません。メッセージの送信前に tpalloc() を使用してバッファを割り当てなければなりません。送信元のデータはこの後、割り当てられたバッファに一旦入れた後、送信することができます。このバッファは特有の構造をもっています。この構造は、tpalloc() 関数に type 引数を付けて指定します。ある種の構造にはさらに分類が必要になるので、サブタイプも与えることができるようになっています (たとえば、特定タイプの C 構造体など)。
メッセージを受け取る際には、アプリケーション データを受け取ることができるバッファが必要です。このバッファは tpalloc() によって作成されたものでなければなりません。なお、Oracle Tuxedo ATMI システムのサーバはその main においてバッファを割り当てますが、このバッファのアドレスはサービス呼び出し時に要求/応答型サービスまたは会話型サービスに渡されます (このバッファの扱い方の詳細については、「tpservice(3c)」を参照)。
メッセージの受信に使用するバッファは、送信に使用するバッファとは扱い方が若干異なります。バッファの大きさとアドレスはメッセージの受信にともなって変わります。これは、システムが内部で受信コールに渡されたバッファを、バッファを処理するのに使用する内部バッファと交換するからです。バッファ サイズは、受信にともない増加することも減少することもあります。増加するか減少するかは、すべて送信側から送られたデータの量と、受信側が送信側からデータを受け取るために必要な内部データのフローによって決まります。バッファ サイズに影響を与える要素は数多くあり、圧縮、異なるマシン タイプからのメッセージの受信、使用されるバッファ タイプの postrecv() 関数のアクションなどが挙げられます (「buffer(3c)」を参照)。ワークステーション クライアントのバッファ サイズは、通常ネイティブ クライアントのバッファ サイズとは異なります。
受信バッファは、メッセージを受信する実際の容器というよりプレースホルダであると考えたほうがよいでしょう。システムは、渡したバッファ サイズをヒントとして使用することもあるので、バッファを予想される応答を入れられるだけの大きさにすることには意味があります。
送信側では、バッファ タイプは割り当てられた容量まで満たされないこともあります (たとえば、FML や STRING バッファは送信に使われただけの大きさです)。ひとつの整数フィールドを含む 100K の FML32 バッファは、その整数だけを含むより小さいバッファとして送られます。
これは、受信者が送信者の割り当てたバッファ サイズより小さく、送信されたデータのサイズより大きいバッファを受け取るということです。たとえば、10K バイトの STRING バッファが割り当てられ、文字列 "HELLO" がその中にコピーされた場合は、6 バイトのみが送られますが、受信者は 1K から 4K バイトのバッファを受け取ることになります (他の要素によりこれより大きかったり小さかったりします)。Oracle Tuxedo ATMI システムは、受信メッセージがすべての送信されたデータを含んでいることは保証しますが、すべてのフリー スペースまで保証するわけではありません。
応答を受信するプロセスは、バッファ サイズの変更を知らせ (tptypes() を使用します)、必要な場合は割り当てをやり直します。受信者のバッファ サイズを変える Oracle Tuxedo ATMI 関数はすべて、バッファ内のデータ量を返すので、応答を受信するたびにバッファ サイズを確認するのが標準になるでしょう。
メッセージの送受信には同じデータ バッファを使用することができます。また、それぞれのメッセージに対して別々のデータ バッファを割り当てることも可能です。通常は、呼び出しプロセスが tpfree() を使用してそのバッファを解放します。ただし、ごく限られたケースでは、Oracle Tuxedo ATMI システムが呼び出し側のバッファを解放します。バッファの使い方の詳細については、tpfree() などの通信関数の説明を参照してください。
tmtype_sw_t 構造体は、新しいバッファ タイプをプロセスのバッファ タイプ スイッチ tm_typesw() に追加するために必要とされる記述です。スイッチ要素は typesw(5) に定義されています。このエントリに使用される関数名は、Oracle Tuxedo ATMI システムまたは独自のバッファ タイプを作成するアプリケーションによって定義される実際の関数名のテンプレートとなります。これらの関数名は、簡単にスイッチ要素にマップできます。テンプレート名を作成するには、関数ポインタの要素名の最初に _tm を追加します。たとえば、要素 initbuf のテンプレート名は、_tminitbuf になります。
要素 type は NULL 以外とし、最大 8 文字とします。この要素がスイッチ内でユニークでない場合、subtype() は NULL 以外でなければなりません。
要素 subtype() には NULL、最大 16 文字の文字列、または * (ワイルドカード文字) のいずれかを使用できます。type() と subtype() の組み合わせは、スイッチ内でユニークに要素を指定するものでなければなりません。
1 つのタイプに対して、複数のサブタイプが存在してもかまいまいせん。すべてのサブタイプを特定のタイプに対して同じように扱う場合には、ワイルドカード文字 "*" を使用することができます。なお、サブタイプを区別する必要がある場合には、関数 tptypes() を使用して、バッファのタイプとサブタイプを弁別することができます。ある特定のタイプ内で一定のサブタイプのサブセットを個別に扱う必要があり、残りを同様に扱う場合には、特定の値でまとめるサブタイプは、ワイルドカードで指定する前にスイッチ内に指定しておく必要があります。このため、まずスイッチ内のタイプとサブタイプの検索が上から下の方向に行われ、ワイルドカードによるサブタイプのエントリは、残りの一致するタイプを受け付けることになります。
要素 dfltsize() は、バッファの割り当てまたは再割り当てを行うときに使用します。tpalloc() と tprealloc() の実行では、dfltsize() の値か、または tpalloc() および tprealloc() 関数の size パラメータ値の、どちらか大きい方の値を使用して、バッファの作成または再割り当てが行われます。固定サイズの C 構造体などの場合、バッファ サイズはその構造体と同じにするべきです。dfltsize() をこの値に設定すると、呼び出し側はバッファが渡されるルーチンに対してそのバッファ長を指定する必要はなくなります。dfltsize() は 0 あるいはそれ以下にすることができます。ただし、tpalloc() や tprealloc() を呼び出して、その size パラメータも 0 もしくはそれ以下であると、このルーチンは異常終了します。dfltsize() は 0 よりも大きい値に設定することをお勧めします。
Oracle Tuxedo ATMI システムには、5 つの基本バッファ タイプがあります。
上記のバッファ タイプの中の 2 つには、同等のタイプがあります。X_OCTET は CARRAY と同じであり、X_C_TYPE および X_COMMON は VIEW と同じです。X_C_TYPE は、VIEW がサポートするすべての要素をサポートします。これに対し、X_COMMON は、long、short、character のみをサポートします。X_COMMON は、C と COBOL の両方のプログラムがやりとりする際に、使用してください。
アプリケーションで独自のバッファ タイプを使用する場合には、tm_typesw() 配列にそのインスタンスを追加します。バッファ タイプを追加したり削除したりする場合は、配列の終わりに NULL エントリをそのまま残しておくようにしてください。ただし、NULL 名をもつバッファ タイプを使用することはできません。buildserver() または buildclient() コマンドラインに、-f オプションを用いてソースまたはオブジェクト ファイルを明示的に指定することにより、アプリケーション クライアントまたはサーバが、新しいバッファ タイプ スイッチにリンクされます。
上記のように定義されたクライアント/サーバ間でのやりとりの境界外からメッセージをアプリケーション クライアントに送る方法は 2 通りあります。第 1 の方法は、tpbroadcast() によって実現されるブロードキャスト機構です。この関数により、アプリケーション クライアント、サーバおよび管理者は割り当てられた名前に基づいて選択されるクライアントに型付きバッファ メッセージをブロードキャストすることができます。クライアントに割り当てられる名前は、一部はアプリケーションにより TPINIT 型付きバッファに tpinit() 実行時に渡される情報ごとに、また一部はクライアントがアプリケーションのアクセスに使用するプロセッサに基づいてシステムにより決められます。
もう 1 つの方法は、以前のあるいは現在のサービス要求から識別される特定クライアントによる通知方法です。各サービス要求には、そのサービス要求を出したクライアントを特定するユニークなクライアント識別子が含まれています。サービス ルーチン内で tpcall() や tpforward() が呼び出されても、そのサービス要求の連鎖に対応する元のクライアントは変更されません。クライアント識別子は保存しておき、アプリケーション サービス間で受け渡すことができます。この方法で特定されたクライアントに対する通知は、関数 tpnotify() を使用して行います。
Oracle Tuxedo ATMI システムでは、クライアント プログラムはプロセスごとに 1 つまたは複数のアプリケーションとの関連を作成することができます。TPINIT 構造体の flags フィールドに TPMULTICONTEXTS パラメータを指定して tpinit() が呼び出された場合は、複数のクライアント コンテキストを使用できます。tpinit() が暗黙的に呼び出された場合、NULL パラメータによって呼び出された場合、または flags フィールドに TPMULTICONTEXTS を指定せずに呼び出された場合は、1 つのアプリケーションとの関連しか作成できません。
シングルコンテキスト モードでは、tpinit() を 2 回以上呼び出す場合 (つまり、クライアントが既にアプリケーションに参加した後に呼び出す場合) は、何もアクションは実行されず、成功を示す戻り値が返されます。
マルチコンテキスト モードの場合、tpinit() の呼び出しのたびに新しいアプリケーション関連が作成されます。アプリケーションは、tpgetctxt() を呼び出すことによって、このアプリケーション関連を表すハンドルを取得することができます。同じプロセス内のどのスレッドも、tpsetctxt() を呼び出してスレッドのコンテキストを設定することができます。
いったんアプリケーションでシングルコンテキスト モードが選択された場合は、すべてのアプリケーション関連が終了するまで、すべての tpinit() 呼び出しでシングルコンテキスト モードを指定する必要があります。同様に、アプリケーションでマルチコンテキスト モードが選択された場合は、すべてのアプリケーション関連が終了するまで、すべての tpinit() 呼び出しでマルチコンテキスト モードを指定する必要があります。
サーバ プログラムは 1 つのアプリケーションとしか関連付けられないため、クライアントとして機能することはありません。ただし、各サーバ プログラム内に、複数のサーバ ディスパッチ コンテキストがある場合もあります。各サーバ ディスパッチ コンテキストは、それぞれのスレッド内で機能します。
表 2 は、クライアント プロセス内で発生する、非初期化状態、シングルコンテキスト モードで初期化された状態、およびマルチコンテキスト モードで初期化された状態の遷移を示しています。
マルチコンテキストのアプリケーションでは、いろいろな関数を呼び出すと、呼び出し側スレッド、および呼び出し側プロセスと同じコンテキストでアクティブなその他のスレッドのコンテキスト状態が変化します。次の図は、tpinit()、tpsetctxt()、および tpterm() 関数を呼び出した場合のコンテキスト状態の変化を示しています。tpgetctxt() 関数を呼び出しても、コンテキスト状態は変化しません。

| 注意 : | tpterm() がマルチコンテキスト状態 (TPMULTICONTEXTS) で実行しているスレッドによって呼び出されると、呼び出し側スレッドは NULL コンテキスト状態 (TPNULLCONTEXT) になります。終了するコンテキストに関連するその他すべてのスレッドは、無効コンテキスト状態 (TPINVALIDCONTEXT) に切り替わります。 |
表 3 は、tpinit()、tpsetctxt()、および tpterm() を呼び出した場合のコンテキスト状態の変化を示します。いずれの状態もスレッド固有のものであり、マルチコンテキストのアプリケーションの一部を構成するときは、スレッドごとに状態が異なります。一方、前掲の表 (「プロセスごとのコンテキスト モード」) に示されるコンテキスト状態は、それぞれプロセス全体に適用されます。
Oracle Tuxedo ATMI システムは、いくつかの方法でプログラミングされたマルチスレッド プログラミングをサポートしています。プロセスでシングルコンテキスト モードが使用されている場合に、アプリケーションで新しいスレッドが作成されると、これらのスレッドではそのプロセスの Oracle Tuxedo ATMI コンテキストを共有します。クライアントでは、あるスレッドがシングルコンテキスト モードで tpinit() 呼び出しを発行すると、他のスレッドは ATMI 呼び出しを発行します。たとえば、1 つのスレッドが tpacall() を発行すると、同じプロセス内の別のスレッドは tpgetrply() を発行します。
マルチコンテキスト モードの場合、最初のスレッドは Oracle Tuxedo ATMI アプリケーションに関連付けられません。スレッドは、tpsetctxt() を呼び出して既存のアプリケーション関連に参加するか、TPMULTICONTEXTS フラグを設定した tpinit() を呼び出して新しい関連を作成します。
シングルコンテキスト モードかマルチコンテキスト モードかに関わりなく、ATMI 操作が適切なタイミングで実行されるようにスレッドを調整するのは、アプリケーションの役目です。
アプリケーションは、OS スレッド関数を使って、アプリケーション サーバ内に追加スレッドを生成できます。これらの新しいスレッドは、Oracle Tuxedo ATMI システムから独立して動作できます。また、いずれかのサーバ ディスパッチ スレッドと同じコンテキストで動作することもできます。最初、アプリケーション生成サーバ スレッドは、どのサーバ ディスパッチ コンテキストにも関連していません。アプリケーションに作成されたサーバ スレッドは、tpsetctxt() を呼び出し、サーバ ディスパッチ スレッドとの関連を確立します。アプリケーションに作成されたサーバ スレッドは、ディスパッチされたスレッドが tpreturn() または tpforward() を呼び出す前に、すべての ATMI 呼び出しを終了していなければなりません。Oracle Tuxedo ATMI システムによってディスパッチされたサーバ スレッドは、tpsetctxt() を呼び出すことはできません。また、アプリケーション生成スレッドは、コンテキストと関連付けられていない場合、暗黙的に tpinit() を発生させる ATMI を呼び出すことができません。それに対して、ディスパッチャによって作成されたスレッドは、常にコンテキストと関連付けられているため、ATMI 呼び出しに失敗することはありません。すべてのサーバ スレッドで、tpinit() の呼び出しは禁止されています。
マルチスレッドのアプリケーションでは、TPINVALIDCONTEXT 状態で動作するスレッドが、多数の ATMI 関数を呼び出すことは禁止されています。次のリストは、このような環境で呼び出し可能な関数と呼び出し不可能な関数を示しています。
Oracle Tuxedo ATMI システムでは、TPINVALIDCONTEXT 状態で動作するスレッドは以下の関数を呼び出すことができます。
catgets(3c)catopen、catclose(3c)decimal(3c)gp_mktime(3c)nl_langinfo(3c)setlocale(3c)strerror(3c)strftime(3c)tpalloc(3c)tpconvert(3c)tpcryptpw(3c)tperrordetail(3c)tpfree(3c)tpgetctxt(3c)tpgetrepos(3c)tprealloc(3c)tpsetctxt(3c)tpstrerror(3c)tpstrerrordetail(3c)tpterm(3c)tptypes(3c)TRY(3c)tuxgetenv(3c)tuxputenv(3c)tuxreadenv(3c)userlog(3c)Usignal(3c)Uunix_err(3c)
Oracle Tuxedo ATMI システムでは、TPINVALIDCONTEXT 状態で動作するスレッドは以下の関数を呼び出すことができません。
AEWsetunsol(3c)tpabort(3c)tpacall(3c)tpadmcall(3c)tpbegin(3c)tpbroadcast(3c)tpcall(3c)tpcancel(3c)tpchkauth(3c)tpchkunsol(3c)tpclose(3c)tpcommit(3c)tpconnect(3c)tpdequeue(3c)tpenqueue(3c)tpgetadmkey(3c)tpgetlev(3c)tpgetrply(3c)tpgprio(3c)tpinit(3c)tpnotify(3c)tpopen(3c)tppost(3c)tprecv(3c)tpresume(3c)tpscmt(3c)tpsend(3c)tpsetunsol(3c)tpsprio(3c)tpsubscribe(3c)tpsuspend(3c)tpunsubscribe(3c)tx_begin(3c)tx_close(3c)tx_commit(3c)tx_info(3c)tx_open(3c)tx_rollback(3c)tx_set_commit_return(3c)tx_set_transaction_control(3c)tx_set_transaction_timeout(3c)
ルーチンは、次に挙げる戻り値とフラグの定義を使用します。異なるトランザクション モニタで変更や再コンパイルなしにアプリケーションを使用するためには、各システムで次に示すようにそのフラグと戻り値を定義しておかなければなりません。
/*
* 次の定義は atmi.h に含まれなければならない
*/
/* サービス ルーチンへのフラグ */
#define TPNOBLOCK 0x00000001 /* 非ブロック送信/受信 */
#define TPSIGRSTRT 0x00000002 /* 割り込み時受信再開 */
#define TPNOREPLY 0x00000004 /* 応答なしを想定 */
#define TPNOTRAN 0x00000008 /* トランザクション モードでは送信しない */
#define TPTRAN 0x00000010 /* トランザクション モードで送信 */
#define TPNOTIME 0x00000020 /* タイムアウトなし */
#define TPABSOLUTE 0x00000040 /* 絶対的な優先順位を指定 */
#define TPGETANY 0x00000080 /* 有効応答を取り込み */
#define TPNOCHANGE 0x00000100 /* 受信バッファのマッチング */
#define RESERVED_BIT1 0x00000200 /* 将来の使用のために予約 */
#define TPCONV 0x00000400 /* 会話型サービス */
#define TPSENDONLY 0x00000800 /* 送信専用モード */
#define TPRECVONLY 0x00001000 /* 受信専用モード */
#define TPACK 0x00002000 /* */
/* tpreturn() へのフラグ - xa.h にも定義されている */
#define TPFAIL 0x20000000 /* tpreturn に対するサービスの FAILURE */
#define TPEXIT 0x08000000 /* サービスの終了によるサービスの FAILURE */
#define TPSUCCESS 0x04000000 /* tpreturn に対するサービスの SUCCESS */
/* tpscmt() へのフラグ - 有効な TP_COMMIT_CONTROL
* 特性値
*/
#define TP_CMT_LOGGED 0x01 /* コミット決定を記録後、
* リターン */
#define TP_CMT_COMPLETE 0x02 /* コミット完了後、
* リターン */
/* クライアント識別子構造 */
struct clientid_t {
long clientdata[4]; /* 内部での使用のため予約 */
}
typedef struct clientid_t CLIENTID;
/* コンテキスト識別子構造 */
typedef long TPCONTEXT_T;
/* サービス ルーチンへのインタフェース */
struct tpsvcinfo {
name[32];
long flags; /* サービス属性の説明 */
char *data; /* データを指すポインタ */
long len; /* 要求データ長 */
int cd; /* (flagsTPCONV) が
* 真のとき接続記述子 */
long appkey; /* アプリケーション認証用のクライアント
* キー */
CLIENTID cltid; /* 発行元クライアント用の
* クライアント識別子 */
};
typedef struct tpsvcinfo TPSVCINFO;
/* tpinit(3) インタフェース構造 */
#define MAXTIDENT 30
struct tpinfo_t {
char usrname[MAXTIDENT+2]; /* クライアント ユーザ名 */
char cltname[MAXTIDENT+2]; /* アプリケーション クライアント名 */
char passwd[MAXTIDENT+2]; /* アプリケーション パスワード */
long flags; /* 初期化フラグ */
long datalen; /* アプリケーション固有のデータの長さ */
long data; /* アプリケーション データのプレースホルダ */
};
typedef struct tpinfo_t TPINIT;
/* tpsuspend(3) と tpresume(3) に渡されるトランザクション ID 構造体 */
struct tp_tranid_t {
long info[6]; /* 内部的に定義 */
};
typedef struct tp_tranid_t TPTRANID;
/* TPINIT のフラグ */
#define TPU_MASK 0x00000007 /* 非請求通知
* マスク */
#define TPU_SIG 0x00000001 /* シグナル ベース
* の通知 */
#define TPU_DIP 0x00000002 /* ディップ イン ベース
* の通知 */
#define TPU_IGN 0x00000004 /* 非請求
* メッセージを無視 */
#define TPU_THREAD 0x00000040 /* THREAD 通知 */
#define TPSA_FASTPATH 0x00000008 /* システム アクセス ==
* fastpath */
#define TPSA_PROTECTED 0x00000010 /* システム アクセス ==
* protected */
#define TPMULTICONTEXTS 0x00000020 /* 各プロセスの
* マルチ コンテキスト関連 */
/* /Q tpqctl_t データ構造体 */
#define TMQNAMELEN 15
#define TMMSGIDLEN 32
#define TMCORRIDLEN 32
struct tpqctl_t { /* キュー プリミティブの制御パラメータ */
long flags; /* どの値が設定されているかを指示 */
long deq_time; /* キューから取り出すときの絶対時間/相対時間 */
long priority; /* 登録優先順位 */
long diagnostic; /* 異常終了の原因 */
char msgid[TMMSGIDLEN]; /* 既存メッセージの ID (要求をそのメッセージの前に登録するため) */
char corrid[TMCORRIDLEN]; /* メッセージを識別するときに使用される相関識別子 */
char replyqueue[TMQNAMELEN+1]; /* 応答メッセージ用キューの名前 */
char failurequeue[TMQNAMELEN+1]; /* 異常終了メッセージ用キューの名前 */
CLIENTID cltid; /* 発信元クライアントの */
/* クライアント識別子 */
long urcode; /* アプリケーション ユーザ戻り値 */
long appkey; /* アプリケーション認証用のクライアント キー */
long delivery_qos; /* 配信サービスの品質 */
long reply_qos; /* 応答メッセージのサービス品質 */
long exp_time /* 有効期限 */
};
typedef struct tpqctl_t TPQCTL;
/* 有効な /Q 構造体要素 - フラグに設定 */
#ifndef TPNOFLAGS
#define TPNOFLAGS 0x00000 /* フラグの設定なし - 取得できない */
#endif
#define TPQCORRID 0x00001 /* 相関 id を設定/取得 */
#define TPQFAILUREQ 0x00002 /* 障害キューを設定/取得 */
#define TPQBEFOREMSGID 0x00004 /* メッセージ id の前にキューに登録 */
#define TPQGETBYMSGIDOLD 0x00008 /* 使用回避 */
#define TPQMSGID 0x00010 /* enq/deq メッセージの msgid を取得 */
#define TPQPRIORITY 0x00020 /* メッセージ優先順位を設定/取得 */
#define TPQTOP 0x00040 /* キューの先頭に登録 */
#define TPQWAIT 0x00080 /* キューからの解除を待機 */
#define TPQREPLYQ 0x00100 /* 応答キューを設定/取得 */
#define TPQTIME_ABS 0x00200 /* 絶対時間を設定 */
#define TPQTIME_REL 0x00400 /* 相対時間を設定 */
#define TPQGETBYCORRIDOLD 0x00800 /* 使用回避 */
#define TPQPEEK 0x01000 /* 非破壊的なキューからの取り出し */
#define TPQDELIVERYQOS 0x02000 /* 配信サービスの品質 */
#define TPQREPLYQOS 0x04000 /* 応答メッセージのサービス品質 */
#define TPQEXPTIME_ABS 0x08000 /* 絶対有効期限 */
#define TPQEXPTIME_REL 0x10000 /* 相対有効期限 */
#define TPQEXPTIME_NONE 0x20000 /* 有効期限なし */
#define TPQGETBYMSGID 0x40008 /* msgid によるキューからの取り出し */
#define TPQGETBYCORRID 0x80800 /* corrid によるキューからの取り出し */
/* TPQCTL 構造のサービス品質フィールドのための有効フラグ */
#define TPQQOSDEFAULTPERSIST 0x00001 /* キューのデフォルトの持続性 */
/* ポリシー */
#define TPQQOSPERSISTENT 0x00002 /* ディスク メッセージ */
#define TPQQOSNONPERSISTENT 0x00004 /* メモリ メッセージ */
/* エラー リターン コード */
extern int tperrno;
extern long tpurcode;
/* tperrno 値 - エラー コード */
* マニュアル ページで、下記のエラー コードが返される可能性のある
* コンテキストに関する説明がある。
*/
#define TPMINVAL 0 /* 最小のエラー メッセージ */
#define TPEABORT 1
#define TPEBADDESC 2
#define TPEBLOCK 3
#define TPEINVAL 4
#define TPELIMIT 5
#define TPENOENT 6
#define TPEOS 7
#define TPEPERM 8
#define TPEPROTO 9
#define TPESVCERR 10
#define TPESVCFAIL 11
#define TPESYSTEM 12
#define TPETIME 13
#define TPETRAN 14
#define TPGOTSIG 15
#define TPERMERR 16
#define TPEITYPE 17
#define TPEOTYPE 18
#define TPERELEASE 19
#define TPEHAZARD 20
#define TPEHEURISTIC 21
#define TPEEVENT 22
#define TPEMATCH 23
#define TPEDIAGNOSTIC 24
#define TPEMIB 25
#define TPMAXVAL 26 /* 最大のエラー メッセージ */
/* 会話 - イベント */
#define TPEV_DISCONIMM 0x0001
#define TPEV_SVCERR 0x0002
#define TPEV_SVCFAIL 0x0004
#define TPEV_SVCSUCC 0x0008
#define TPEV_SENDONLY 0x0020
/* /Q 診断コード */
#define QMEINVAL -1
#define QMEBADRMID -2
#define QMENOTOPEN -3
#define QMETRAN -4
#define QMEBADMSGID -5
#define QMESYSTEM -6
#define QMEOS -7
#define QMEABORTED -8
#define QMENOTA QMEABORTED
#define QMEPROTO -9
#define QMEBADQUEUE -10
#define QMENOMSG -11
#define QMEINUSE -12
#define QMENOSPACE -13
#define QMERELEASE -14
#define QMEINVHANDLE -15
#define QMESHARE -16
/* イベント ブローカ メッセージ */
#define TPEVSERVICE 0x00000001
#define TPEVQUEUE 0x00000002
#define TPEVTRAN 0x00000004
#define TPEVPERSIST 0x00000008
/* サブスクリプション制御構造 */
struct tpevctl_t {
long flags;
char name1[XATMI_SERVICE_NAME_LENGTH];
char name2[XATMI_SERVICE_NAME_LENGTH];
TPQCTL qctl;
};
typedef struct tpevctl_t TPEVCTL;
TX ルーチンは、次に挙げる戻り値とフラグの定義を使用します。異なるトランザクション モニタで変更や再コンパイルなしにアプリケーションを使用するためには、各システムで次に示すようにそのフラグと戻り値を定義しておかなければなりません。
#define TX_H_VERSION 0 /* このヘッダ ファイルの
* 現バージョン/
/*
* トランザクション識別子
*/
#define XIDDATASIZE 128 /* サイズ (バイト数) */
struct xid_t {
long formatID; /* 形式識別子 */
long gtrid_length; /* 64 以下の値 */
long bqual_length; /* 64 以下の値 */
char data[XIDDATASIZE];
};
typedef struct xid_t XID;
/*
* 形式識別子が -1 の場合は、XID が NULL であることを意味する
*/
/*
* tx_ ルーチンの定義
*/
/* commit の戻り値 */
typedef long COMMIT_RETURN;
#define TX_COMMIT_COMPLETED 0
#define TX_COMMIT_DECISION_LOGGED 1
/* トランザクション制御の値 */
typedef long TRANSACTION_CONTROL;
#define TX_UNCHAINED 0
#define TX_CHAINED 1
/* トランザクション タイムアウトのタイプ */
typedef long TRANSACTION_TIMEOUT;
/* トランザクションの状態値 */
typedef long TRANSACTION_STATE;
#define TX_ACTIVE 0
#define TX_TIMEOUT_ROLLBACK_ONLY 1
#define TX_ROLLBACK_ONLY 2
/* tx_info() で格納される構造体 */
struct tx_info_t {
XID xid;
COMMIT_RETURN when_return;
TRANSACTION_CONTROL transaction_control;
TRANSACTION_TIMEOUT transaction_timeout;
TRANSACTION_STATE transaction_state;
};
typedef struct tx_info_t TXINFO;
/*
* tx_() の戻り値
* (トランザクション マネージャがアプリケーションに報告する)
*/
#define TX_NOT_SUPPORTED 1 /* サポートされていないオプション */
#define TX_OK 0 /* 正常実行 */
#define TX_OUTSIDE -1 /* アプリケーションは、リソース マネージャの
* ローカル トランザクションにある */
#define TX_ROLLBACK -2 /* トランザクションが
* ロールバックされた */
#define TX_MIXED -3 /* トランザクションが
* 部分的にコミットされ、
* 部分的にロールバックされた*/
#define TX_HAZARD -4 /* トランザクションが
* 部分的にコミットされ、
* 部分的にロールバックされた可能性がある */
#define TX_PROTOCOL_ERROR -5 /* ルーチンが不適切な
* コンテキストで呼び出された */
#define TX_ERROR -6 /* 一時的なエラー */
#define TX_FAIL -7 /* 致命的なエラー */
#define TX_EINVAL -8 /* 無効な引数が指定された */
#define TX_COMMITTED -9 /* トランザクションが
* ヒューリスティックにコミットされた */
#define TX_NO_BEGIN -100 /* トランザクションがコミットされたことに加え、
* 新しいトランザクションが
* 開始できなかった */
#define TX_ROLLBACK_NO_BEGIN (TX_ROLLBACK+TX_NO_BEGIN)
/* トランザクションがロールバックされたことに加え、
* 新しいトランザクションが
* 開始できなかった */
#define TX_MIXED_NO_BEGIN (TX_MIXED+TX_NO_BEGIN)
/* 混合条件が発生したことに加え、
* 新しいトランザクションが開始できなかった */
#define TX_HAZARD_NO_BEGIN (TX_HAZARD+TX_NO_BEGIN)
/* ハザードがあることに加え、
* 新しいトランザクションが開始できなかった */
#define TX_COMMITTED_NO_BEGIN (TX_COMMITTED+TX_NO_BEGIN)
/* トランザクションがヒューリスティックにコミットされたことに加え、
* 新しいトランザクションが
* 開始できなかった */
Oracle Tuxedo ATMI システムは、各プロセスの状態を記録し、各種の関数呼び出しやオプションごとに正当な状態遷移が行われているかどうかを検証します。この状態情報には、プロセスのタイプ (要求/応答型サーバ、会話型サーバ、またはクライアント)、初期化状態 (初期化済み、非初期化)、リソースの管理状態 (クローズまたはオープン)、プロセスのトランザクション状態およびすべての非同期要求および接続記述子の状態などがあります。不正な状態遷移が行われようとすると、呼び出された関数は異常終了し、tperrno が TPEPROTO に設定されます。この情報に関する正規の状態と遷移について、次の表に示します。
表 4 は、要求/応答型サーバ、会話型サーバおよびクライアントがどの関数を呼び出すことができるかを示しています。ただし、tpsvrinit()、tpsvrdone()、tpsvrthrinit()、および tpsvrthrdone() はこの表には示してありません。これらの関数はアプリケーションが提供する関数ですが、アプリケーションからは呼び出されず、Oracle Tuxedo ATMI システムによって呼び出されます。
以下に示す表は、特に明記されていないかぎり、クライアントとサーバ両方に適用されます。なお、ある種の関数はクライアントとサーバの両方が呼び出せるとは限らないので (例: tpinit())、以下の状態遷移の中には両方のプロセス タイプには適用できないものがあります。上記の表を参照して、目的のプロセスから特定の関数を呼び出すことができるかどうかを判断するようにしてください。
次の表は、クライアント プロセスがトランザクション マネージャで初期化され登録されているかどうかを示しています。この表では、シングルコンテキスト モードのオプションとして tpinit() を使用するものとします。したがって、シングルコンテキストのクライアントは、多数の ATMI 関数の中のどれか (たとえば、tpconnect() または tpcall()) を発行することによって、暗黙的にアプリケーションを結合することができます。次のいずれかにあてはまる場合は、クライアントは tpinit() を使用しなければなりません。
tpinit(3c)」および「UBBCONFIG(5)」の SECURITY キーワードの説明を参照)tpinit(3c)」を参照)
サーバは tpsvrinit() 関数が呼び出される前に Oracle Tuxedo ATMI システムの main() によって初期化状態になり、tpsvrdone() 関数が返された後、Oracle Tuxedo ATMI システムの main() によって非初期化状態になります。なお、下記のすべての表において、関数がエラーを起こした場合、特に明記されていないかぎり、プログラムの状態は変わりません。
以降の表は、前提条件として状態が I1 であると想定しています (tpinit()、tpsetctxt()、または Oracle Tuxedo ATMI システムの main() を介してこの状態でプロセスが到着したかどうかに関わりなく)。
表 6 は、クライアントまたはサーバのプロセスに対応するリソース マネージャが初期化されているかいないかに応じて、そのプロセスの状態を示しています。
表 7 は、プロセスがトランザクションに対応しているかどうかに関してそのプロセスの状態を示したものです。サーバの場合、状態 T1 と T2 への遷位は、前提条件として状態 R1 を想定しています (たとえば、tpopen() はそれ以降 tpclose() または tpterm() への呼び出しがないものとして呼び出されています)。
表 8 は、tpacall() が返す 1 つの要求記述子の状態を示すものです。
| 注意 : | a この状態遷移は、記述子が呼び出し側のトランザクションに関連しない場合にのみ起こります。 |
| 注意 : | b この状態遷移は、記述子が呼び出し側のトランザクションに関連する場合にのみ起こります。 |
| 注意 : | c 記述子が呼び出し側のトランザクションに対応する場合、tpsuspend() はプロトコル エラーを返します。 |
表 9 は、tpconnect() が返す、あるいは TPSVCINFO 構造でサービス呼び出しを行うことによって得られる接続記述子の状態を示したものです。接続記述子をとらないプリミティブの場合、特に明記されていないかぎり、状態の変化はすべての接続記述子に適用されます。
| 注意 : | a プログラムがトランザクション モードにあり、かつ TPNOTRAN の指定がない場合は、接続はトランザクション モードになります。 |
| 注意 : | b TPTRAN が設定されている場合、接続はトランザクション モードになります。 |
| 注意 : | c 接続がトランザクション モードにない場合、状態は変化しません。 |
| 注意 : | d 接続がトランザクション モードの場合、tpsuspend() はプロトコル エラーを返します。 |
Oracle Tuxedo ATMI システムでは、プロセスが必ず TX 関数を正しい順序で呼び出すことが確認されます。不正の状態遷移が試行される (つまり、ブランクの遷移エントリの状態から呼び出しを行う) と、呼び出された関数は、TX_PROTOCOL_ERROR を返します。TX 関数の正当な状態と遷移を、表 10 に示します。異常終了を返す呼び出しの場合、この表で特に明記されていないかぎり、状態遷移は行われません。Oracle Tuxedo ATMI システムのクライアントまたはサーバはすべて、TX 関数を使用できます。
tx_open を正常に呼び出すまで、グローバル トランザクションを開始できません。transaction_control 特性は、TX_UNCHAINED です。transaction_control 特性は、TX_CHAINED です。transaction_control 特性は、TX_UNCHAINED です。transaction_control 特性は、TX_CHAINED です。TX_SET1 は、TX_OK、TX_ROLLBACK、TX_MIXED、TX_HAZARD、TX_COMMITTED のいずれかを表します。TX_ROLLBACK は tx_rollback() からは返されず、TX_COMMITTED は tx_commit() からは返されません。TX_SET2 は、TX_NO_BEGIN、TX_ROLLBACK_NO_BEGIN、TX_MIXED_NO_BEGIN、TX_HAZARD_NO_BEGIN、または TX_COMMITTED_NO_BEGIN のいずれかを表します。TX_ROLLBACK_NO_BEGIN は tx_rollback() からは返されず、TX_COMMITTED_NO_BEGIN は tx_commit() からは返されません。TX_FAIL は、いずれかの呼び出しから返された場合には、アプリケーション プログラムの状態は、上記の表では未定義の状態になります。tx_info() が、トランザクション状態情報に TX_ROLLBACK_ONLY または TX_TIMEOUT_ROLLBACK_ONLY を返した場合には、そのトランザクションは、「アボートのみ (ロールバックのみ)」とマークされ、アプリケーション プログラムが tx_commit() を呼び出したか tx_rollback() を呼び出したかに関係なく、ロールバック (アボート) されます。
buffer(3c)、tpadvertise(3c)、tpalloc(3c)、tpbegin(3c)、tpcall(3c)、tpconnect(3c)、tpgetctxt(3c)、tpinit(3c)、tpopen(3c)、tpservice(3c)、tpsetctxt(3c), tuxtypes(5)、typesw(5)
AEMsetblockinghook() - アプリケーション固有のブロッキング フック関数を確立
#include <atmi.h>
int AEMsetblockinghook(_TM_FARPROC)
AEMsetblockinghook() は、Mac のタスクで ATMI ネットワーキング ソフトウェアがブロッキング ATMI 呼び出しを実装するための新しい関数をインストールできる「Mac 対応 ATMI エクステンション」です。この関数には、インストールするブロッキング関数の関数アドレスへのポインタが必要です。
ATMI ブロッキング呼び出しを処理する、デフォルトの関数はすでに用意されています。AEMsetblockinghook() 関数によって、アプリケーションは、「ブロッキング」時にデフォルト関数の代わりに独自の関数を実行することができます。NULL ポインタを指定してこの関数を呼び出すと、ブロッキング フック関数はデフォルトの関数にリセットされます。
アプリケーションが ATMI ブロッキング操作を呼び出すと、ブロッキング操作が起動し、次の疑似コードで示すようなループが開始します。
for(;;) {
execute operation in non-blocking mode
if error
break;
if operation complete
break;
while(BlockingHook())
;
}
AEMsetblockinghook() は、以前にインストールされたブロッキング関数のプロシージャ インスタンスへのポインタを返します。AEMsetblockinghook() 関数を呼び出すアプリケーションまたはライブラリは、必要に応じて復元できるように、この戻り値を保存する必要があります。「ネスト」が重要でない場合は、アプリケーションは AEMsetblockinghook() によって返された値を廃棄し、最終的に AEMsetblockinghook (NULL) を使ってデフォルト メカニズムを復元することができます。AEMsetblockinghook() はエラー時には NULL を返し、tperrno を設定してエラー条件を示します。
異常終了時には、AEMsetblockinghook() は tperrno を次の値に設定します。
TPEPROTO]
このインタフェースは、Mac クライアントでのみサポートされています。
アプリケーションが tpterm(3c) を呼び出すと、ブロッキング関数はリセットされます。
AEOaddtypesw() - 実行時にユーザ定義のバッファ タイプをインストールまたはリプレース
#include <atmi.h>
#include <tmtypes.h>
int FAR PASCAL AEOaddtypesw(TMTYPESW *newtype)
AEOaddtypesw() は、OS/2 クライアントが実行時に、新しいユーザ定義のバッファ タイプをインストールするか、既存のユーザ定義のバッファ タイプをリプレースするための、「OS/2 の ATMI 拡張機能」です。この関数の引数は、インストールするバッファ タイプに関する情報を含む、TMTYPESW 構造体を指すポインタです。
type() と subtype() がすでにインストールされているバッファ タイプと一致する場合は、すべての情報が新しいバッファ タイプにリプレースされます。情報が type() フィールドおよび subtype() フィールドと一致しない場合は、Oracle Tuxedo ATMI システムによって登録された既存のバッファ タイプに、新しいバッファ タイプが追加されます。新しいバッファ タイプの場合は、呼び出し処理に含まれる WSH および他の Oracle Tuxedo ATMI システムのプロセスが新しいバッファ タイプで作成されているようにします。
TMTYPESW 配列内の関数ポインタは、EXPORTS セクションにあるアプリケーションのモジュール定義ファイルに表示されていなければなりません。
アプリケーションでは、Oracle Tuxedo ATMI システム定義のバッファ タイプのルーチンも使用できます。また、アプリケーションおよび Oracle Tuxedo ATMI システム バッファ ルーチンを、あるユーザ定義のバッファ タイプ内で混在させることができます。
AEOaddtypesw() は、正常終了時には、システム内のユーザ バッファ タイプの数を返します。異常終了時には -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、AEOaddtypesw() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPESYSTEM]
このインタフェースは、Windows クライアントでのみサポートされます。タイプ スイッチをインストールする場合は、Oracle Tuxedo ATMI システム タイプスイッチ DLL に追加することをお勧めします。詳細については、『Oracle Tuxedo アプリケーションの設定』を参照してください。
FAR PASCAL は、16 ビット OS/2 環境でのみ使用します。
#include <os2.h>
#include <atmi.h>
#include <tmtypes.h>
int FAR PASCAL Nfinit(char FAR *, long);
int (FAR PASCAL * lpFinit)(char FAR *, long);
int FAR PASCAL Nfreinit(char FAR *, long);
int (FAR PASCAL * lpFreinit)(char FAR *, long);
int FAR PASCAL Nfuninit(char FAR *, long);
int (FAR PASCAL * lpFuninit)(char FAR *, long);
TMTYPESW newtype =
{
“MYFML”, ““, 1024, NULL, NULL,
NULL, _fpresend, _fpostsend, _fpostrecv, _fencdec,
_froute
};
newtype.initbuf = Nfinit;
newtype.reinitbuf = Nfreinit;
newtype.uninitbuf = Nfuninit;
if(AEOaddtypesw(newtype) == -1) {
userlog(“AEOaddtypesw failed %s”, tpstrerror(tperrno));
}
int
FAR PASCAL
Nfinit(char FAR *ptr, long len)
{
......
return(1);
}
int
FAR PASCAL
Nfreinit(char FAR *ptr, long len)
{
......
return(1);
}
int
FAR PASCAL
Nfuninit(char FAR *ptr, long mdlen)
{
......
return(1);
}
; EXAMPLE.DEF file
NAME EXAMPLE
DESCRIPTION 'EXAMPLE for OS/2'
EXETYPE OS/2
EXPORTS
Nfinit
Nfreinit
Nfuninit
....
buildwsh(1)、buffer(3c)、typesw(5)
AEPisblocked() - 進行中のブロッキング呼び出しが存在するかどうかの確認
#include <atmi.h>
int far pascal AEPisblocked(void)
AEPisblocked() は、OS/2 プレゼンテーション マネージャ用拡張 ATMI 関数の 1 つです。この関数を使用することにより、OS/2 プレゼンテーション マネージャのタスクは、タスクの実行が前のブロッキング呼び出しの完了を待っている最中にあるかどうかを判断できます。
AEPisblocked() は、完了待ちのブロッキング関数が存在する場合は 1 を、それ以外の場合は 0 を返します。
このインタフェースは、OS/2 プレゼンテーション マネージャのクライアントにおいてのみサポートされます。
ATMI ブロッキング呼び出しは、アプリケーションから見ると「ブロック」しているように見えますが、OS/2 PM ATMI DLL は、プロセッサの制御権を放棄して他のアプリケーションが実行できるようにしなければなりません。このことは、ブロッキング呼び出しを発行したアプリケーションが、受信メッセージによって再入する可能性があることを意味します。このような場合は、AEPisblocked() 関数を使用すると、タスクが再入したのが未終了のブロッキング呼び出しの完了を待っている最中だったかどうかを確認できます。ATMI では、未終了の呼び出しが単一スレッド内に 2 つ以上存在することは禁止されているので、注意してください。
AEWsetunsol() - Oracle Tuxedo ATMI 任意イベントに対する Windows メッセージの掲示
#include <windows.h>
#include <atmi.h>
int far pascal AEWsetunsol(HWND hWnd, WORD wMsg)
Microsoft Windows のプログラミング環境によっては、Oracle Tuxedo ATMI システムの非請求メッセージを Windows イベント メッセージ キューに送った方がよい場合があります。
AEWsetunsol() は、どのウィンドウに通知を行うか (hWnd)、またどの Windows メッセージ タイプを掲示するか (wMsg) を制御します。Oracle Tuxedo ATMI の非請求メッセージが到達すると、Windows のメッセージが掲示されます。lParam() は Oracle Tuxedo ATMI システムのバッファ ポインタに設定されます。メッセージがなければ、ゼロに設定されます。lParam() がゼロでなければ、アプリケーションは tpfree() を呼び出し、バッファを解放する必要があります。
wMsg がゼロであれば、その後の非請求メッセージはログに入れられ、無視されます。
マルチスレッドのアプリケーションでは、TPINVALIDCONTEXT 状態のスレッドは、AEWsetunsol() 呼び出しを発行することはできません。
AEWsetunsol() は、エラー発生時には -1 を返し、エラー条件を示す tperrno を設定します。
異常終了時には、AEWsetunsol() は tperrno を次のいずれかの値に設定します。
[TPESYSTEM]
[TPEOS]
このインタフェースは、Microsoft Windows クライアントでしか利用できません。
Windows メッセージを掲示する AEWsetunsol() は、tpsetunsol() コールバック ルーチンと同時に起動することはできません。最後の tpsetunsol() 要求あるいは AEWsetunsol() 要求が、非請求メッセージを処理する方法を決定します。
buffer() - tmtype_sw_t における要素の意味
int /* 新しいデータ バッファの初期化 */
_tminitbuf(char *ptr, long len)
int /* 再割り当てされたデータ バッファ */
_tmreinitbuf(char *ptr, long len)
int /* 解放するデータ バッファの初期化解除 */
_tmuninitbuf(char *ptr, long len)
long /* 送信前のバッファの処理 */
_tmpresend(char *ptr, long dlen, long mdlen)
void /* 送信後のバッファの処理 */
_tmpostsend(char *ptr, long dlen, long mdlen)
long /* 受信後のバッファの処理 */
_tmpostrecv(char *ptr, long dlen, long mdlen)
long /* 伝送形式とバッファの間のエンコード/デコード */
_tmencdec(int op, char *encobj, long elen, char *obj, long olen)
int /* データに基づきルーティングのサーバ グループを決定 */
_tmroute(char *routing_name, char *service, char *data, long \ len, char *group)
int /* バッファのデータのブール式を評価 */
_tmfilter(char *ptr, long dlen, char *expr, long exprlen)
int /* 形式文字列に基づくバッファのデータの抽出 */
_tmformat(char *ptr, long dlen, char *fmt, char *result, long \ maxresult)
long /* 送信前、おそらくコピー生成前のバッファの処理 */
_tmpresend2(char *iptr, long ilen, long mdlen, char *optr, long olen, long *flags )
long /* マルチバイト コード セットのエンコードの変換 */
_tmconvmb(char *ibufp, long ilen, char *enc_name, char *obufp, long olen, long
*flags)
このマニュアル ページでは、tmtype_sw_t 構造体に定義されている要素とルーチンの意味について説明します。ここでの説明は、プロセスのバッファ タイプ スイッチ tm_typesw に新しいバッファ タイプを追加するときに必要になります。スイッチ要素は typesw(5) に定義されています。また、このエントリで使用されている関数名は、Oracle Tuxedo ATMI システムによって定義されている実際の関数名、および独自のバッファ タイプを追加するアプリケーションで定義されている関数名のテンプレートです。これらの名前は、非常に簡単にスイッチ要素に対応付けられます。テンプレート名は、各関数ポインタの要素名とその前に付く _tm で構成されます (たとえば、要素 initbuf の関数名は _tminitbuf() になります)。
要素 type は NULL 以外とし、最大 8 文字でなければなりません。また、要素 subtype には NULL、最大 16 文字の文字列、またはワイルドカード文字 "*" を指定できます。type がスイッチ内でユニークでない場合、subtype を使用しなければなりません。type と subtype の組み合わせは、スイッチ内でユニークに要素を指定するものでなければなりません。
1 つのタイプに対して、複数のサブタイプが存在してもかまいまいせん。すべてのサブタイプを特定のタイプに対して同じように扱う場合には、ワイルドカード文字 "*" を使用することができます。ただし、サブタイプを区別する必要がある場合には、関数 tptypes() を使用して、バッファのタイプとサブタイプを弁別できます。ある特定のタイプ内で一定のサブタイプのサブセットを個別に扱う必要があり、残りを同様に扱う場合には、特定の値でまとめるサブタイプはそのサブタイプをワイルドカードで指定する前にスイッチ内に指定しておく必要があります。このため、まずスイッチ内のタイプとサブタイプの検索が上から下の方向に行われ、ワイルドカードによるサブタイプのエントリは、残りの一致するタイプを受け付けることになります。
要素 dfltsize() は、バッファの割り当てまたは再割り当てを行うときに使用します。tpalloc() と tprealloc() は、dfltsize() およびこれらのルーチンの size パラメータのうち大きい方を使用してバッファの作成または再割り当てを行うことを意味します。固定サイズの C 構造体などの場合、バッファ サイズはその構造体と同じにするべきです。dfltsize() をこの値に設定すると、呼び出し側はバッファが渡されるルーチンに対してそのバッファの長さを指定する必要はなくなります。dfltsize() は 0 あるいはそれ以下にすることができます。ただし、tpalloc() や tprealloc() を呼び出して、その size パラメータも 0 もしくはそれ以下であると、このルーチンは異常終了します。このため、dfltsize() を 0 以下の値に設定することはお勧めできません。
以下に指定する関数の名前は、Oracle Tuxedo ATMI システム内で使用されるテンプレート名です。新しいルーチンをバッファ タイプ スイッチに追加するアプリケーションは、そのアプリケーションあるいはライブラリ ルーチンが提供する実際の関数に対応する名前を使用しなければなりません。NULL 関数ポインタがバッファ タイプ スイッチ エントリに格納されている場合、Oracle Tuxedo ATMI システムは正しい数と引数タイプをとり、デフォルトの値を返すデフォルト関数を呼び出します。
_tminitbuf() は、バッファの割り当て後、tpalloc() の中から呼び出されます。_tminitbuf() は新しいバッファを指すポインタ ptr とそのサイズを渡されるので、適切にバッファを初期化することができます。len は tpalloc() に渡されるより大きな長さであり、かつそのタイプのスイッチ エントリに dfltsize() で指定されるデフォルト値です。なお、ptr は、tpalloc() と tprealloc() の意味合いから NULL には決してなりません。正常終了すると、ptr が tpalloc() の呼び出し側に返されます。
複数のサブタイプの処理に 1 つのスイッチ エントリを使用する場合、_tminitbuf() の作成者は tptypes() を使用してそのサブタイプを特定することができます。
バッファを初期化しなおす必要がない場合には、NULL 関数ポインタを使用します。
正常終了の場合、_tminitbuf() は 1 を返します。異常終了の場合には、-1 を返し、これによって tpalloc() も異常終了を示す tperrno を TPESYSTEM に返します。
_tmreinitbuf() はほとんど _tminitbuf() と同様に働きます。ただし、この関数は再割り当てされたバッファを初期化しなおすときに使用します。このルーチンは、バッファの再割り当ての後、tprealloc() の中から呼び出されます。
バッファを初期化しなおす必要がない場合には、NULL 関数ポインタを使用します。
正常終了の場合、_tmreinitbuf() は 1 を返します。異常終了の場合には、-1 を返し、これにより tprealloc() も異常終了を示す tperrno を TPESYSTEM に返します。
_tmuninitbuf() は、データ バッファの解放前に tpfree() から呼び出されます。_tmuninitbuf() には、データ バッファのアプリケーション部分を指すポインタとそのサイズが渡されるので、これを使用してそのバッファに関連する構造体や状態情報を消去することができます。ptr は、tpfree() のもつ意味合いから決して NULL にはなりません。ただし、_tmuninitbuf() でバッファ自体を解放しないようにしてください。tpfree() 関数は、データ バッファのすべての FLD_PTR フィールドで自動的に呼び出されます。
バッファを解放する前に何も処理が必要とされない場合には、NULL 関数ポインタを使用してください。
正常終了の場合、_tmuninitbuf() は 1 を返します。異常終了の場合には、-1 が返され、tpfree() はログ メッセージを出力します。
_tmpresend() は、tpcall()、tpacall()、tpconnect()、tpsend()、tpbroadcast()、tpnotify()、tpreturn()、あるいは tpforward() でバッファが送られる前に呼び出されます。また、_tmroute() の後 (ただし _tmencdec() の前) にも呼び出されます。ptr() が NULL でない場合、このルーチンにより、バッファの送信前にバッファに対する前処理を行うことができます。_tmpresend() の最初の引数 ptr は、送信呼び出しに渡されるアプリケーション データ バッファです。2 番目の引数 dlen は、送信呼び出しに渡されるデータの長さです。また、3 番目の引数 mdlen は、データがおかれるバッファの実際の長さです。
この関数に関する重要な条件の 1 つは、関数が返るときに、ptr が指すデータが「そのまま」送られるようにすることです。つまり、_tmencdec() が呼び出されるのはバッファが異なるマシンに送られる場合だけであるので、_tmpresend() は戻る際に、ptr が指すバッファのどの要素も、そのバッファに隣接しないデータを指すポインタとならないようにしなければならないのです。
データに対して前処理が必要なく、呼び出し側が指定したデータ量が送信すべきデータ量と同じ場合、NULL 関数ポインタを使用します。デフォルトのルーチンは dlen を返し、バッファに対して何もしません。
_tmpresend2() が NULL 以外の場合、_tmpresend() は呼び出されず、代わりに _tmpresend2() が呼び出されます。
正常終了の場合、_tmpresend() は送信するデータ量を返します。異常終了の場合には、-1 を返し、_tmpresend() の呼び出し側も異常終了を示す tperrno を TPESYSTEM に返します。
_tmpostsend() は、tpcall()、tpbroadcast()、tpnotify()、tpacall()、tpconnect()、または tpsend() でバッファが送信された後呼び出されます。このルーチンにより、バッファの送信後、関数が戻る前にバッファに対して後処理を行うことができます。送信呼び出しに渡されるバッファは戻り時に異なっていてはならないので、_tmpostsend() を呼び出して、_tmpresend() によってなされたバッファへの変更を修復します。この関数の最初の引数 ptr は、_tmpresend() の実行結果として送信されたデータを指すポインタです。2 番目の引数 dlen は、_tmpresend() から返されるデータの長さです。3 番目の引数 mdlen は、データがおかれるバッファの実際の長さです。このルーチンは、ptr が NULL 以外の場合にのみ呼び出されます。
後処理が必要ない場合には、NULL 関数ポインタを指定します。
_tmpostrecv() は、バッファを受信した後、おそらく tpgetrply()、tpcall()、tprecv()、あるいは Oracle Tuxedo ATMI システムのサーバ用の関数でデコードされた後、アプリケーションに返される前に呼び出されます。ptr が NULL でない場合は、_tmpostrecv() により、バッファが受信された後、アプリケーションに渡される前にそのバッファに対して後処理を行うことができます。最初の引数 ptr は、受信したバッファのデータ部分を指すポインタです。2 番目の引数 dlen は、_tmpostrecv() に入るデータのサイズを指定します。また、3 番目の引数 mdlen は、データがおかれるバッファの実際のサイズです。
_tmpostrecv() が後処理でデータ長を変更した場合は、新しいデータ長を返す必要があります。返される長さは、使用された呼び出しに基づく方法でアプリケーションに渡されます (たとえば、tpcall() は呼び出し側が戻り時にチェックする引数の 1 つにデータ長を設定します)。
後処理が成功するには、バッファの大きさが十分でない可能性があります。容量がさらに必要な場合、_tmpostrecv() は望ましいバッファ サイズの負の絶対値を返します。次いで呼び出しルーチンはバッファの大きさを変更し、_tmpostrecv() を再度呼び出します。
データに対して後処理が不要で、受け取ったデータ量がアプリケーションに返されるデータ量と同じであれば、NULL 関数ポインタを使用します。デフォルトのルーチンは dlen を返し、バッファに対して何もしません。
正常終了の場合、_tmpostrecv() は、そのバッファが対応する受信呼び出しから渡されるときにアプリケーションが知っているべきデータの長さを返します。異常終了の場合、-1 を返し、_tmpostrecv() の呼び出し側も異常終了を示す tperrno を TPESYSTEM に返します。
_tmencdec() は、異なるデータ表現を使用するマシン間でネットワークを介してバッファを送受信するときにエンコード/デコードを行うために使用します。Oracle Tuxedo ATMI システムでは、XDR の使用が推奨されていますが、このルーチンの意味合いに則っていればどのようなエンコード/デコード方式をとってもかまいません。
この関数は tpcall()、tpacall()、tpbroadcast()、tpnotify()、tpconnect()、tpsend()、tpreturn()、または tpforward() によって呼び出され、呼び出し側のバッファをエンコードします。ただし、この関数は異なるマシンにバッファを送るときにのみ呼び出します。これらの呼び出しの中で、_tmencdec() は _tmroute() と _tmpresend() の後で呼び出されます。ここで、_tmencdec() に渡されるバッファには、そのバッファに隣接しないデータを指すポインタが含まれない、という _tmpresend() の説明を思い出してください。
受信側では、tprecv()、tpgetrply()、tpcall() の受信側、およびサーバ用の関数はすべて _tmencdec() を呼び出して、異なるマシンからバッファを受け取った後、_tmpostrecv() を呼び出す前にこのバッファをデコードします。
_tmencdec() の最初の引数 op は、この関数がデータのエンコードまたはデコードのいずれを行うかを指定します。op には TMENCODE または TMDECODE のいずれかを指定します。
op に TMENCODE を指定すると、encobj は Oracle Tuxedo ATMI システムによって割り当てられたバッファを指します (このバッファにデータのエンコード版が複写されます)。非エンコード データは obj におかれます。つまり、op が TMENCODE であると、_tmencdec() は obj をそのエンコード形式に変換し、結果を encobj に入れます。encobj が指すバッファのサイズは elen によって指定され、obj によって示されるバッファの長さ (olen) の少なくとも 4 倍です。olen は、_tmpresend によって返される長さです。_tmencdec() は、エンコードされたデータの長さを encobj (つまり、実際に送信するデータ量) で返します。_tmencdec() は、この関数に渡されるバッファのいずれも解放しないものとします。
op に TMDECODE を指定すると、encobj は Oracle Tuxedo ATMI システムによって割り当てられたバッファを指します (このバッファにデータのエンコード版がおかれます)。バッファの長さは elen です。obj は、encobj が指すバッファ (ここにデコードされたデータが複写されます) と少なくとも同じサイズを持つバッファのポインタです。obj の長さは、olen です。obj はアプリケーションによって最終的に返されるバッファであるため、Oracle Tuxedo ATMI システムは _tmencdec() を呼び出す前に、デコード データを収めるのに十分な大きさになるようこのバッファのサイズを大きくすることができます。_tmencdec() は、デコード データのサイズを obj に返します。_tmencdec() が戻ると、_tmpostrecv() がその最初の引数として obj、2 番目の引数として _tmencdec() の戻り値、そして 3 番目の引数として olen をとって呼び出されます。_tmencdec() は、この関数に渡されるバッファのいずれも解放しないものとします。
_tmencdec() は、NULL 以外のデータをエンコードあるいはデコードする必要がある場合にのみ呼び出されます。
異なるマシンがネットワーク上に存在する場合でもデータにデコードあるいはエンコードを行う必要がない場合には、NULL 関数ポインタを使用します。このルーチンは olen (op は TMENCODE と同じ) あるいは elen (op は TMDECODE と同じ) のいずれかを返します。
正常終了の場合、_tmencdec() は、上述のように負でないバッファ長を返します。異常終了の場合、-1 を返し、_tmencdec() の呼び出し側も異常終了を示す tperrno を TPESYSTEM に返します。
メッセージは、デフォルトの設定では、要求されたサービスを提供する任意のサーバ グループにルーティングされます。UBBCONFIG ファイルに記述する各サービス エントリでは、ROUTING パラメータを使用して該当サービスのルーティング基準の論理名を指定することができます。複数のサービスが同じルーティング基準を共有することができます。あるサービスがルーティング基準名を指定されている場合、_tmroute() を使用して、メッセージ中のデータに基づいてそのメッセージが送信されるサーバ グループを判別します。データとサーバ グループのこの対応付け方法を、「データ依存型ルーティング」と呼んでいます。_tmroute() の呼び出しは、バッファの送信前 (そして、_tmpresend() と _tmencdec() が呼び出される前) に tpcall()、tpacall()、tpconnect()、および tpforward() で行います。
routing_name は、ルーティング基準の論理名 (UBBCONFIG ファイルに指定されている) であり、データ依存ルーティングを必要とするサービスと関連付けられています。service は、要求の対象となるサービスの名前です。パラメータ data は、要求で送出されるデータを指し、len はそのデータの長さです。ここで説明している他のルーチンと異なり、_tmroute() は ptr が NULL の場合でも呼び出されます。group パラメータは、要求の送り先になるグループの名前を返すときに使用します。このグループ名は、UBBCONFIG ファイルに記述されているグループ名の 1 つ (および、そのグループが選択されたときにアクティブであったグループ名) と一致していなければなりません。要求を指定サービスを提供する任意のサーバに送ることができる場合、group を NULL 文字列に設定し、この関数が 1 を返すようにしてください。
データ依存ルーティングが該当バッファ タイプに必要とされない場合には、NULL 関数ポインタを使用してください。このルーチンは group を NULL 文字列に設定し、1 を返します。
正常終了の場合、_tmroute() は 1 を返します。異常終了の場合、-1 を返し、_tmroute() の呼び出し側も異常終了を返します。これにより、tperrno が TPESYSTEM にセットされます。サーバあるいはサービスが利用できないために _tmroute() が異常終了した場合は、tperrno は TPENOENT にセットされます。
group が無効なサーバ グループの名前に設定されると、_tmroute() を呼び出す関数はエラーを返し、tperrno を TPESYSTEM に設定します。
_tmfilter() は、tppost() によってポストされたバッファの内容を分析するためにイベント ブローカ サーバによって呼び出されます。サブスクライバ (tpsubscribe()) が提供した式がバッファの内容を基に評価されます。式が真の場合、_tmfilter() は 1 を返し、イベント ブローカはサブスクライバへの通知処理を実行します。_tmfilter() が 0 を返した場合は、イベント ブローカはこのポストをサブスクリプションの「一致」とみなしません。
exprlen が -1 の場合、expr は NULL で終わる文字列とみなされます。それ以外の場合、expr は exprlen バイトのバイナリ データとみなされます。exprlen が 0 の場合は、式がないことを示します。
フィルタリングがこのバッファ タイプに適用しない場合は、NULL 関数ポインタを指定します。デフォルトのルーチンは、式がないか、expr が空の NULL で終わる文字列の場合は 1 を返します。それ以外の場合、デフォルトのルーチンは 0 を返します。
_tmformat() は、fmt という形式指定に従って、バッファのデータを表示可能な文字列に変換するためにイベント ブローカ サーバによって呼び出されます。イベント ブローカは、userlog または system 通知処理の入力のためにポストされたバッファを文字列に変換します。
出力は、result が指すメモリの位置に文字列として格納されます。result には、終端 NULL 文字を含めて最大 maxresult バイト書き込まれます。result の大きさが十分でない場合は、_tmformat() は出力を切り捨てます。出力文字列は、必ず NULL で終わります。
正常終了の場合、_tmformat() は負でない整数を返します。1 は正常終了、2 は出力文字列が切り捨てられたことを示します。異常終了の場合、-1 を返し、result に空の文字列を格納します。
形式設定がこのバッファ タイプに適用しない場合は、NULL 関数ポインタを指定します。デフォルトのルーチンが後を引き継ぎ、result に空の文字列を返します。
_tmpresend2() は、tpcall()、tpacall()、tpconnect()、tpsend()、tpbroadcast()、tpnotify()、tpreturn()、および tpforward() でバッファが送られる前に呼び出されます。また、_tmroute() の後 (ただし _tmencdec() の前) にも呼び出されます。iptr が NULL 以外の場合、このルーチンにより、バッファの送信前に、バッファに対する前処理を行うことができます。
_tmpresend2() の最初の引数 iptr は、送信呼び出しに渡されるアプリケーション データ バッファです。2 番目の引数 ilen は、送信呼び出しに渡されるデータの長さです。3 番目の引数 mdlen は、データがおかれるバッファの実際の長さです。
_tmpresend() とは異なり、_tmpresend2() は必要な処理がすべて終了した後で、ポインタ optr を受信し、これを使って iptr のデータを置くバッファを指すポインタを渡します。このポインタを使用するのは、入力バッファを修正する代わりに、_tmpresend2() が修正したデータに新しいバッファを使用する場合です。5 番目の引数 olen は、optr バッファのサイズです。6 番目の引数 flags は、処理されるバッファが親バッファ (送信先バッファ) かどうかを _tmpresend2() に通知します。_tmpresend2() は flags 引数を返して、処理結果を示します。
optr バッファの大きさが不十分で、後処理ができない場合があります。容量がさらに必要な場合、_tmpresend2() は必要なバッファ サイズの負の絶対値を返します。optr バッファの olen バイトはすべて維持されます。次に呼び出しルーチンがバッファの大きさを変更し、_tmpresend2() を再度呼び出します。
データに対して後処理が不要で、受け取ったデータ量がアプリケーションに返されるデータ量と同じであれば、NULL 関数ポインタを使用します。デフォルトのルーチンは ilen を返し、バッファに対して何もしません。
以下は、_tmpresend2() に入力可能なフラグです。
TMPARENT]
flags で返されるフラグは、_tmpresend2() の結果を示します。可能な値は次のとおりです。
TMUSEIPTR]
TMUSEOPTR]
TMUSEOPTR が返された場合、メッセージ伝送後の処理が _tmpresend() の処理とは異なります。つまり、iptr バッファは変更されず、_tmpostsend() は呼び出されません。TMUSEIPTR が返された場合、_tmpostsend() で呼び出されるように _tmpresend() が呼び出されます。optr バッファの割り当てと、解放またはキャッシュは、呼び出し側が行います。
型付きバッファにこの方法を用いるのは、次のような理由によります。
_tmpresend2() 関数は、関数が返るときに、バッファ内の送信データをそのまま送信できるようにします。_tmencdec() は類似しないマシンにバッファが送信される場合にだけ呼び出されるため、_tmpresend2() は、すべてのデータが送信されるバッファ内に隣接して保存されるようにします。
データに対する前処理が不要で、呼び出し側が指定したデータ量が送信すべきデータ量と同じ場合、バッファ タイプ スイッチの _tmpresend2() に NULL の関数ポインタを指定します。_tmpresend2() が NULL の場合、デフォルト設定によって _tmpresend() が呼び出されます。
正常終了時には、_tmpresend2() は送信するデータ量を返します。より大きなバッファが必要な場合は、必要なバッファ サイズの負の絶対値を返します。異常終了時には -1 を返し、これによって _tmpresend2() の呼び出し側も異常終了を返して tperrno を TPESYSTEM に設定します。
_tmconvmb() は、tmpostrecv() がマルチバイト データをソースのエンコードから対象のエンコードに変換した後に呼び出されます。_tmconvmb() の最初の引数 ibufp は、変換するバイトのストリーム (マルチバイト データ) を指すポインタです。2 番目の引数 ilen は、ibufp 内のバイト数です。3 番目の引数 enc_name は、処理で使用するいずれかのエンコード名です。MBSTRING バッファの場合、この引数は対象のエンコード名になります。FML32 バッファの場合、この引数はソースのエンコード名になります。
_tmconvmb() は、必要なコード セットのエンコードの変換がすべて終了した後で、ポインタ obufp を受信し、これを使って ibufp のデータを置くバッファを指すポインタを渡します。このポインタを使用するのは、入力ポインタを修正する代わりに、_tmconvmb() が変換したデータに新しいバッファを使用する場合です。5 番目の引数 olen は、obufp バッファのサイズです。_tmconvmb() は flags 引数を返して、処理結果を示します。
obufp バッファのサイズが不十分で、後処理ができない場合があります。容量がさらに必要な場合、_tmconvmb() は必要なバッファ サイズの負の絶対値を返します。ibufp バッファの ilen バイトはすべて維持されます。次に呼び出しルーチンがバッファの大きさを変更し、_tmconvmb() を再度呼び出します。
データのコード セットのエンコード変換が必要ない場合、送信側のプロセスのエンコード名と受信側のプロセスのエンコード名が同じ場合は、NULL 関数ポインタを指定します。デフォルトのルーチンは ilen を返し、バッファに対して変換を行いません。コード セットのエンコードの変換方法が不明の場合、この関数は -1 を返します。
flags で返される値は、_tmconvmb() の結果を示します。可能な値は次のとおりです。
TMUSEIPTR]
TMUSEOPTR]
_tmconvmb() が成功しました。処理されたデータは obufp が参照するバッファ内にあり、戻り値には変換されたデータの長さが含まれます。obufp バッファの割り当てと、解放またはキャッシュは、呼び出し側が行います。
正常終了時には、_tmconvmb() は、コード セットのエンコードの変換が行われたデータ バッファの大きさを返します。より大きなバッファが必要な場合は、必要なバッファ サイズの負の絶対値を返します。異常終了時には -1 を返し、これによって _tmconvmb() の呼び出し側も異常終了を返して tperrno を TPESYSTEM に設定します。
tpacall(3c)、tpalloc(3c)、tpcall(3c)、tpconnect(3c)、tpdiscon(3c)、tpfree(3c)、tpgetrply(3c)、tpgprio(3c)、tprealloc(3c)、tprecv(3c)、tpsend(3c)、tpsprio(3c)、tptypes(3c)、tuxtypes(5)
#include <nl_types.h>
char *catgets (nl_catd catd, int set_num, int msg_num, char *s)
catgets() は、セット set_num 内のメッセージ msg_num を、catd で指定されたメッセージ カタログから読み取ります。catd は、先に呼び出された catopen() から返されたカタログ記述子です。s は、デフォルトのメッセージ文字列を指すポインタであり、指定されたメッセージ カタログが現在利用できない場合に、catgets() から返されます。
マルチスレッドのアプリケーションのスレッドは、TPINVALIDCONTEXT を含むどんなコンテキスト状態でも、catgets() を呼び出すことができます。
指定されたメッセージが正常に取り出されると、catgets() は NULL で終了するメッセージ文字列を収める内部バッファ領域を指すポインタを返します。catd によって指定されているメッセージ カタログがその時点で利用できないために呼び出しが異常終了した場合には、s を指すポインタが返されます。
catopen()、catclose() - メッセージ カタログのオープン/クローズ
#include <nl_types.h>
nl_catd catopen (char *name, int oflag)
int catclose (nl_catd catd)
catopen() はメッセージ カタログをオープンし、カタログ記述子を返します。name は開くメッセージ カタログの名前を指定します。name に「/」があると、次にくる name はメッセージ カタログのパス名を示します。それ以外の場合、環境変数 NLSPATH が使用されます。NLSPATH が環境にない場合や、NLSPATH で指定されたパスでメッセージ カタログをオープンできない場合には、デフォルトのパスが使用されます (nl_types(5) を参照)。
メッセージ カタログの名前とそれらの格納場所は、システムによって異なる可能性があります。個々のアプリケーションは、それぞれのニーズに従ってメッセージ カタログの名前を付けたり、格納場所を指定したりすることができます。したがって、カタログを格納する場所を指定するためのメカニズムが必要となります。
NLSPATH 変数では、メッセージ カタログの格納場所を検索パスの形式で指定したり、メッセージ カタログ ファイルに対応するネーミング規則を使用することができます。次に例を示します。
NLSPATH=/nlslib/%L/%N.cat:/nlslib/%N/%L
メタキャラクタ % は、置換フィールドを示します。この例で、%L は LANG 環境変数の現在の設定と置き替わります (下記の項を参照)。また、%N は catopen() に渡される name パラメータの値と置き替わります。このため、上例で、catopen() はまず /nlslib/$LANG/name.cat、次に /nlslib/name/$LANG を検索して、目的のメッセージ カタログを見つけようとします。
NLSPATH は通常、システム全体にわたって有効になるよう設定されるので (すなわち、/etc/profile)、メッセージ カタログに関連する格納場所とネーミング規則をプログラムもユーザも意識する必要はありません。
LANG 環境変数では、ネイティブ言語、地域の習慣および文字セットに関してユーザの要求条件を ASCII 文字列の形式 (LANG=language[_territory[.codeset]]) で指定することができます。
オーストリアで使用されるドイツ語を話すユーザが、ISO 8859/1 コードセットを用いている端末を使用する場合、LANG 環境変数は次のように設定します。
LANG=De_A.88591
この設定により、ユーザは関連するカタログ (存在すれば) を見つけることができるはずです。
LANG 変数が設定されていない場合、setlocale(3c) によって返される LC_MESSAGES の値が使用されます。この値が NULL の場合、nl_types(5) に定義されているデフォルトのパスが使用されます。
引数 oflag() は使用されません。この引数は将来使用する予定であり、現在は必ずゼロを指定してください。このフィールドの値を別の値に変更した場合の動作は不定です。
catclose() は catd によって指定されたメッセージ カタログをクローズします。
マルチスレッドのアプリケーションのスレッドは、TPINVALIDCONTEXT を含むどんなコンテキスト状態でも、catopen() または catclose() 呼び出すことができます。
正常終了の場合、catopen() は、以後の catgets() および catclose() の呼び出し時に使用するメッセージ カタログ記述子を返します。異常終了であれば、catopen() は (nl_catd) -1 を返します。catclose() は、正常終了のとき 0、異常終了のとき -1 を返します。
catgets(3c)、setlocale(3c)、nl_types(5)
#include “decimal.h”
int
lddecimal(cp, len, np) /* 十進数をロード */
char*cp; /* 入力 : 圧縮した形式の位置 */
int
len; /* 入力 : 圧縮した形式の長さ */
dec_t*np; /* 出力 : dec_t 形式の位置 */
void
stdecimal(np, cp, len) /* 十進数を格納 */
dec_t*np; /* 入力 : dec_t 形式の位置 */
char*cp; /* 出力 : 圧縮した形式の位置 */
int len; /* 入力 : 圧縮した形式の長さ */
int
deccmp(n1, n2) /* 2 つの十進数を比較 */
dec_t*n1; /* 入力 : 比較する数 */
dec_t*n2; /* 入力 : 比較する数 */
int
dectoasc(np, cp, len, right) /* dec_t をアスキーに変換 */
dec_t*np; /* 入力 : 変換する数 */
char*cp; /* 出力 : 変換後の数 */
int len; /* 入力 : 出力文字列の長さ */
int right; /* 入力 : 小数点以下の数 */
int
deccvasc(cp, len, np) /* アスキーを dec_t に変換 */
char*cp; /* 入力 : 変換する数 */
int len; /* 入力 : 変換する数の最大長 */
dec_t*np; /* 出力 : 変換後の数 */
int
dectoint(np, ip) /* int を dec_t に変換 */
dec_t*np; /* 入力 : 変換する数 */
int *ip; /* 出力 : 変換後の数 */
int
deccvint(in, np) /* dec_t を int に変換 */
int in; /* 入力 : 変換する数 */
dec_t*np; /* 出力 : 変換後の数 */
int
dectolong(np, lngp) /* dec_t を long に変換 */
dec_t*np; /* 入力 : 変換する数 */
long*lngp; /* 出力 : 変換後の数 */
int
deccvlong(lng, np) /* long を dec_t に変換 */
longlng; /* 入力 : 変換する数 */
dec_t*np; /* 出力 : 変換後の数 */
int
dectodbl(np, dblp) /* dec_t を double に変換 */
dec_t*np; /* 入力 : 変換する数 */
double *dblp; /* 出力 : 変換後の数 */
int
deccvdbl(dbl, np) /* double を dec_t に変換 */
double *dbl; /* 入力 : 変換する数 */
dec_t*np; /* 出力 : 変換後の数 */
int
dectoflt(np, fltp) /* dec_t を float に変換 */
dec_t*np; /* 入力 : 変換する数 */
float*fltp; /* 出力 : 変換後の数 */
int
deccvflt(flt, np) /* float を dec_t に変換 */
double *flt; /* 入力 : 変換する数 */
dec_t*np; /* 出力 : 変換後の数 */
int
decadd(*n1, *n2, *n3) /* 2 つの十進数の加算を行う */
dec_t*n1; /* 入力 : 加数 */
dec_t*n2; /* 入力 : 加数 */
dec_t*n3; /* 出力 : 合計 */
int
decsub(*n1, *n2, *n3) /* 2 つの十進数の減算を行う */
dec_t*n1; /* 入力 : 被減数 */
dec_t*n2; /* 入力 : 減数 */
dec_t*n3; /* 出力 : 差 */
int
decmul(*n1, *n2, *n3) /* 2 つの十進数の乗算を行う */
dec_t*n1; /* 入力 : 被乗数 */
dec_t*n2; /* 入力 : 被乗数 */
dec_t*n3; /* 出力 : 積 */
int
decdiv(*n1, *n2, *n3) /* 2 つの十進数の除算を行う */
dec_t*n1; /* 入力 : 被除数 */
dec_t*n2; /* 入力 : 除数 */
dec_t*n3; /* 出力 : 商 */
これらの関数を使用すると Oracle Tuxedo ATMI システムにおいてパック十進データを格納、変換、および操作することができます。Oracle Tuxedo ATMI システムにおいて表現される十進数のデータ型の形式は、CICS でのその表現とは異なることに注意してください。
マルチスレッドのアプリケーションのスレッドは、TPINVALIDCONTEXT を含むどんなコンテキスト状態でも、10 進数の変換関数を呼び出すことができます。
十進数は、Oracle Tuxedo ATMI システム上では dec_t 構造体を使用して表現されます。この構造体の定義を次に示します。
#define DECSIZE 16
struct decimal {
short dec_exp; /* 指数底 100 */
short dec_pos; /* 符号 : 1=pos、0=neg、-1=null */
short dec_ndgts; /* 有効桁数 */
char dec_dgts[DECSIZE]; /* 実際の桁数底 100 */
};
typedef struct decimal dec_t;
プログラマは、dec_t 構造体に直接アクセスする必要はありません。基本的なデータ構造体を理解するためにこの構造体を提示します。莫大な十進数データを格納する必要がある場合、より圧縮した形式を得るために stdecimal()、lddecimal() 関数を使用します。dectoasc()、dectoint()、dectolong()、dectodbl() および dectoflt() を使用すると、十進数から他のデータ タイプへ変換することができます。deccvasc()、deccvint()、deccvlong()、deccvdbl() および deccvflt() を使用すると、他のデータ タイプから十進数のデータ タイプに変換することができます。deccmp() は、2 つの十進数を比較する関数です。1 番目の十進数が 2 番目の十進数より小さい場合、-1 を返します。2 つの十進数が等しい場合、0 を返します。1 番目の十進数が 2 番目の十進数より大きい場合 1 を返します。どちらかの引数が無効である場合、-1 以外の負の値を返します。decadd()、decsub()、decmul() および decdiv() は、十進数の算術演算を行います。
特に指定がない限り、これらの関数は、正常終了時には 0 を返し、エラー時には負の数を返します。
getURLEntityCacheDir() - DTD、スキーマ、およびエンティティ ファイルがキャッシュされている場所の絶対パスを取得する Xerces クラス メソッドの指定
char * getURLEntityCacheDir()
getURLEntityCacheDir() は、呼び出し側が DTD、スキーマ、およびエンティティ ファイルがキャッシュされている場所を検索する必要がある場合に呼び出されるメソッドで、キャッシュされたファイルの場所の絶対パスを返します。このメソッドは、以下の 2 つの Xerces オブジェクトと組み合わせて排他的に使用されます。
GetURLEntityCaching() - DTD、スキーマ、およびエンティティ ファイルのキャッシュ機構の取得する Xerces クラス メソッドの指定
bool getURLEntityCaching()
GetURLEntityCaching() は、DTD、スキーマ、およびエンティティ ファイルのキャッシュが有効になっているか無効になっているかを検索する必要がある場合に呼び出されるメソッドで、戻り値は、キャッシュが有効になっている場合は true、無効になっている場合は false です。このメソッドは、以下の 2 つの Xerces オブジェクトと組み合わせて排他的に使用されます。
gp_mktime() - tm 構造体をカレンダー時間に変換します。
#include <time.h>
time_t gp_mktime (struct tm *timeptr);
gp_mktime() は、timeptr が指す tm 構造体で表現される時間をカレンダー時間 (1970 年 1 月 1 日から数えた秒数) に変換します。
struct tm {
int tm_sec; /* その分からの秒数 [0, 61] */
int tm_min; /* その時間からの分数 [0, 59] */
int tm_hour; /* 深夜 12 時からの時間数 [0, 23] */
int tm_mday; /* その月の日付 [1, 31] */
int tm_mon; /* 1 月からの月数 [0, 11] */
int tm_year; /* 1900 年からの年数 */
int tm_wday; /* 日曜日からの日数 [0, 6] */
int tm_yday; /* 1 月 1 日からの日数 [0, 365] */
int tm_isdst; /* 夏時間のフラグ */
};
gp_mktime() は、カレンダー時間を計算する以外に、指定された tm 構造体を正規化します。構造体の tm_wday メンバーと tm_yday メンバーの元の値は無視され、他のメンバーの元の値は、構造体の定義で示される範囲に制限されません。正常終了の場合、tm_wday および tm_yday の値は適切に設定されます。他のメンバーは指定されたカレンダー時間を表すように設定されますが、それらの値は、正しい範囲内に収まるように強制されます。tm_mday の最終的な値は、tm_mon および tm_year が決まるまで設定されません。
構造体の各メンバーの元の値は、決められた範囲よりも大きくても小さくてもかまいません。たとえば、tm_hour が -1 なら、深夜 12 時の 1 時間前、tm_mday が 0 ならその月の 1 日前、tm_mon が -2 なら、tm_year の 1 月の 2 ヵ月前を意味します。
tm_isdst が正の場合、元の値は代替タイムゾーンに基づいていると見なされます。代替タイムゾーンが計算されたカレンダー時間に対して有効でないことが判明すると、各メンバーはメイン タイムゾーンに調整されます。同様に、tm_isdst がゼロの場合、元の値はメイン タイムゾーンであると見なされ、メイン タイムゾーンが有効でなければ代替タイムゾーンに変換されます。tm_isdst が負の場合、正しいタイムゾーンが判断され、各メンバーは調整されません。
ローカル タイムゾーンの情報は、あたかも gp_mktime() が tzset() を呼び出したかのように使われます。
gp_mktime() は、特定のカレンダー時間を返します。カレンダー時間を表現できない場合、この関数は値 (time_t)-1 を返します。
マルチスレッドのアプリケーションのスレッドは、TPINVALIDCONTEXT を含むどんなコンテキスト状態でも、gp_mktime() を呼び出すことができます。
#include <stdio.h>
#include <time.h>
static char *const wday[] = {
"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "-unknown-"
};
struct tm time_str;
/*...*/
time_str.tm_year = 2001 - 1900;
time_str.tm_mon = 7 - 1;
time_str.tm_mday = 4;
time_str.tm_hour = 0;
time_str.tm_min = 0;
time_str.tm_sec = 1;
time_str.tm_isdst = -1;
if (gp_mktime(time_str) == -1)
time_str.tm_wday=7;
printf("%s\en", wday[time_str.tm_wday]);
tm 構造体の tm_year は、1970 年以降でなければなりません。1970 年 1 月 1 日の 00:00:00 UTC より前、または 2038 年 1 月 19 日の 03:14:07 UTC より後のカレンダー時間を表現することはできません。
コンパイル システムが ANSI C の mktime() 関数をすでに提供しているシステムでは、gp_mktime() は mktime() を呼んで、変換を行うだけです。それ以外の場合、変換は直接 gp_mktime() の内部で行われます。
後者の場合、TZ 環境変数が設定されていなければなりません。多くのインストレーションでは、TZ は、ユーザがログオンする際にデフォルトで正しい値に設定されることに注意してください。TZ のデフォルト値は GMT0 です。TZ の形式は次の通りです。
stdoffset[dst[offset],[start[time],end[time]]]
std および dst
std) および夏時間 (dst) のタイムゾーンを表す 3 バイト以上の文字です。std だけが必須です。dst が無い場合、このロケールには夏時間は適用されません。大文字と小文字をどちらでも使用できます。先頭のコロン (:)、数字、コンマ (,)、マイナス (-)、またはプラス (+) 以外のすべての文字が使用できます。
offset
offset の形式は hh[:mm[:ss]] です。分 (mm) と秒 (ss) は省略可能です。時間 (hh) は必須で、1 つの数字でもかまいません。std の次の offset は必須です。dst の次に offset が無ければ、夏時間は標準時間の 1 時間先であると見なされます。1 つ以上の数字を使用でき、値は常に十進数として解釈されます。時間は 0 から 24 の間でなければならず、分 (および秒) は、もしあれば、0 から 59 の間でなければなりません。範囲外の値は、予期できない動作を引き起こす場合があります。先頭に "-" がつくと、タイムゾーンはグリニッジ子午線の東にあります。それ以外の場合、タイムゾーンは西にあります (省略可能な "+" 符号で示してもかまいません)。
start/time,end/time
start/time は、いつ標準時間から夏時間への変更が発生しするかを示し、end/time は、逆の変更がいつ起こるかを示します。それぞれの time フィールドは、ローカル時間で、いつ変更が行われるかを示します。
start と end の形式は次のうちのどれかです。
n (1 < n > 365)。うるう日は含まれません。つまり、すべての年で 2 月 28 日が 59 日目で、3 月 1 日が 60 日目です。2 月 29 日があってもそれを指定することはできません。
m.n.d
m 月の n 週 (1 < n < 5、1 m < 12) の d 番目の日 (0 < d < 6) です。ただし、週 5 は、4 週目または 5 週目に発生する「m 月の最後の d 日」を意味します。週 1 は、d 番目の日が発生する最初の週です。日 0 (ゼロ) は、日曜日です。
start および end には、これらの省略可能なフィールドが与えられなかった場合、実装依存のデフォルトが使用されます。
time は、offset と同じ形式で、違いは先頭の符号 ("-" または "+") が許されることです。time が与えられなかった場合のデフォルトは 02:00:00 です。
UNIX システムのリファレンス マニュアルの ctime(3c) と getenv(3c)、timezone(4)
#include <nl_types.h>
#include <langinfo.h>
char *nl_langinfo (nl_item item);
nl_langinfo() は、ある特定言語あるいはプログラム ロケールで定義されている文化圏に関連する情報を収めた NULL で終わる文字列を指すポインタを返します。item に入る定数名と値は langinfo.h に定義されています。
nl_langinfo (ABDAY_1);
指定された言語がフランス語で、フランス語のロケールが正しくインストールされていれば、文字列「Dim」を指すポインタを返します。また、指定された言語が英語であれば、「Sun」が返されます。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、nl_langinfo() の呼び出しを発行できます。
setlocale() が正常に呼び出されなかった場合、あるいはサポートされている言語の langinf0() データが存在しないか、item が該当箇所に定義されていない場合には、nl_langinfo() は C ロケールの対応する文字列を指すポインタを返します。どのロケールの場合も、item に無効な文字列が指定されると、nl_langinfo() は空の文字列を指すポインタを返します。
戻り値が指す配列は、プログラムで変更しないようにしてください。nl_langinfo() の次の呼び出しで、この配列の内容は変わってしまいます。
setlocale(3c)、strftime(3c)、langinfo(5)、nl_types(5)
rpc_sm_allocate()、rpc_ss_allocate()—RPC スタブ メモリ管理方式でのメモリの割り当て
idl_void_p_t rpc_sm_allocate(unsigned32 size, unsigned32 *status)
idl_void_p_t rpc_ss_allocate(unsigned32 size)
アプリケーションは rpc_sm_allocat3() を呼び出し、RPC スタブ メモリ管理方式でメモリを割り当てます。入力パラメータ size は、割り当てるメモリの大きさをバイト単位で指定します。このルーチンを呼び出す前に、スタブ メモリ管理環境が確立されていなければなりません。サーバ スタブから呼び出されるサービス コードでは通常、スタブ自身が必要な環境を確立します。スタブから呼び出されないコードで rpc_sm_allocate() を使用する場合には、アプリケーションが rpc_sm_enable_allocate() を呼び出し、必要なメモリ管理環境を確立しなければなりません。
サーバ スタブのパラメータ中に参照によるパラメータの転送に使用される以外のポインタが含まれている、あるいは [enable_allocate] 属性が ACS ファイル内の操作に指定されている場合には、環境は自動的に設定されます。そうでなければ、環境は rpc_sm_enable_allocate() を呼び出すことで、アプリケーションにより設定されなければなりません。
スタブがメモリ管理環境を確立する場合には、スタブ自身が rpc_sm_allocate() により割り当てられたメモリを解放します。アプリケーションは rpc_sm_free() を呼び出し、呼び出し側スタブに戻る前にメモリを解放することができます。
アプリケーションがメモリ管理環境を確立した場合には、アプリケーションは rpc_sm_free() または rpc_sm_disable_allocate() を呼び出し、割り当てられたすべてのメモリを解放しなければなりません。
出力パラメータ status には、このルーチンからのステータス コードが返されます。このステータス コードは、ルーチンが成功して完了したか、または失敗した場合はその理由を示します。次は、ステータス コードとその意味の一覧です。
rpc_ss_allocate() は、この関数の例外復帰バージョンであり、出力パラメータ status を持ちません。例外は発生しません。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、rpc_sm_allocate() または rpc_ss_allocate() の呼び出しを発行できます。
正常終了すると、このルーチンは割り当てられたメモリを指すポインタを返します。idl_void_p_t は、ISO 標準 C 環境では void * に、他の環境では char * に定義されていることに注意してください。
メモリ不足の場合、ルーチンは NULL ポインタを返します。
rpc_sm_disable_allocate、rpc_ss_disable_allocate(3c)、rpc_sm_enable_allocate、rpc_ss_enable_allocate(3c)、rpc_sm_free、rpc_ss_free(3c)
『TxRPC を使用した Oracle Tuxedo アプリケーションのプログラミング』
rpc_sm_client_free()、rpc_ss_client_free()—クライアント スタブから返されたメモリの解放
#include <rpc/rpc.h>
void rpc_sm_client_free (idl_void_p_t node_to_free, unsigned32 *status)
void rpc_ss_client_free (idl_void_p_t node_to_free)
ルーチン rpc_sm_client_free() は、クライアント スタブに割り当てられ、そのスタブから返されたメモリを解放します。入力パラメータ node_to_free は、クライアント スタブから返されたメモリを指すポインタを指定します。ISO 標準の C 環境では、idl_void_p_t は void * と定義され、他の環境では char * と定義されます。
このルーチンにより、他のルーチンはそれが呼び出されたメモリ管理環境を意識せずに、RPC コールにより返された動的に割り当てられたメモリを解放することができます。
コードがサーバの一部として実行している場合であっても、このルーチンは常にクライアント コードから呼び出されます。
出力パラメータ status には、このルーチンからのステータス コードが返されます。このステータス コードは、ルーチンが成功して完了したか、または失敗した場合はその理由を示します。次は、ステータス コードとその意味の一覧です。
rpc_ss_client_free() は、この関数の例外復帰バージョンであり、出力パラメータ status を持ちません。例外は発生しません。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、rpc_sm_client_free() または rpc_ss_client_free() の呼び出しを発行できます。
rpc_sm_free、rpc_ss_free(3c)、rpc_sm_set_client_alloc_free、rpc_ss_set_client_alloc_free(3c)、rpc_sm_swap_client_alloc_free、rpc_ss_swap_client_alloc_free(3c)
『TxRPC を使用した Oracle Tuxedo アプリケーションのプログラミング』
rpc_sm_disable_allocate()、rpc_ss_disable_allocate()—資源とスタブ メモリ管理方式で割り当てられたメモリの解放
void rpc_sm_disable_allocate(unsigned32 *status);
void rpc_ss_disable_allocate(void);
rpc_sm_disable_allocate() ルーチンは、rpc_sm_enable_allocate() を呼び出して取得したすべての資源と、rpc_sm_allocate() の呼び出し後に rpc_sm_enable_allocate() を呼び出すことで割り当てられたすべてのメモリを解放します。
rpc_sm_enable_allocate() と rpc_sm_disable_allocate() は、対にして使用しなければなりません。rpc_sm_enable_allocate() を呼び出さずにこのルーチンを使用すると、予期できない結果が生じます。
出力パラメータ status には、このルーチンからのステータス コードが返されます。このステータス コードは、ルーチンが成功して完了したか、または失敗した場合はその理由を示します。次は、ステータス コードとその意味の一覧です。
rpc_ss_disable_allocate() は、この関数の例外復帰バージョンであり、出力パラメータ status を持ちません。例外は発生しません。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、rpc_sm_disable_allocate() または rpc_ss_disable_allocate() の呼び出しを発行できます。
rpc_sm_allocate、rpc_ss_allocate(3c)、rpc_sm_enable_allocate、rpc_ss_enable_allocate(3c)
『TxRPC を使用した Oracle Tuxedo アプリケーションのプログラミング』
rpc_sm_enable_allocate()、rpc_ss_enable_allocate()—スタブ メモリ管理環境を有効にする
void rpc_sm_enable_allocate(unsigned32 *status)
void rpc_ss_enable_allocate(void)
アプリケーションから rpc_sm_enable_allocate() を呼び出して、スタブ自身によってメモリ管理環境が設定されていない場合に、スタブ メモリ環境を設定できます。すべての rpc_sm_allocate() の呼び出しの前に、スタブ メモリ環境を設定しなければなりません。サーバのスタブから呼び出されるサービス コードについては、通常、スタブ メモリ環境はスタブ自身によって設定されます。他のコンテキストから呼び出すコード (たとえば、サービス コードをスタブからでなく直接呼び出す場合) では、rpc_sm_allocate() を呼び出す前に rpc_sm_enable_allocate() を呼び出す必要があります。
出力パラメータ status には、このルーチンからのステータス コードが返されます。このステータス コードは、ルーチンが成功して完了したか、または失敗した場合はその理由を示します。次は、ステータス コードとその意味の一覧です。
rpc_ss_enable_allocate() は、この関数の例外復帰バージョンで、出力パラメータ status を持ちません。このルーチンでは、次の例外が発生します。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、rpc_sm_enable_allocate() または rpc_ss_enable_allocate() の呼び出しを発行できます。
rpc_sm_allocate、rpc_ss_allocate(3c)、rpc_sm_disable_allocate、rpc_ss_disable_allocate(3c)
『TxRPC を使用した Oracle Tuxedo アプリケーションのプログラミング』
rpc_sm_free、rpc_ss_free()—rpc_sm_allocate() ルーチンによって割り当てたメモリを解放する
#include <rpc/rpc.h>
void rpc_sm_free(idl_void_p_t node_to_free, unsigned32 *status)
void rpc_ss_free(idl_void_p_t node_to_free)
アプリケーションから rpc_sm_free() を呼び出して、rpc_sm_allocate() を使用して割り当てたメモリを解放します。入力パラメータ node_to_free には、rpc_sm_allocate() を使用して割り当てたメモリへのポインタを指定します。ISO 標準の C 環境では、idl_void_p_t は void * と定義され、他の環境では char * と定義されます。
スタブ メモリ管理環境でスタブがメモリを割り当てると、スタブから呼び出されるサービス コードは、rpc_sm_free() を使用してスタブが割り当てたメモリを解放することができます。
rpc_sm_allocate() によって割り当てたのではないメモリへのポインタ、または rpc_sm_allocate() によって割り当てたメモリでも先頭以外の場所へのポインタで rpc_ss_free() を呼び出した場合は、予期できない結果が生じます。
出力パラメータ status には、このルーチンからのステータス コードが返されます。このステータス コードは、ルーチンが成功して完了したか、または失敗した場合はその理由を示します。次は、ステータス コードとその意味の一覧です。
rpc_ss_free は、この関数の例外復帰バージョンであり、出力パラメータ status を持ちません。例外は発生しません。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、rpc_sm_free() または rpc_ss_free() の呼び出しを実行できます。
rpc_sm_allocate、rpc_ss_allocate(3c)
『TxRPC を使用した Oracle Tuxedo アプリケーションのプログラミング』
rpc_sm_set_client_alloc_free()、rpc_ss_set_client_alloc_free()—クライアントのスタブが使用するメモリ管理および解放のメカニズムを設定する
#include <rpc/rpc.h>
void rpc_sm_set_client_alloc_free(idl_void_p_t (*p_allocate)(unsigned long size), void (*p_free) (idl_void_p_t ptr), unsigned32 *status)
void rpc_ss_set_client_alloc_free(idl_void_p_t (*p_allocate)(unsigned long size), void (*p_free) (idl_void_p_t ptr))
rpc_sm_set_client_alloc_free() は、クライアントのスタブがメモリ管理に使用するデフォルトのルーチンよりも優先されます。入力パラメータ p_allocate および p_free には、メモリの割り当ておよび解放のルーチンを指定します。サーバのコード中でリモート コールが発生する場合 (この場合、メモリ管理ルーチンは rpc_ss_allocate(3) および rpc_ss_free(3) でなければなりません) を除いて、デフォルトのメモリ管理ルーチンは ISO C の malloc() および free() になります。
出力パラメータ status には、このルーチンからのステータス コードが返されます。このステータス コードは、ルーチンが成功して完了したか、または失敗した場合はその理由を示します。次は、ステータス コードとその意味の一覧です。
rpc_ss_set_client_alloc_free は、この関数の例外復帰バージョンで、出力パラメータ status を持ちません。このルーチンでは、次の例外が発生します。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、rpc_sm_set_client_alloc_free() または rpc_ss_set_client_alloc_free() の呼び出しを発行できます。
rpc_sm_allocate、rpc_ss_allocate(3c)、rpc_sm_free、rpc_ss_free(3c)
『TxRPC を使用した Oracle Tuxedo アプリケーションのプログラミング』
rpc_sm_swap_client_alloc_free()、rpc_ss_swap_client_alloc_free()—クライアントのスタブが使用するメモリ管理および解放のメカニズムを、クライアントが提供するメカニズムに交換する
#include <rpc/rpc.h>
void rpc_sm_swap_client_alloc_free(idl_void_p_t (*p_allocate)(unsigned long size),
void (*p_free) (idl_void_p_t ptr), idl_void_p_t (**p_p_old_allocate)(unsigned long size),
void (**p_p_old_free)( idl_void_p_t ptr), unsigned32 *status)
void rpc_ss_swap_client_alloc_free(idl_void_p_t (*p_allocate)(unsigned long size),
void (*p_free) (idl_void_p_t ptr), idl_void_p_t (**p_p_old_allocate)(unsigned long size),
void (**p_p_old_free)( idl_void_p_t ptr))
rpc_sm_swap_client_alloc_free() ルーチンは、クライアントのスタブが使用する現在のメモリ管理および解放のメカニズムを、呼び出し側が提供するルーチンに交換します。入力パラメータ p_allocate および p_free には、新しいメモリ割り当ておよび解放のルーチンを指定します。出力パラメータ p_p_old_allocate および p_p_old_free には、このルーチンを呼び出す前に使用されていたメモリの割り当ておよび解放のルーチンが返されます。
呼び出し可能なルーチンが RPC クライアントの場合は、その呼び出し側が選択したメカニズムにかかわらず、どのメモリ割り当ておよび解放のルーチンが使用されたかを確認する必要があります。このルーチンを使用すれば、メモリ割り当ておよび解放のメカニズムを意図的に交換して、使用されたルーチンを確認することができます。
出力パラメータ status には、このルーチンからのステータス コードが返されます。このステータス コードは、ルーチンが成功して完了したか、または失敗した場合はその理由を示します。次は、ステータス コードとその意味の一覧です。
rpc_s_ok
rpc_s_no_memory
rpc_ss_swap_client_alloc_free は、この関数の例外復帰バージョンで、出力パラメータ status を持ちません。このルーチンでは、次の例外が発生します。
rpc_x_no_memory
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、rpc_sm_swap_client_alloc_free() または rpc_ss_swap_client_alloc_free() の呼び出しを発行できます。
rpc_sm_allocate、rpc_ss_allocate(3c)、rpc_sm_free、rpc_ss_free(3c)、rpc_sm_set_client_alloc_free、rpc_ss_set_client_alloc_free(3c)
『TxRPC を使用した Oracle Tuxedo アプリケーションのプログラミング』
#include <locale.h>
char *setlocale (int category, const char *locale);
setlocale() は、プログラムのロケールの該当部分を、category および locale 引数の指定に従って選択します。category 引数には、次のいずれかの値を指定することができます。
LC_CTYPE
LC_NUMERIC
LC_TIME
LC_COLLATE
LC_MONETARY
LC_MESSAGES
LC_ALL
これらの名前は、ヘッダ ファイル locale.h に定義されています。Oracle Tuxedo ATMI システムとの互換関数の場合、setlocale() によりすべてのカテゴリにつき 1 つだけ locale を使用できます。どのカテゴリを設定しても、LC_ALL (プログラムのロケール全体を表す) と同じに扱われます。
locale の値 “C” はデフォルトの環境を指定します。
また、locale の値 "" は、そのロケールを環境変数から取り出すことを表します。環境変数 LANG からロケールが判別されます。
setlocale(LC_ALL, "C")
この関数は、各カテゴリを環境 “C” で記述されるロケールに初期化します。
ある文字列を指すポインタが locale に対して指定されると、setlocale() はすべてのカテゴリのロケールを locale に設定しようとします。locale は 1 つのロケールからなる単純なロケールでなければなりません。setlocale() がカテゴリに対するロケールの設定に失敗すると、NULL ポインタが返され、すべてのカテゴリに対するプログラムのロケールは変更されません。正常に設定されれば、設定されたロケールが返されます。
locale に NULL ポインタが設定されると、setlocale() は category に対応する現在のロケールを返します。プログラムのロケールは変更されません。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、setlocale() の呼び出しを発行できます。
$TUXDIR/locale/C/LANGINFO - C ロケールの時刻と通貨のデータベース
$TUXDIR/locale/locale/* - 各ロケールに関する固有の情報を含むファイル
$TUXDIR/locale/C/*_CAT - ロケールのテキスト メッセージ
複合ロケールはサポートされていません。複合ロケールは、“/” で始まり、各カテゴリのロケールを “/” で区切ってリストした文字列です。
UNIX システムのリファレンス マニュアルの ctime(3c)、ctype(3c)、getdate(3c)、localeconv(3c)、strftime(3c)、strtod(3c)、printf(3S)、environ(5)
setURLEntityCacheDir() - DTD、スキーマ、およびエンティティ ファイルをキャッシュするディレクトリを設定する Xerces クラス メソッドの指定
void setURLEntityCacheDir (const char* cachedir)
setURLEntityCacheDir() は、キャッシュが有効になっており、ユーザが DTD、スキーマ、およびエンティティ ファイルを特定のディレクトリにキャッシュする場合に呼び出します。cachedir には、ファイルの場所の絶対パスを指定します。
このメソッドを呼び出さず、setURLEntityCaching() メソッドを呼び出すか、または環境変数を設定しないことによってキャッシュを有効にした場合、ファイルはカレント ディレクトリにキャッシュされます。このメソッドは、以下の 2 つの Xerces オブジェクトと組み合わせて排他的に使用されます。
setURLEntityCaching() - XML パーサ用に DTD、スキーマ、またはエンティティ ファイルのキャッシュの設定または設定解除を行う Xerces クラス メソッドの指定
void setURLEntityCaching (bool UseCache)
setURLEntityCaching() は、DTD、スキーマ、またはエンティティ ファイルをデフォルトでキャッシュするメソッドで、ユーザはファイルのキャッシュの有効/無効を切り替えることができます。UseCache は、キャッシュを無効にした場合は false、有効にした場合は true に設定されます。このメソッドは、以下の 2 つの Xerces オブジェクトと組み合わせて排他的に使用されます。
#include <string.h>
char *strerror (int errnum);
strerror は errnum に指定されたエラー番号をエラー メッセージ文字列にマッピングし、その文字列を指すポインタを返します。strerror は、perror と同じエラー メッセージ セットを使用します。返される文字列は上書きされないようにしてください。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、strerror() の呼び出しを発行できます。
UNIX システムのリファレンス マニュアルの perror(3)
#include <time.h>
size_t *strftime (char *s, size_t maxsize, const char *format, const struct tm *timeptr);
strftime() は、format が指す文字列の制御に従って、s が指す配列に文字を入れます。format 文字列は、ゼロ個以上のディレクティブと通常文字で構成します。すべての通常文字 (文字列の最後を表す NULL 文字列を含む) は、そのまま配列に複写されます。strftime() の場合、maxsize 個以上の文字は配列には入りません。
format が (char *)0 である場合、ロケールのデフォルトの形式が使用されます。デフォルトの形式は "%c" と同じです。
各ディレクティブは、次のリストの記述に従って該当する文字と置き換えられます。該当文字はプログラムのロケールの LC_TIME カテゴリおよび timeptr が指す構造体に格納されている値によって判別されます。
%U と %W の相違点は、日にちを週の初日から数えるかどうかという点です。週番号 01 は、%U の場合、日曜日から始まる 1 月の第 1 週、%W の場合は月曜日から始まる 1 月の第 1 週を表します。また、週番号 00 には、%U および %W でそれぞれ最初の日曜日または月曜日の前の日にちを表します。
終端 NULL 文字を含む結果として得られた文字の合計数が maxsize を超えない場合、strftime() は s が指す配列に置かれた文字数 (終端 NULL 文字を含まない) を返します。maxsize を超えた場合には、ゼロが返され、配列の内容は不定になります。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、strftime() の呼び出しを発行できます。
デフォルトの設定では、strftime() の出力は U.S. English で行われます。strftime() の出力は、setlocale() にカテゴリ LC_TIME の locale を設定することによって特定の言語に変更することができます。
時間帯は環境変数 TZ から取り込まれます (TZ の詳細については、ctime(3C) を参照)。
strftime() の使用例を示します。この例は、tmptr が指す構造体に、ニュージャージー州における 1986 年 8 月 28 日木曜日の 12 時 44 分 36 秒に対応する値が入っている場合に、str の文字列がどのようになるかを示しています。
strftime (str, strsize, "%A %b %d %j", tmptr)
この結果、str には "Thursday Aug 28 240" の文字列が入ります。
$TUXDIR/locale/locale/LANGINFO—コンパイルされたロケール固有の日付/時刻情報を収めているファイル
tpabort()—現在のトランザクションをアボートするルーチン
#include <atmi.h>
int tpabort(long flags)
tpabort() は、トランザクションのアボートを指定します。この関数が終了すると、そのトランザクションでなされたリソースへの変更内容はすべて取り消されます。tpcommit() と同様、この関数は、トランザクションのイニシエータからしか呼び出せません。参加リソース (つまり、サービス ルーチン) は、トランザクションをアボートさせたい場合には、TPFAIL を付けて tpreturn() を呼び出します。
未終了の応答に対する呼び出し記述子が存在するときに tpabort() を呼び出すと、この関数の終了時に、トランザクションはアボートし、呼び出し側のトランザクションに関連するこれらの記述子は以後無効になります。呼び出し側のトランザクションに関連がない呼び出し記述子の状態は有効のままです。
トランザクション モードの会話型サーバに対してオープン接続がある場合、tpabort() は TPEV_DISCONIMM イベントをサーバに送ります (そのサーバが接続の制御権を有するかどうかに関係なく)。tpbegin() の前に、あるいは TPNOTRAN フラグを付けて (つまり、トランザクション モードでない状態で) オープンされた接続は、影響を受けません。
現時点では、tpabort() の唯一の引数 flags は将来使用する予定であり、現在は必ずゼロを指定してください。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpabort() の呼び出しを発行できません。
異常終了すると、tpabort() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了すると、tpabort() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPEHEURISTIC]
TPEHAZARD]
TPEPROTO]
TPESYSTEM]
TPEOS]
Oracle Tuxedo ATMI システムのトランザクションを記述するために tpbegin()、tpcommit()、および tpabort() を使用する場合、XA インタフェースに準拠した (呼び出し側に妥当にリンクされている) リソース マネージャが行う作業のみがトランザクションの特性を備えていることを記憶しておくことが重要です。トランザクションにおいて実行される他のすべての操作は、tpcommit() あるいは tpabort() のいずれにも影響されません。
tpbegin(3c)、tpcommit(3c)、tpgetlev(3c)
#include <atmi.h>
int tpacall(char *svc, char *data, long len, long flags)
tpacall() は、svc で指定されているサービスに要求メッセージを送ります。この要求は、以前の tpspri() で変更されていないかぎり、svc に対して定義されている優先順位で送信されます。data は、NULL でなければ、tpalloc() が以前に割り当てたバッファを指していなければなりません。len には送信するバッファに入るデータの量を指定します。ただし、data が長さの指定を必要としないバッファを指している場合 (FML フィールド化バッファなど)、len は無視されます (0 でかまいません)。data が NULL であると、len は無視され、要求はデータ部なしで送信されます。data のタイプとサブタイプは、svc が認識するタイプおよびサブタイプと一致しなければなりません。トランザクション モードにあるときに送信される要求ごとに、最終的には対応する応答が受信されなければならないことに注意してください。
TPNOTRAN
svc が呼び出されたときに、このプロセスは呼び出し側のトランザクションの一部として実行されません。svc がトランザクションをサポートしないサーバに属している場合、呼び出し側がトランザクション モードのときに、このフラグを設定しなければなりません (そうでないと、TPETRAN が返されます)。svc が依然としてトランザクション モードで起動される場合がありますが、それは同じトランザクションでないことに注意してください。svc は、コンフィグレーション属性で、自動的にトランザクション モードで呼び出されるようにすることができます。このフラグを設定するトランザクション モードの呼び出し側は、トランザクション タイムアウトの影響を受けます。サービスが異常終了した場合でも、起動時にこのフラグが設定されていれば、呼び出し側のトランザクションに影響は及びません。
TPNOREPLY
tpacall() に通知します。TPNOREPLY が設定されると、この関数は正常終了時には 0 を返します。0 は、無効な記述子です。呼び出し側がトランザクション モードにあるとき、TPNOTRAN が設定されない限りこの設定は使用できません。
TPNOBLOCK
TPNOBLOCK が指定されていないときにブロッキング条件が存在すると、呼び出し側は、その条件が解消されるか、またはタイムアウト (トランザクションまたはブロッキング) が発生するまではブロックされます。
TPNOTIME
TPSIGRSTRT
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpacall() の呼び出しを発行できません。
正常終了の場合、tpacall() は、送信した要求の応答を受信するために使用できる記述子を返します。
異常終了すると、tpacall() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpacall() は tperrno を次のいずれかの値に設定します (特に記述した場合を除いては、エラーが呼び出し側のトランザクションに影響を及ぼすことはありません)。
TPEINVAL]
TPENOENT]
TPEITYPE]
TPELIMIT]
TPETRAN]
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。
TPETIME が発生します。ただし、例外が 1 つあります。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態に置かれます。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpalloc(3c)、tpcall(3c)、tpcancel(3c)、tpgetrply(3c)、tpgprio(3c)、tpsprio(3c)
tpadmcall()—ブートされていないアプリケーションの管理
#include <atmi.h>
#include <fml32.h>
#include <tpadm.h>
int tpadmcall(FBFR32 *inbuf, FBFR32 **outbuf, long flags)
tpadmcall() は、ブートされていないアプリケーションの属性の検索と更新に使用します。また、アクティブなアプリケーションで、限られた属性の集合を直接検索することもできます。この場合、外部プロセスとの通信は必要ありません。この関数は、システム提供のインタフェース ルーチンを使用してシステムのコンフィグレーションと管理が完全に行えるような十分な機能を提供します。
inbuf には、tpalloc() によって以前に割り当てた、希望する管理操作とそのパラメータが入っている FML32 バッファへのポインタを指定します。
outbuf には、結果を入れる FML32 バッファへのポインタのアドレスを指定します。outbuf は、元々 tpalloc() によって割り当てられた FML32 バッファを指していなければなりません。送信と受信に同じバッファを使用する場合は、outbuf には inbuf のアドレスを指定してください。
現在 tpadmcall() の最後の引数の flags は将来の使用のために予約されているため、0 に設定しなければなりません。
MIB(5) を調べて、管理要求の構築に関する一般的な情報を得る必要があります。TM_MIB(5) および APPQ_MIB(5) を調べて、tpadmcall() を通してアクセスできるクラスについて情報を得る必要があります。
tpadmcall() は次の 4 つのモードで呼び出すことができます。
APPQ_MIB() で定義されているクラスのオブジェクトに対して GET および SET を実行することだけです。
TM_MIB() および APPQ_MIB() のあらゆるクラスのあらゆる属性に対して、これらに対して適切なパーミッションを持つ場合に、GET および SET を実行できます。クラスによっては、起動されていないアプリケーションからアクセスできない属性だけを持ち、これらのクラスへのアクセスが失敗する場合があることに注意してください。
TM_MIB() のあらゆるクラスのあらゆる属性に対して、これらに対して適切なパーミッションを持つ場合に、GET を実行できます。同様に呼び出し側は、クラス固有の制限にもよりますが、APPQ_MIB() のあらゆるクラスのあらゆる属性に対して GET および SET を実行できます。ACTIVE であるときにのみアクセスできる属性は返されません。
tpinit() の実行時に割り当てられた認証キーに従ってパーミッションが決められます。呼び出し側は、TM_MIB() のあらゆるクラスのあらゆる属性に対して、これらに対して適切なパーミッションを持つ場合に、GET を実行できます。さらに呼び出し側は、クラス固有の制限にもよりますが、APPQ_MIB() のあらゆるクラスのあらゆる属性に対して GET および SET を実行できます。
これらのインタフェース ルーチンを使用したバイナリの Oracle Tuxedo ATMI システム アプリケーション コンフィグレーション ファイルに対するアクセスおよび更新は、ディレクトリ名やファイル名に関する UNIX システムのパーミッションによって制御されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpadmcall() の呼び出しを発行できません。
このルーチンを呼び出す前に、次の環境変数を設定する必要があります。
TUXCONFIG
tpadmcall() を使用する場合、GET 要求における TA_OCCURS 属性の使用はサポートされていません。tpadmcall() を使用する場合、GETNEXT 要求はサポートされていません。
tpadmcall() は成功すると 0 を、失敗すると -1 を返します。
異常終了時には、tpadmcall() は tperrno を次のいずれかの値に設定します。
| 注意 : | TPEINVAL の場合を除いて、呼び出し側の出力バッファ outbuf は、TA_ERROR、TA_STATUS、そして場合によっては TA_BADFLD を含むように変更され、エラー条件についてさらに詳しい情報が得られます。このようにして返されるエラー コードについて詳しくは、MIB(5)、TM_MIB(5)、および APPQ_MIB(5) を参照してください。 |
TPEINVAL]
TPEMIB]
TPEPROTO]
TPERELEASE]
TPEOS]
TPESYSTEM]
このインタフェースは、ローカルなコンフィグレーション ファイルおよび掲示板に対するアクセスおよび更新しかサポートしていません。したがって、相互運用性の問題はありません。
このインタフェースは、Oracle Tuxedo ATMI リリース 5.0 またはそれ以降が稼動する UNIX System のサイトでしか利用できません。
${TUXDIR}/lib/libtmib.a, ${TUXDIR}/lib/libqm.a, ${TUXDIR}/lib/libtmib.so.<rel>, ${TUXDIR}/lib/libqm.so.<rel>, ${TUXDIR}/lib/libtmib.lib, ${TUXDIR}/lib/libqm.lib
buildclient を使用する場合は、ライブラリを手動でリンクする必要があります。この場合、-L${TUXDIR}/lib -ltmid -lqm を指定します。
ACL_MIB(5)、APPQ_MIB(5)、EVENT_MIB(5)、MIB(5)、TM_MIB(5)、WS_MIB(5)
『Oracle Tuxedo アプリケーションの設定』
『Oracle Tuxedo アプリケーション実行時の管理』
#include <atmi.h>
int tpadvertise(char *svcname, void (*func)(TPSVCINFO *))
tpadvertise() 使用するとサーバは提供するサービスを宣言することができます。デフォルトの設定では、サーバのサービスは、サーバのブート時に宣言され、サーバの停止時にその宣言が解除されます。
複数サーバ単一キュー (MSSQ) セットに属するすべてのサーバは、同じサービス セットを提供しなければなりません。これらのルーチンは、MSSQ セットを共有する全サーバを宣言することによってこの規則を適用します。
tpadvertise() は、サーバ (あるいは、呼び出し側の MSSQ セットを共有するサーバのセット) の svcname を宣言します。svcname に NULL あるいは NULL 文字列 (“”) を指定することはできません。また、長さは 15 文字までとしてください (UBBCONFIG(5) の SERVICES セクションを参照)。func は Oracle Tuxedo ATMI システムのサービス関数のアドレスです。この関数は、svcname に対する要求をサーバが受け取ったときに起動されます。func に NULL を指定することはできません。明示的に指定された関数名 (servopts(5) を参照) は、128 文字までの長さを指定できます。15 文字を超える名前は受け入れられますが、15 文字に短縮されます。このため、短縮された名前が他のサービス名と同じにならないよう、注意が必要です。
svcname がすでにサーバに対して宣言されていて、func がその現在の関数と一致する (すでに宣言されている名前に一致する短縮された名前も含まれます) 場合、tpadvertise() は正常に終了します。ただし、svcname がすでにサーバに対して宣言されていても、func が現在の関数と一致しない場合には (短縮された名前がすでに宣言されている名前と同じ場合にも)、エラーが返されます。
'.' で始まるサービス名は、管理用サービスのために予約されています。アプリケーションがこれらのサービスの 1 つを宣言しようとするとエラーが返されます。
異常終了すると、tpadvertise() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpadvertise() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPELIMIT]
TPEMATCH]
svcname は、既にこのサーバについて宣言されていますが、それは、func 以外の関数で行われました。この関数は異常終了しても、svcname はその現在の関数で宣言されたまま変わりません (すなわち、func は現在の関数と振り変わりません)。
TPEPROTO]
TPESYSTEM]
TPEOS]
tpservice(3c)、tpunadvertise(3c)
#include <atmi.h>
char * tpalloc(char *type, char *subtype, long size)
tpalloc() は、type タイプのバッファを指すポインタを返します。バッファのタイプによっては、subtype と size は両方とも省略することができます。Oracle Tuxedo ATMI システムには、様々なタイプのバッファが提供されており、しかもアプリケーションは自由に独自のバッファ タイプを追加することができます。詳細については、tuxtypes(5) を参照してください。
ある特定のバッファ タイプの tmtype_sw で subtype が NULL でない場合、tpalloc() を呼び出す際に subtype を指定しなければなりません。割り当てるバッファは少なくとも size および dfltsize と同じ大きさにします。ここで、dfltsize は特定のバッファ タイプの tmtype_sw に指定するデフォルトのバッファ サイズです。バッファ タイプが STRING の場合、最小は 512 バイトです。バッファ タイプが FML あるいは VIEW の場合、最小は、1024 バイトです。
なお、type の最初の 8 バイトと subtype の最初の 16 バイトだけが有効です。
あるバッファ タイプは使用する前に初期化が必要です。tpalloc() は、バッファが割り当てられて返される前に (Oracle Tuxedo ATMI システム固有の方法で) バッファを初期化します。このため、呼び出し側から返されるバッファはすぐに使用できます。ただし、初期化ルーチンがバッファをクリアしないかぎり、そのバッファは tpalloc() によってゼロに初期化されません。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tpalloc() の呼び出しを発行できます。
正常終了の場合、tpalloc() は long ワードの適切なタイプのバッファを指すポインタを返します。それ以外の場合は NULL を返し、tperrno を設定して条件を示します。
異常終了時には、tpalloc() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPENOENT]
TPEPROTO]
TPESYSTEM]
TPEOS]
バッファの初期化が失敗した場合、割り当てられたバッファは解放され、tpalloc() は、異常終了して NULL を返します。
この関数を、C ライブラリの malloc()、realloc()、または free() と組み合わせて使用するのは避けてください (tpalloc() で割り当てたバッファを、free() を使用して解放しないでください)。
Oracle Tuxedo ATMI システムの拡張に準拠した実装は、すべて 2 つのバッファ タイプをサポートしています。詳細については、「C 言語アプリケーション トランザクション モニタ インタフェースについて」を参照してください。
tpfree(3c)、tprealloc(3c)、tptypes(3c)
tpappthrinit() - アプリケーション生成のサーバ スレッドで新しい Tuxedo コンテキストを生成および初期化するルーチン
#include <atmi.h>
int tpappthrinit(TPINIT *tpthrinfo);
tpappthrinit() は、アプリケーション生成のサーバ スレッドで新しい Tuxedo コンテキストを生成します。tpappthrinit() によって生成されたコンテキストは、アプリケーション サーバが存在するドメインに接続し、新しく生成されたコンテキストに現在のアプリケーション スレッドのコンテキストを設定します。
Tuxedo サーバ プロセス内のアプリケーション生成スレッドが Tuxedo ATMI システムの通信ルーチンまたはトランザクション ルーチンを使用するには、まず tpappthrinit() を呼び出すか、自身を tpsetctxt() を使用して有効なコンテキストに対応付ける必要があります。
tpappthrinit() が正常終了した後、アプリケーション生成のサーバ スレッドはサービス要求を開始し、トランザクションを定義できます。
| 注意 : | アプリケーション スレッドは、tpreturn() および tpforward() を呼び出すことはできません。アプリケーション スレッドは、非請求メッセージを送信することはできますが、受信することはできません。 |
tpappthrinit() が正常に終了した後、アプリケーション生成のサーバ スレッドは tpgetctxt() を呼び出して現在のコンテキストを取得し、そのコンテキストを、別のアプリケーション生成のサーバ スレッドで呼び出した tpsetctxt() にパラメータとして渡すことで、自身を別のコンテキストに対応付けることができます。
| 注意 : | サービス ルーチンで tpappthrinit() によって生成されたコンテキストを設定することはできません。 |
tpappthrinit() の引数 tpthrinfo は、タイプが TPINIT、サブタイプが NULL の型付きバッファです。TPINIT はバッファ タイプであり、ヘッダ ファイル atmi.h に定義されています。このバッファは、tpappthrinit() を呼び出す前に tpalloc() で割り当てなければなりません。このバッファの解放は、tpappthrinit() の呼び出しの後、tpfree() を使用して行います。
TPINIT 構造体の説明については、tpinit() ルーチンを参照してください。tpappthrinit() に認証情報を渡す場合、tpthrinfo のメンバーである usrname、data、および datalen が使用されます。tpthrinfo のメンバーである cltname、grpname、および passwd は現在使用されないため、長さが 0 の文字列に設定する必要があります。TPINIT のメンバーである flags も、tpappthrinit() では使用されません。
tpappthrinit() は、アプリケーション生成のサーバ スレッドでのみ呼び出すことができます。サーバをビルドする場合、buildserver で -t オプションを指定する必要があります。
| 注意 : | tpappthrinit() はサービス ルーチンでは使用できません。 |
Tuxedo コンテキストが正常に生成および初期化されると、tpappthrinit() が 0 を返します。
異常終了すると、この関数は、呼び出し側スレッドが TPNULLCONTEXT の状態のままで -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpappthrinit() は tperrno を次のいずれかの値に設定します。
[TPEINVAL]
[TPEPROTO]
tpappthrinit() が不正に呼び出されました。たとえば、クライアント プログラムまたはサーバ ルーチンで呼び出されているか、buildserver -t オプションでサーバがビルドされていません。
[TPENOENT]
[TPEPERM]
[TPESYSTEM]
[TPEOS]
tpappthrterm(3c)、tpinit(3c)、tpterm(3c)、tpgetctxt(3c)、tpsetctxt(3c)
「マルチスレッドおよびマルチコンテキスト アプリケーションのプログラミング」
tpappthrterm() - アプリケーション生成のサーバ スレッドの tpappthrinit() によって生成された Tuxedo コンテキストを終了するルーチン
#include<atmi.h>
int tpappthrterm(void);
tpappthrterm() は、現在の Tuxedo コンテキストを削除し、現在のアプリケーション生成のサーバ スレッドのコンテキストに TPNULLCONTEXT を設定します。アプリケーション スレッドがトランザクション モードであると、トランザクションはロールバックします。tpappthrterm() が正常に終了すると、呼び出し側はほとんどの Tuxedo ATMI クライアントの操作を行えなくなります。未終了の会話はただちに切断されます。
tpappthrterm() は、tpappthrinit() によって生成されたコンテキストを終了する場合にのみ使用できます。この関数はアプリケーション生成のサーバ スレッドでのみ呼び出すことができます。サーバをビルドする場合、buildserver で -t オプションを指定する必要があります。
| 注意 : | tpappthrterm() は、サービス ルーチンや、サーバ ディスパッチ コンテキストに現在対応付けられているアプリケーション生成のサーバ スレッドで使用することはできません。 |
アプリケーション生成のサーバ スレッドのコンテキストでほかのアプリケーション生成のサーバ スレッドがまだ処理を行っている場合は、そのコンテキストで tpappthrterm() を呼び出さないようにする必要があります。
Tuxedo コンテキストが正常に終了すると、tpappthrterm() が 0 を返し、現在のコンテキストに TPNULLCONTEXT が設定されます。
異常終了すると、tpappthrterm() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpappthrterm() は tperrno を次のいずれかの値に設定します。
[TPEPROTO]
tpappthrterm() が不正に呼び出されました。たとえば、クライアント プログラムまたはサービス ルーチンで呼び出されているか、サーバ ディスパッチ コンテキストに現在対応付けられているアプリケーション生成のサーバ スレッドで呼び出されています。
[TPESYSTEM]
[TPEOS]
tpappthrinit(3c)、tpinit(3c)、tpgetctxt(3c)、tpsetctxt(3c)、tpterm(3c)
「マルチスレッドおよびマルチコンテキスト アプリケーションのプログラミング」
tpbegin()—トランザクションを開始するためのルーチン
#include <atmi.h>
int tpbegin(unsigned long timeout, long flags)
Oracle Tuxedo ATMI システムにおけるトランザクションは、完全に成功するか、あるいは何も影響を残さない 1 つの論理的な作業単位を定義するときに使用します。トランザクションにより、多くのプロセスで (そして、多分様々なサイトで) 行われる作業を 1 つの分割できない単位として扱うことができます。トランザクションの開始プロセスは tpbegin() とともに、tpcommit() または tpabort() を使用して、トランザクション内での処理を記述します。一旦 tpbegin() が呼び出されると、他のプロセスとの通信は、後のプロセス (つまりサーバ) を「トランザクション モード」にすることができます (つまり、サーバの作業はトランザクションの一部となります)。トランザクションに参加したプロセスを参加リソースと呼びます。トランザクションには、必ず 1 つの実行元があり、いくつかの参加リソースをもつことができます。tpcommit() または tpabort() を呼び出せるのは、トランザクションの実行元だけです。参加リソースは、tpreturn() を呼び出したときに使用する戻り値 (rvals) によって、トランザクションの結果に影響を与えることができます。トランザクション モードに入ると、サーバに出されたサービス要求はすべて、トランザクションの一部として処理されます (明示的にリクエスタからのそれ以外の指定がない場合)。
また、会話型サーバに対して確立されたオープン接続があるときにプログラムがトランザクションを起動しても、これらの接続はトランザクション モードには変わりません。これは、tpconnect() の呼び出し時に TPNOTRAN フラグを指定したことと同じです。
tpbegin() の最初の引数 timeout は、トランザクションのタイムアウトまでの時間を最低 timeout 秒にすることを指定します。トランザクションはタイムアウト時間を経過した後は、「アボートのみ」としてマーク付けされます。timeout の値が 0 であると、トランザクションにはシステムが許すかぎりの最大時間 (秒単位) のタイムアウト値が与えられます (つまり、このときのタイムアウト値は、システムが定義している符号なし long 型の最大値になります)。
現時点では、tpbegin() の第 2 引数 flags は将来の用途のために予約されており、必ず 0 を指定してください。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpbegin() の呼び出しを発行できません。
異常終了すると、tpbegin() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpbegin() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPETRAN]
TPEPROTO]
TPESYSTEM]
TPEOS]
Oracle Tuxedo ATMI システムのトランザクションを記述するために tpbegin()、tpcommit()、および tpabort() を使用する場合、XA インタフェースに準拠した (呼び出し側に妥当にリンクされている) リソース マネージャが行う作業のみがトランザクションの特性を備えていることを記憶しておくことが重要です。トランザクションにおいて実行される他のすべての操作は、tpcommit() あるいは tpabort() のいずれにも影響されません。リソース マネージャによって実行される操作が、Oracle Tuxedo ATMI システムのトランザクションの一部となるように、XA インタフェースを満たすリソース マネージャをサーバにリンクします。詳しくは、buildserver() を参照してください。
tpabort(3c)、tpcommit(3c)、tpgetlev(3c)、tpscmt(3c)
tpbroadcast() - 名前によって通知をブロードキャストするルーチン
#include <atmi.h>
int tpbroadcast(char *lmid, char *usrname, char *cltname,
char *data, long len, long flags)
tpbroadcast() は、クライアント プロセスやサーバ プロセスがシステム内に登録されているクライアントに非請求メッセージを送ることができるようにします。対象のクライアント セットは、tpbroadcast() に渡されるワイルドカード以外の識別子すべてと一致するクライアントで構成されます。識別子の指定にワイルドカードを使用できます。
lmid、usrname および cltname は、対象のクライアント セットの選択に使用する論理識別子です。引数の NULL 値は、その引数のワイルドカードとなります。ワイルドカード引数は、そのフィールドの全クライアント識別子と一致します。長さ 0 の文字列の引数は、長さ 0 のクライアント識別子とのみ一致します。各識別子は、システムが有効とみなすよう定義されたサイズの制約事項を満たさなければなりません。つまり、各識別子の長さは 0 から MAXTIDENT 文字まででなければなりません。
この要求のデータ部は data によって示され、以前に tpalloc() によって割り当てられたバッファです。len に送信するデータの大きさを指定します。ただし、data が長さの指定を必要としないタイプのバッファを指す場合 (たとえば、FML フィールド化バッファ)、len は 0 でかまいません。また、data は NULL であってもかまいません。この場合、len は無視されます。このバッファは、他の送受信されるメッセージと同様、型付きバッファ スイッチ ルーチンで処理されます。たとえば、エンコード/デコードは自動的に行われます。
TPNOBLOCK
TPNOTIME
TPSIGRSTRT
tpbroadcast() が正常終了した場合には、メッセージはシステムに渡され、選択されたクライアントに転送されます。tpbroadcast() は、選択された各クライアントにメッセージが送られるのを待機しません。
異常終了すると、tpbroadcast() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了には、tpbroadcast() はアプリケーション クライアントにブロードキャスト メッセージを送信せず、tperrno を次のいずれかの値に設定します。
TPEINVAL]
LMID を使用すると、tpbroadcast() は正常に働かず、TPEINVAL が返されます。ただし、存在しないユーザやクライアントの名前の場合は、どこにもブロードキャストされないだけでこのルーチンは正常に終了します。
TPETIME]
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpnotify(3c) で説明したインタフェースはすべて、ネイティブ サイトの UNIX システムベースのプロセッサ上で利用できます。さらに、ルーチン tpbroadcast() と tpchkunsol() は、関数 tpsetunsol() と共に、UNIX システムおよび MS-DOS ベースのプロセッサ上で利用することができます。
シグナル ベースの通知方法を選択したクライアントは、シグナルに関する制約から、システムがシグナルで通知を制御することはできません。このような状態で通知がなされた場合、システムは、選択されたクライアントに対する通知方法をディップ インに切り替えることを示すログ メッセージを生成し、以後、クライアントにはディップ イン方式で通知が行われることになります (通知方法の詳細については、UBBCONFIG() の RESOURCES セクションの NOTIFY パラメータの説明を参照してください)。
クライアントのシグナル通知は、常にシステムによって行われるので、元の通知呼び出しがどこで行われるかにかかわらず、通知の形態は一貫しています。したがって、シグナル ベースの通知を使用するには次の条件が必要です。
アプリケーション管理者の ID は、アプリケーション コンフィグレーションの一部として識別されます。
あるクライアントに対してシグナル ベースの通知方法を選択すると、いくつかの ATMI 呼び出しは異常終了します。TPSIGRSTRT の指定がなければ非請求メッセージを受け取るため、TPGOTSIG を返します。通知方法の選択については、「UBBCONFIG(5)」および「tpinit(3c)」を参照してください。
tpalloc(3c)、tpinit(3c)、tpnotify(3c)、tpterm(3c)、UBBCONFIG(5)
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() によって割り当てられたバッファを指していなければなりません。同じバッファを送信と受信の両方に使用する場合には、odata を idata のアドレスに設定してください。FML と FML32 バッファは、通常最小サイズ 4096 バイトを確保します。したがって、応答が 4096 バイトより大きい場合には、バッファ サイズは返されるデータを入れるのに十分な大きさに拡大します。また、tpcall() が呼び出されたときに idata と *odata が同じであり、*odata が変更された場合、idata は有効なアドレスを指しません。古いアドレスの使用は、データの破損やプロセスの例外の原因になります。リリース 6.4 では、バッファに対するデフォルトの割り当ては 1024 バイトです。また、最近使用したバッファの履歴情報が保持され、最適サイズのバッファをリターン バッファとして再利用できます。
容量まで満たされていないかもしれない送信者側のバッファ (たとえば、FML または FML32 バッファ) は、送信に使用されたサイズになります。システムは、受信データのサイズを任意の量で拡大します。これは、受信者が送信者の割り当てたバッファ サイズより小さく、送信されたデータのサイズより大きいバッファを受け取ることを意味します。
受信バッファのサイズは、増加することも減少することもあります。また、アドレスもシステムがバッファを内部で交換するごとに常に変更されます。応答バッファのサイズが変わったどうか (また変わったとしたらどれくらい変わったのか) を決定するには、tpgetrply() が *len とともに発行される前に、合計サイズを比べてください。バッファ管理の詳細については、「C 言語アプリケーション トランザクション モニタ インタフェースについて」を参照してください。
*olen が戻り時に 0 であると、応答にはデータ部がなく、*odata も、それが指すバッファも変更されていません。*odata または *olen が NULL であると、エラーになります。
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]
TPENOENT]
TPEITYPE]
TPEOTYPE]
TPNOCHANGE が flags に設定されているか、*odata のタイプとサブタイプがそのサービスから送られた応答のタイプおよびサブタイプと一致しません。*odata、その内容、そして *olen はいずれも変更されません。サービス要求が呼び出し側の現在のトランザクションの一部として発行されると、応答が破棄されるので、そのトランザクションに中途終了マークが付けられます。
TPETRAN]
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。いずれの場合も、*odata、その内容、*olen はどれも変更されません。
TPETIME が発生します。ただし、例外が 1 つあります。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態に置かれます。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPESVCFAIL]
TPFAIL で tpreturn() を呼び出しました。これは、アプリケーション レベルの障害です。サービスの応答の内容 (送信された場合) は、*odata が示すバッファに入ります。呼び出し側のトランザクションの一部としてサービス要求が出された場合、トランザクションには中途終了マークが付けられます。トランザクションがタイムアウトしたかどうかに関わりなく、トランザクションがアボートされる前の通信で有効であるのは、TPNOREPLY、TPNOTRAN、および TPNOBLOCK を設定した tpacall() の呼び出しだけです。
TPESVCERR]
tpreturn(3c) または tpforward(3c) のいずれかでエラーを検出しました (たとえば、誤った引数が渡された場合など)。このエラーが生じた場合には、応答データは返されません (つまり、*odata、その内容、*olen はいずれも変更されません)。呼び出し側のトランザクションの一部としてサービス要求が出された場合 (つまり、TPNOTRAN が設定されていない場合)、このトランザクションは中途終了マークが付けられます。トランザクションがタイムアウトしたかどうかに関わりなく、トランザクションがアボートされる前の通信で有効であるのは、TPNOREPLY、TPNOTRAN、および TPNOBLOCK を設定した tpacall() の呼び出しだけです。UBBCONFIG ファイル中の SVCTIMEOUT か、TM_MIB 中の TA_SVCTIMEOUT が 0 でない場合にサービスのタイムアウトが発生すると、TPESVCERR が返されます。
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
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)
tpcancel() - 未終了の応答に対する呼び出し記述子を無効にするためのルーチン
#include <atmi.h>
int tpcancel(int cd)
tpcancel() は、tpacall() が返す呼び出し記述子 cd を取り消します。トランザクションに関連している呼び出し記述子を無効にしようとするとエラーになります。
正常終了の場合、cd は以後無効になり、cd のために受信する応答はすべて、何の警告もなく捨てられてしまいます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpcancel() の呼び出しを発行できません。
異常終了すると、tpcancel() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpcancel() は tperrno を次のいずれかの値に設定します。
TPEBADDESC]
TPETRAN]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpchkauth() - アプリケーションへの参加に認証が必要であるか検査するルーチン
#include <atmi.h>
int tpchkauth(void)
tpchkauth() は、アプリケーションのコンフィグレーションが認証を必要としているかどうかを調べます。これは一般に、tpinit() を呼び出す前にアプリケーション クライアントが使用して、ユーザからのパスワードの入力を必要とするかどうかを判別します。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpchkauth() の呼び出しを発行できません。
tpchkauth() は、正常終了時に次のような負でない値を返します。
TPNOAUTH
TPSYSAUTH
TPAPPAUTH
異常終了すると、tpchkauth() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpchkauth() は tperrno を次のいずれかの値に設定します。
TPESYSTEM]
TPEOS]
tpchkauth() は、リリース 4.2 以降を使用しているサイトでしか使用できません。
tpchkauth(3c) に記述されているインタフェースは、UNIX、Windows、および MS-DOS オペレーティング システム上でサポートされています。
tpchkunsol() - 非請求メッセージを検査するルーチン
#include <atmi.h>
int tpchkunsol(void)
tpchkunsol() は、クライアントが非請求メッセージの検査を行うときに使用します。クライアントでシグナル ベースの通知方法を使用してこのルーチンを呼び出しても、何も行われず、ただちに終了します。この呼び出しには引数はありません。このルーチンを呼び出すと、アプリケーションで定義された非請求メッセージ処理ルーチンへの呼び出しが Oracle Tuxedo ATMI システムのライブラリによって行われることがあります。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpchkunsol() の呼び出しを発行できません。
正常終了の場合、tpchkunsol() は、ディスパッチされた非請求メッセージの番号を返します。異常終了すると、tpchkunsol() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpchkunsol() は tperrno を次のいずれかの値に設定します。
TPEPROTO]
TPESYSTEM]
TPEOS]
tpnotify(3c) で説明したインタフェースはすべて、ネイティブ サイトの UNIX システムベースのプロセッサ上で利用できます。さらに、ルーチン tpbroadcast() と tpchkunsol() は、関数 tpsetunsol() と共に、UNIX システムおよび MS-DOS ベースのプロセッサ上で利用することができます。
シグナル ベースの通知方法を選択したクライアントは、シグナルに関する制約から、システムがシグナルで通知を制御することはできません。このような状態で通知がなされた場合、システムは、選択されたクライアントに対する通知方法をディップ インに切り替えることを示すログ メッセージを生成し、以後、クライアントにはディップ イン方式で通知が行われることになります。通知方法の詳細については、UBBCONFIG(5) の RESOURCES セクションの NOTIFY パラメータの説明を参照してください。
クライアントのシグナル通知は、常にシステムによって行われるので、元の通知呼び出しがどこで行われるかにかかわらず、通知の形態は一貫しています。したがって、シグナル ベースの通知を使用するには次の条件が必要です。
アプリケーション管理者の ID は、アプリケーション コンフィグレーションの一部として識別されます。
あるクライアントに対してシグナル ベースの通知方法を選択すると、いくつかの ATMI 呼び出しは異常終了します。TPSIGRSTRT の指定がなければ非請求メッセージを受け取るため、TPGOTSIG を返します。通知方法の選択については、「UBBCONFIG(5)」および「tpinit(3c)」を参照してください。
tpbroadcast(3c)、tpinit(3c)、tpnotify(3c)、tpsetunsol(3c)
tpclose() - リソース マネージャをクローズするルーチン
#include <atmi.h>
int tpclose(void)
tpclose() は、呼び出し側とそれにリンクされたリソース マネージャとの関係を絶ちます。リソース マネージャはクローズの内容がそれぞれで異なるため、個々のリソース マネージャをクローズするために必要な情報をコンフィグレーション ファイルに記述します。
リソース マネージャがすでにクローズしている場合 (すなわち、tpclose() が 1 回以上呼び出された)、何も処理は行われず、正常終了を示すコードが返されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpclose() の呼び出しを発行できません。
異常終了すると、tpclose() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpclose() は tperrno を次のいずれかの値に設定します。
TPERMERR]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpcommit() - 現在のトランザクションをコミットするルーチン
#include <atmi.h>
int tpcommit(long flags)
tpcommit() はトランザクションの終了 (コミット) を示します。tpcommit() は 2 フェーズ コミット プロトコルを使用して、参加リソース間の調整をとります。tpcommit() は、トランザクションの開始プロセスからのみ呼び出されます。いずれかの参加リソースがトランザクションをコミットできない場合 (たとえば、それらが tpreturn() を呼び出したときに TPFAIL が返された場合など)、そのトランザクション全体がアボートし、tpcommit() は異常終了します。つまり、そのトランザクションに関連して各プロセスが行ったすべての作業は取り消されます。すべての参加リソースがトランザクションの中のそれぞれが担当する部分のコミットを決定した場合、この決定は安定したストレージに記録された後、すべての参加リソースに対して作業のコミットが要求されます。
コミットの決定が記録された後、あるいは 2 フェーズ コミット プロトコルが完了した後、TP_COMMIT_CONTROL 特性の設定条件に従って (tpscmt(3c) を参照)、tpcommit() は正常に終了することができます。コミットの決定が記録された後、第 2 フェーズが完了する前 (TP_CMT_LOGGED) に tpcommit() が終了する場合、すべての参加リソースはトランザクションに代わって行った作業内容をコミットすることに同意していると見なし、第 2 フェーズでトランザクションをコミットする約束を果たすようにする必要があります。ただし、tpcommit() は第 2 フェーズが完了する前に終了してしまうので、参加リソースの中には、この関数が正常終了した場合でもトランザクションの担当部分をヒューリスティックに (コミットの決定とは矛盾するような方法で) 完了するといった状況が発生してしまいます。
TP_COMMIT_CONTROL 特性が、2 フェーズ コミット プロトコルの完了 (TP_CMT_COMPLETE) 後に tpcommit() が終了するように設定されている場合、その戻り値には、トランザクションの正確な状態が反映されます (つまり、トランザクションがヒューリスティックに完了するかどうか)。
なお、トランザクションに 1 つのリソース マネージャしか関与していない場合には、1 フェーズ コミットが行われます (つまり、リソース マネージャには、コミットできるかどうかの確認はされず、単にコミットの指示が出されます)。そして、この場合、TP_COMMIT_CONTROL 特性はコミットには関係せず、tpcommit() はヒューリスティックに得られた結果 (もしあれば) を返します。
未終了の応答に対する呼び出し記述子が存在するときに tpcommit() を呼び出すと、この関数の終了時に、トランザクションはアボートし、呼び出し側のトランザクションに関連しているこれらの記述子は以後無効になります。呼び出し側のトランザクションに関連がない呼び出し記述子の状態は有効のままです。
tpcommit() は、呼び出し側のトランザクションに関連しているすべての接続をクローズしたあと呼び出されなければなりません (そうでないと、TPEABORT が返され、トランザクションはアボートし、これらの接続は、TPEV_DISCONIMM イベントを使用して不規則に切断されます)。tpbegin() の前あるいは TPNOTRAN フラグの指定を付けてオープンされた接続 (つまり、トランザクション モードでない状態での接続) は、tpcommit() または tpabort() の影響を受けません。
現時点では、tpcommit() の唯一の引数 flags は、将来の用途のために予約されており、必ず 0 を指定してください。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpcommit() の呼び出しを発行できません。
異常終了すると、tpcommit() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpcommit() は tperrno を次のいずれかの値に設定します。
TPEABORT]
tpcommit() が未終了の応答が残っているか、会話型接続をオープンしたまま呼び出された場合にも返されます。
TPEHAZARD]
TPEHEURISTIC]
TPEINVAL]
TPEOS]
TPEPROTO]
TPESYSTEM]
TPETIME]
TPEABORT が返されます。
Oracle Tuxedo ATMI システムのトランザクションを記述するために tpbegin()、tpcommit()、および tpabort() を使用する場合、XA インタフェースに準拠した (呼び出し側に妥当にリンクされている) リソース マネージャが行う作業のみがトランザクションの特性を備えていることを記憶しておくことが重要です。トランザクションにおいて実行される他のすべての操作は、tpcommit() あるいは tpabort() のいずれにも影響されません。そのリソース マネージャが行った処理が Oracle Tuxedo ATMI システムのトランザクションの一部となるよう、XA インタフェースを満たすリソース マネージャをサーバにリンクする方法については、「buildserver(1)」を参照してください。
tpabort(3c)、tpbegin(3c)、tpconnect(3c)、tpgetlev(3c)、tpreturn(3c)、tpscmt(3c)
tpconnect() - 会話型サービス ルーチンの接続を設定するルーチン
#include <atmi.h>
int tpconnect(char *svc, char *data, long len, long flags)
tpconnect() により、プログラムは会話型サービス svc との半二重接続をセットアップすることができます。この名前は、会話型サーバがポストした会話型サービス名の 1 つでなければなりません。
呼び出し側は、接続セットアップ処理の一部として、アプリケーション定義データをリスニング プログラムに渡すことができます。呼び出し側がデータを渡す選択をした場合には、data は tpalloc() が以前に割り当てたバッファを指していなければなりません。len には送信バッファの大きさを指定します。ただし、data が長さの指定を必要としないバッファを指している場合 (FML フィールド化バッファなど)、len は無視されます (0 でかまいません)。また、data は NULL の場合もあります。この場合、len は無視されます (アプリケーション データは会話型サービスに渡されません)。data のタイプとサブタイプは、svc が認識するタイプおよびサブタイプと一致しなければなりません。data と len は、該当サービスの呼び出し時に使用する TPSVCINFO 構造体を介して会話型サービスに渡されます。また、サービスはこのデータの取得に tprecv() を呼び出す必要はありません。
TPNOTRAN
svc が呼び出されたときに、このプロセスは呼び出し側のトランザクションの一部として実行されません。svc が依然としてトランザクション モードで起動される場合がありますが、それは同じトランザクションでないことに注意してください。svc は、コンフィグレーション属性で、自動的にトランザクション モードで呼び出されるようにすることができます。このフラグを設定するトランザクション モードの呼び出し側は、トランザクション タイムアウトの影響を受けます。サービスが異常終了した場合でも、起動時にこのフラグが設定されていれば、呼び出し側のトランザクションに影響は及びません。
TPSENDONLY
TPSENDONLY または TPRECVONLY のいずれかを指定しなければなりません。
TPRECVONLY
TPSENDONLY または TPRECVONLY のいずれかを指定しなければなりません。
TPNOBLOCK
tpconnect() の送信部分にだけ適用されます。関数は、サーバからの承認を待つ間ブロックする場合があります。TPNOBLOCK が指定されておらず、ブロッキング条件が存在する場合、条件の解除、またはブロッキング タイムアウトあるいはトランザクション タイムアウトが発生するまで呼び出し側はブロックされます。
TPNOTIME
TPSIGRSTRT
マルチスレッド アプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpconnect() の呼び出しを発行できません。
tpconnect() が正常に終了した場合、以後の呼び出しでの接続を指すのに使用する記述子を返します。エラー時には、-1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpconnect() は tperrno を次のいずれかの値に設定します (特に記述した場合を除いては、エラーが呼び出し側のトランザクションに影響を及ぼすことはありません)。
TPEBLOCK]
TPEINVAL]
svc が NULL、data が NULL でなく tpalloc() で割り当てられたバッファを指していない、TPSENDONLY または TPRECVONLY が flags に指定されていない、あるいは flags が無効であるなど)。
TPEITYPE]
TPELIMIT]
TPENOENT]
TPEOS]
TPEPROTO]
TPESYSTEM]
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。
TPETIME で異常終了します。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態に置かれます。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPETRAN]
TPGOTSIG]
tpalloc(3c)、tpdiscon(3c)、tprecv(3c)、tpsend(3c)、tpservice(3c)
tpconvert() - 構造体の文字列表現とバイナリ表現の間の変換
#include <atmi.h>
#include <xa.h>
int tpconvert(char *strrep, char *binrep, long flags)
tpconvert() は、インタフェース構造体の文字列表現 (strrep) とバイナリ表現 (binrep) の間で変換を行います。
変換の方向およびインタフェース構造体のタイプは、どららも flags 引数で指定します。バイナリ表現から文字列表現へ変換する場合は、flags の TPTOSTRING ビットをセットし、文字列からバイナリへ変換する場合は、このビットをリセットします。変換する構造体のタイプを示すフラグは次のように定義されており、同時に 1 つのフラグのみを指定できます。
TPCONVCLTID
TPCONVTRANID
TPCONVXID
バイナリ表現から文字列表現に変換する場合、strrep は最低でも TPCONVMAXSTR 文字の長さがなければなりません。
TPTRANID と XID の値が異なる文字列バージョンをキー フィールドとして許す TM_MIB(5) クラス (たとえば T_TRANSACTION および T_ULOG) にアクセスする場合は、システムはこれらの値を等しいものとして扱うことに注意してください。したがって、アプリケーション プログラムでは、これらのデータ タイプの文字列の値を作ったり操作したりすべきではありません。これらの値のいずれかがキー フィールドとして使用される場合、TM_MIB(5) は文字列で識別されるグローバル トランザクションに一致するオブジェクトのみが返されることを保証します。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tpconvert() の呼び出しを発行できます。
異常終了すると、tpconvert() は -1 を返し、tperrno を設定してエラー条件を示します。
次の条件が発生すると、tpconvert() は失敗し、tperrno を次のように設定します。
TPEINVAL]
TPEOS]
TPESYSTEM]
userlog(3c) に書き込まれます。
このインタフェースは、Oracle Tuxedo ATMI リリース 5.0 またはそれ以降でしか利用できません。このインタフェースは、ワークステーション プラットフォームで利用できます。
tpresume(3c)、tpservice(3c)、tpsuspend(3c)、tx_info(3c)、TM_MIB(5)
tpconvmb() - 入力バッファ内にある文字のエンコードを対象の名前付きのエンコードに変換
#include <atmi.h>
extern int tperrno;
int
tpconvmb (char **bufp, int *len, char *target_encoding, long flags)
この関数は、入力バッファを目的のコードセットのエンコードに変換する場合に使用します。
この関数は、ユーザの利便性を考慮して追加されたものであり、通常の自動によるコードセットのデータ変換では必須ではありません。
引数 bufp は、MBSTRING 型付きバッファのメッセージを指す有効なポインタです。バッファのサイズが変換済みバッファの出力データの処理に不十分な場合、このポインタは内部的に再割り当てされます。
入力での引数 len には、変換に必要なバイト数が入ります。変換が正常に終了すると、bufp で使用されたバイト数が入ります。
引数 target_encoding は、bufp メッセージで提供される型付きバッファの変換に使用する対象のコードセットのエンコード名です。
引数 flags は、Tuxedo 変換コードでは使用されず、ユーザ定義の変換関数用のバッファ タイプ スイッチ関数に渡されます。
tpconvmb() は、正常終了時には 0 を返し、エラー発生時には -1 を返し、次のように tperrno を設定します。この関数は、次の原因により異常終了する可能性があります。
TPEINVAL]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpalloc(3c)、tpgetmbenc(3c)、tpsetmbenc(3c)
tpcryptpw() - 管理要求内のアプリケーション パスワードを暗号化
#include <atmi.h>
#include <fml32.h>
int tpcryptpw(FBFR32 *buf)
tpcryptpw() は、サービスにリクエストを送る前に管理要求バッファ内のアプリケーション パスワードを暗号化するために使用します。アプリケーション パスワードは、FML32 フィールド識別子 TA_PASSWORD を用いて文字列値として保存されます。この暗号化は、テキストレベルのパスワードが危険にさらされず、すべてのアクティブなアプリケーション サイトに適当なパスワードの更新が伝播することを保証するために必要です。付加的なシステム フィールドが呼び出し側のバッファに追加され、既存のフィールドが要求を満たすために変更されることがあります。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tpcryptpw() の呼び出しを発行できます。
異常終了すると、tpcryptpw() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpcryptpw() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPEPERM]
TPEOS]
TPESYSTEM]
userlog(3c) に書き込まれます。
このインタフェースは、Oracle Tuxedo ATMI リリース 5.0 またはそれ以降が稼動する UNIX System のサイトでしか利用できません。このインタフェースはワークステーション クライアントでは利用できません。
${TUXDIR}/lib/libtmib.a、${TUXDIR}/lib/libtmib.so.rel
『Oracle Tuxedo アプリケーション実行時の管理』
tpdequeue() - キューからメッセージを取り出すルーチン
#include <atmi.h>
int tpdequeue(char *qspace, char *qname, TPQCTL *ctl, char **data, long *len, long flags)
tpdequeue() は、キュー スペース qspace 内の qname で指定されるキューから、処理するメッセージを取り出します。
省略時設定では、キューの先頭のメッセージが取り出されます。キュー上のメッセージの順序は、そのキューの作成時に定義されます。アプリケーションは、ctl パラメータでメッセージ識別子または相関識別子を指定することにより、特定のメッセージのキューからの取り出しを要求できます。メッセージが現在利用できなかった場合にはアプリケーションはメッセージを待つということを示すために、ctl フラグを使用することもできます。ctl パラメータを使って、メッセージをキューから削除したりキューでのメッセージの相対位置を変更せずにメッセージを見ることができます。この後のこのパラメータについての説明を参照してください。
data は、メッセージの読み込み先であるバッファを指すポインタのアドレスです。len は、そのメッセージの長さを指します。**data は、事前に tpalloc() によって割り当てられたバッファを指さなければなりません。メッセージが tpdequeue に渡されるバッファよりも大きい場合、バッファはメッセージが入れる大きさまで拡大されます。メッセージ バッファのサイズに変化があるかどうかを判別するには、tpdequeue() が発行される前の (合計の) サイズを *len と比較します。*len のほうが大きい場合、バッファは大きくなっています。そうでない場合は、バッファのサイズは変更されていません。なお、*data は、バッファのサイズが大きくなったこと以外の理由でも変化する可能性があるので注意してください。終了時に *len が 0 である場合は、取り出されたメッセージにはデータ部がなく、*data も *data が指すバッファも変更されていません。*data または len が NULL であるとエラーになります。
呼び出し側がトランザクション モードにあり、TPNOTRAN フラグが設定されていない場合は、メッセージはトランザクション モードでキューから取り出されます。この結果、tpdequeue() が正常終了して呼び出し側のトランザクションが正常にコミットされると、要求はキューから削除されます。呼び出し側のトランザクションが、明示的に、またはトランザクション タイムアウトあるいは何らかの通信エラーの結果としてロールバックされると、メッセージはキュー上に残されます。つまり、キューからのメッセージの削除もロールバックされます。同じトランザクション内で、同じメッセージの登録と取り出しを行うことはできません。
呼び出し側がトランザクション モードにないか、または TPNOTRAN フラグが設定されている場合は、メッセージはトランザクション モードではキューから取り出されません。トランザクション モードでない場合に通信エラーまたはタイムアウトが発生した場合、アプリケーションには、メッセージが正しくキューから取り出されたかどうかがわからず、メッセージが失われることがあります。
TPNOTRAN
TPNOBLOCK
tperrno に TPEBLOCK が設定されます。このフラグが設定されていて、対象のキューが別のアプリケーションによって排他的にオープンされているなどのブロッキング条件が存在する場合には、呼び出しは異常終了して tperrno に TPEDIAGNOSTIC が設定され、TPQCTL 構造体の診断フィールドは QMESHARE に設定されます。後者の場合、Oracle Tuxedo ATMI システム以外の Oracle Products をベースとするアプリケーションが、キューイング サービス API (QSAPI) を使った排他的な読み書きのためのキューをオープンしています。
TPNOBLOCK が設定されていない場合に、ブロッキング状態が存在すると、その状態が解消されるかタイムアウト (トランザクション タイムアウトまたはブロッキング タイムアウト) が発生するまで、呼び出し側はブロックされます。(TPQCTL 構造体の) flags に TPQWAIT オプションが指定されている場合は、このブロッキング条件には、キュー自体のブロッキングは含まれません。
TPNOTIME
TPNOCHANGE
data が指すバッファのタイプは変更されません。デフォルトでは、*data が指すバッファとは異なるタイプのバッファが受信されると、受信側が着信バッファのタイプを識別する限り、*data のバッファ タイプは、受信されたバッファのタイプに変更されます。つまり、受信されたバッファのタイプおよびサブタイプは、*data が指すバッファのタイプおよびサブタイプと一致しなければなりません。
TPSIGRSTRT
tperrno は TPGOTSIG に設定されます。
tpdequeue() が正常終了すると、アプリケーションは、ctl データ構造体を使用してメッセージに関する追加情報を取得できます。この情報には、キューから取り出されたメッセージのメッセージ識別子、すべての応答または異常終了メッセージに付随して、発信元がメッセージと元の要求を結び付けることができるようにする相関識別子、メッセージが送られるサービスの品質、メッセージの応答が送られるサービスの品質、応答が要求された場合は応答キューの名前、およびメッセージをキューから取り出すときの失敗に関する情報をアプリケーションが登録できる異常終了キューの名前が含まれます。これらについて以下に説明します。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpdequeue() の呼び出しを発行できません。
TPQCTL 構造体は、アプリケーション プログラムが、キューからのメッセージの取り出しに関連するパラメータを渡したり、取得したりするために使用します。TPQCTL の要素 flags は、この構造体の他のどの要素が有効であるかを示すために使用されます。
tpdequeue() への入力時には、次の要素を TPQCTL 構造体に設定できます。
long flags; /* どの値が
* 設定されるかの指定 */
char msgid[32]; /* キューから取り出すメッセージの ID */
char corrid[32]; /* キューから取り出す
* メッセージの相関識別子 */
tpdequeue() の入力情報を制御する flags パラメータの有効なビットの一覧を次に示します。
TPNOFLAGS
TPQGETBYMSGID
ctl
msgid によって指定されたメッセージ識別子を持つメッセージのキューからの取り出しを要求します。メッセージ識別子は、事前の tpenqueue(3c) の呼び出しによって取得できます。メッセージが別のキューに移動すると、メッセージ識別子が変わることに注意してください。また、メッセージ識別子の値は 32 バイトすべてが意味を持つため、ctl
msgid によって指定された値を完全に初期化する必要があります (たとえば、NULL 文字で埋めるなど)。
TPQGETBYCORRID
ctl
corrid によって指定された相関識別子を持つメッセージのキューからの取り出しを要求します。相関識別子は、アプリケーションが tpenqueue() でキューにメッセージを登録したときに指定されます。また、相関識別子の値は 32 バイト全体が意味を持つため、ctl
corrid によって指定された値を完全に初期化する必要があります (たとえば、NULL 文字で埋めるなど)。
TPQWAIT
TPQWAIT が TPQGETBYMSGID または TPQGETBYCORRID と併せて設定されている場合、指定されたメッセージ識別子または相関識別子を持つメッセージがキューに存在しないときは、エラーが返されません。代わりに、基準を満たすメッセージを取り出せるようになるまで、プロセスは待機する必要があります。プロセスが呼び出し側のトランザクション タイムアウトに従っている場合、またはトランザクション モードでない場合、TMQUEUE プロセスに -t オプションで指定されたタイムアウトの影響を受けます。
tpdequeue は -1 を返し tperrno を TPEDIAGNOSTIC に設定し、TPQCTL 構造体の診断フィールドを QMESYSTEM に設定します。
TPQWAIT 制御パラメータを指定する tpdequeue() の各要求では、条件を満たすメッセージがすぐに利用できない場合、キュー マネージャ (TMQUEUE) のアクション オブジェクトを使用できる必要があります。アクション オブジェクトが使用できない場合、tpdequeue() 要求は失敗します。利用できるキュー マネージャのアクション数は、キュー スペースの作成時または変更時に指定されます。待機中のキューからの取り出し要求が完了すると、対応するアクション オブジェクトは別の要求に使用できるようになります。
TPQPEEK
tpdequeue() 操作に TPNOTRAN フラグが設定されていることを意味します。つまり、非破壊的なキューからの取り出しはトランザクションに含まれません。トランザクション終了前のトランザクション内で、キューに登録されたメッセージまたはキューから取り出されたメッセージを読み取ることはできません。
TPQPEEK を使用してメッセージを破棄せずにキューから取り出す場合、その取り出し要求をシステムが処理している短時間の間、非ブロッキング状態のほかのメッセージ取り出し操作にメッセージが認識されないことがあります。たとえば、メッセージ識別子や相関識別子などの特定の選択基準を使用してメッセージをキューから取り出す操作で、現在、非破壊的なキューから取り出し中のメッセージを検索する場合などです。
tpdequeue() からの出力時には、次の要素が TPQCTL 構造体に設定されます。
long flags; /* どの値が
* 設定されるかの指定 */
long priority; /* 登録優先順位 */
char msgid[32]; /* キューから取り出されたメッセージの ID */
char corrid[32]; /* メッセージを識別するときに
* 使用された相関識別子 */
long delivery_qos; /* 配信サービスの品質 */
long reply_qos; /* 応答メッセージのサービス品質 */
char replyqueue[16]; /* 応答のためのキュー名 */
char failurequeue[16]; /* 異常終了キューの名前 */
long diagnostic; /* 異常終了の原因 */
long appkey; /* アプリケーション認証用のクライアント
* キー */
long urcode; /* ユーザ戻り値 */
CLIENTID cltid; /* 発信元クライアントの
* クライアント識別子 */
次は、tpdequeue() からの出力情報を制御する flags パラメータの有効なビットです。これらのビットのいずれかについて、tpdequeue() の呼び出し時にフラグ ビットをオンにしていると、その構造体の対応する要素には、メッセージがキューに登録されたときに指定された値が格納され、そのビットは設定されたままになります。値が使用できない場合、または tpdequeue() を呼び出したときにビットが設定されていない場合、tpdequeue() はフラグをオフにして終了します。
TPQPRIORITY
tpdequeue() の呼び出しが正常終了し、メッセージが明示的な優先順位でキューに登録された場合、この優先順位が ctl
priority に格納されます。優先順位は 1 以上 100 以内の範囲内で、数値が高いほど優先順位も高くなります。つまり、高い数値のメッセージが低い数値のメッセージよりも先にキューから取り出されます。優先順位によって順序付けられていないキューの場合、値は情報にすぎません。
TPQMSGID
TPQCORRID
tpdequeue() の呼び出しが正常終了し、メッセージが相関識別子によってキューに登録された場合、この相関識別子が ctl
corrid に格納されます。相関識別子の値は、32 バイト全体が意味を持ちます。Oracle Tuxedo ATMI /Q が提供するメッセージの応答には、すべて元の要求メッセージの相関識別子が付いています。
TPQDELIVERYQOS
tpdequeue() の呼び出しが成功し、メッセージがサービスの配信品質と共にキューに登録されていた場合、TPQQOSDEFAULTPERSIST、TPQQOSPERSISTENT、または TPQQOSNONPERSISTENT フラグが ctl->delivery_qos に格納されます。メッセージがキューに登録されたときに配信サービスの品質が明示的に指定されていない場合は、対象となるキューのデフォルトの配信ポリシーによってメッセージ配信の品質が決まります。
TPQREPLYQOS
tpdequeue() の呼び出しが成功し、メッセージがサービスの応答品質と共にキューに登録されていた場合、TPQQOSDEFAULTPERSIST、TPQQOSPERSISTENT、または TPQQOSNONPERSISTENT フラグが ctl->reply_qos に格納されます。メッセージがキューに登録されていたときに応答のサービス品質が明示的に指定されていない場合、ctl->replyqueue キューのデフォルトの配信ポリシーによって、すべての応答に対する配信サービスの品質が決まります。
TPQREPLYQ
tpdequeue() の呼び出しが正常終了し、メッセージが応答キューによってキューに登録された場合、応答キューの名前が ctl
replyqueue に格納されます。メッセージへの応答は、要求メッセージと同じキュー スペース内の指定されたキューに登録されます。
TPQFAILUREQ
tpdequeue() の呼び出しが正常終了し、メッセージが異常終了キューによってキューに登録された場合、異常終了キューの名前が ctl
failurequeue に格納されます。異常終了メッセージは、要求メッセージと同じキュー スペース内の指定された異常終了キューに登録されます。
flags パラメータの残りのビットは、tpdequeue() が呼び出されるとクリア (0 に設定) されます。これには、TPQTOP、TPQBEFOREMSGID、TPQTIME_ABS、TPQTIME_REL、TPQEXPTIME_ABS、TPQEXPTIME_REL、および TPQEXPTIME_NONE が含まれます。これらのビットは、tpenqueue() の入力情報を制御する flags パラメータの有効なビットです。
tpdequeue() の呼び出しが異常終了して tperrno に TPEDIAGNOSTIC が設定された場合は、異常終了の原因を示す値が ctl
diagnostic に返されます。返される可能性のある値は、この後の「診断」の項で定義しています。
また出力時には、tpdequeue() 呼び出しが正常に終了すると、ctl
appkey にアプリケーション認証キーが設定され、ctl
cltid に要求の発信元であるクライアントの識別子が設定され、ctl
urcode にメッセージ登録時に設定されたユーザ戻り値が設定されます。
ctl パラメータが NULL である場合、入力フラグは TPNOFLAGS と見なされ、アプリケーション プログラムは出力情報を利用できません。
異常終了すると、tpdequeue() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpdequeue() は tperrno を次のいずれかの値に設定します (特に記述した場合を除いては、エラーが呼び出し側のトランザクションに影響を及ぼすことはありません)。
TPEINVAL]
TPENOENT]
qspace を利用できないので、これにアクセスできません (関連する TMQUEUE(5) サーバは利用できません)。または、グローバル トランザクション テーブル (GTT) にエントリがないので、グローバル トランザクションを開始できません。
TPEOTYPE]
TPNOCHANGE が flags に設定されているが、*data のタイプおよびサブタイプが、サービスによって送信された応答のタイプおよびサブタイプと一致しません。いずれの場合も、*data、その内容、および *len はいずれも変更されません。呼び出しがトランザクション モードで行われ、このエラーが発生すると、トランザクションはアボートのみになり、メッセージはキューに残ります。
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。いずれのケースでも、*data、その内容、*len はどれも変更されません。
TPETIME で異常終了します。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態に置かれます。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
TPEDIAGNOSTIC]
次の診断値は、キューからのメッセージの取り出し中に返されます。
QMEINVAL]
QMEBADRMID]
QMENOTOPEN]
QMETRAN]
TPNOTRAN フラグを設定して呼び出したために、メッセージをキューから取り出すトランザクション開始のエラーが発生しました。この診断は、Oracle Tuxedo リリース 7.1 以降のキュー マネージャからは返されません。
QMEBADMSGID]
QMESYSTEM]
QMEOS]
QMEABORTED]
QMEPROTO]
QMEBADQUEUE]
QMENOMSG]
QMEINUSE]
QMESHARE]
qmadmin(1)、tpalloc(3c)、tpenqueue(3c)、APPQ_MIB(5)、TMQUEUE(5)
tpdiscon() - 会話型サービスの接続を切断するルーチン
#include <atmi.h>
int tpdiscon(int cd)
tpdiscon() は、cd で指定された接続をただちに切断し、接続の他方の側で TPEV_DISCONIMM イベントを生成します。
tpdiscon() は、会話の起動側からしか呼び出せません。tpdiscon() は、呼び出しに使用された記述子に対応する会話型サービス内からは呼び出せません。会話型サービスは tpreturn() を使用して、会話の該当部分が完了したことを通知しなければなりません。同様に、会話型サービスとのやりとりを行うプログラムが tpdiscon() を呼び出す場合でも、そのサービスに tpreturn() で接続を切断するようにしてください。これによって、正しい結果が得られます。
tpdiscon() を使用すると、接続はただちに切断されます (すなわち、正常終了ではなく、アボート)。したがって、宛先に届いていないデータは失われます。tpdiscon() は、接続の他方の側のプログラムが呼び出し側のトランザクションに参加している場合でも発行されます。この場合、このトランザクションはアボートします。また、呼び出し側は、tpdiscon() が呼び出されるときにその接続の制御権をもっている必要はありません。
異常終了すると、tpdiscon() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpdiscon() は tperrno を次のいずれかの値に設定します。
TPEBADDESC]
TPETIME]
tpdiscon() を呼び出すと、tpdiscon() が正常に呼び出されても、トランザクションが「アボートのみ」とマークされる可能性があります。
TPETIME で異常終了します。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態に置かれます。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPEPROTO]
TPESYSTEM]
TPEOS]
tpabort(3c)、tpcommit(3c)、tpconnect(3c)、tprecv(3c)、tpreturn(3c)、tpsend(3c)
tpenqueue() - メッセージをキューに登録するルーチン
#include <atmi.h>
int tpenqueue(char *qspace, char *qname, TPQCTL *ctl, char *data, long len, long flags)
tpenqueue() は、キュー スペース qspace 内の qname で指定されるキューに、メッセージを格納します。キュー スペースは、キューを集めたもので、そのうちの 1 つのキューが qname でなければなりません。
メッセージが Oracle Tuxedo ATMI システムのサーバを対象としている場合、qname は、サーバによって提供されるサービスの名前に一致します。システムが提供するサーバである TMQFORWARD(5) は、メッセージをキューから取り出し、キューと同じ名前のサービスを提供するサーバにそのメッセージを転送するデフォルトの機構となります。発信元が応答を期待していた場合は、転送されたサービス要求への応答は、特に指定されている場合を除き、発信元のキューに格納されます。発信元は、後で応答メッセージをキューから取り出します。キューは、任意の 2 つの Oracle Tuxedo ATMI システムのプロセス間 (クライアントやサーバ) における信頼性の高いメッセージ転送機構用としても使用できます。この場合、キューの名前はサービス名とは一致せず、メッセージ転送のための名前に関連します。
data が NULL 以外である場合、これは事前に tpalloc() によって割り当てられたバッファを指さなければならず、len は、キューに登録されるバッファ内のデータの大きさを指定しなければなりません。長さを指定する必要のないタイプのバッファ (FML フィールド化バッファなど) を data が指す場合、len は無視されます。data が NULL の場合、len は無視され、データ部分なしでメッセージはキューに登録されます。
メッセージは、qspace について定義された優先順位が事前の tpsprio() の呼び出しによって無効化されていないかぎり、この優先順位でキューに登録されます。
呼び出し側がトランザクションにあり、TPNOTRAN フラグが設定されていない場合は、メッセージは、トランザクション モードでキューに登録されます。この結果、tpenqueue() が正常終了して呼び出し側のトランザクションが正常にコミットされると、メッセージは、トランザクションの完了後に処理されることが保証されます。呼び出し側のトランザクションが、明示的に、またはトランザクション タイムアウトあるいは何らかの通信エラーの結果としてロールバックされると、メッセージはキューから削除されます。つまり、キューへのメッセージの登録もロールバックされます。同じトランザクション内で同じメッセージの登録と取り出しを行うことはできません。
呼び出し側がトランザクション モードにないか、または TPNOTRAN フラグが設定されている場合は、メッセージはトランザクション モードではキューに登録されません。tpenqueue() が正常終了すれば、出されたメッセージが処理されることが保証されます。トランザクション モードでないときに通信エラーまたはタイムアウトが発生した場合、アプリケーションには、メッセージが正しくキューに格納されたかどうかがわかりません。
メッセージが処理される順序は、この後説明するように、ctl データ構造体を介してアプリケーションによって制御されます。デフォルトのキューの順序は、キューの作成時に設定されます。
TPNOTRAN
TPNOBLOCK
tperrno に TPEBLOCK が設定されます。このフラグが設定されていて、対象のキューが別のアプリケーションによって排他的にオープンされているなどのブロッキング条件が存在する場合には、呼び出しは異常終了して tperrno に TPEDIAGNOSTIC が設定され、TPQCTL 構造体の診断フィールドは QMESHARE に設定されます。後者の場合、Oracle Tuxedo ATMI システム以外の Oracle Products をベースとするアプリケーションが、キューイング サービス API (QSAPI) を使った排他的な読み書きのためのキューをオープンしています。
TPNOBLOCK が設定されていない場合に、ブロッキング状態が存在すると、その状態が解消されるかタイムアウト (トランザクション タイムアウトまたはブロッキング タイムアウト) が発生するまで、呼び出し側はブロックされます。タイムアウトが発生すると、呼び出しは異常終了し、tperrno は TPETIME に設定されます。
TPNOTIME
TPSIGRSTRT
TPSIGRSTRT が指定されておらず、システム コールがシグナルによって中断された場合、tpenqueue() は異常終了し、tperrno に TPGOTSIG が設定されます。
キューへのメッセージ登録に関する追加情報は、ctl データ構造体を介して指定できます。この情報には、デフォルトのキューの順序付けを無効にしてキューの先頭または登録済みのメッセージの前にメッセージを登録するための値、キューからメッセージを取り出すまでの絶対時間または相対時間、メッセージが期限切れになりキューから削除される絶対時間または相対時間、メッセージ配信サービスの品質、メッセージが応答する際のサービス品質、メッセージとそのメッセージに関連付けられた応答または異常終了メッセージを結び付けるときに役立つ相関識別子、応答を登録するキューの名前、およびすべての異常終了メッセージを登録するキューの名前が含まれます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpenqueue() を呼び出すことはできません。
TPQCTL 構造体は、アプリケーション プログラムが、キューへのメッセージの登録に関連するパラメータを渡したり、取得したりする際に使用されます。TPQCTL の要素 flags は、この構造体の他のどの要素が有効であるかを示すために使用されます。
tpenqueue() への入力時には、次の要素を TPQCTL 構造体に設定できます。
long flags; /* どの値が
* 設定されるかの指定 */
long deq_time; /* キューから取り出すときの絶対時間/相対時間 */
long priority; /* 登録優先順位 */
long exp_time /* 有効期限 */
long delivery_qos /* 配信サービスの品質 */
long reply_qos /* 応答サービスの品質 */
long urcode; /* ユーザ戻り値 */
char msgid[32]; /* 既存メッセージの ID
* (要求をそのメッセージの前に登録するため) */
char corrid[32]; /* msg を識別するときに使用される
* 相関識別子 */
char replyqueue[16]; /* 応答メッセージ用キューの名前 */
char failurequeue[16]; /* 異常終了メッセージ用キューの名前 */
tpenqueue() の入力情報を制御する flags パラメータの有効なビットの一覧を次に示します。
TPNOFLAGS
TPQTOP
TPQTOP と TPQBEFOREMSGID は、相互に排他的なフラグです。
TPQBEFOREMSGID
ctl
msgid によって識別されるメッセージの前に登録されます。この要求は、キューが順序を無効化できるように構成されているかどうかに応じて、受け入れられない場合があります。TPQTOP と TPQBEFOREMSGID は、相互に排他的なフラグです。また、メッセージ識別子の値は 32 バイト全体が意味を持つため、ctl
msgid によって指定された値を完全に初期化する必要があります (たとえば、NULL 文字で埋めるなど)。
TPQTIME_ABS
ctl
deq_time によって指定された時間の後で使用可能になります。deq_time は、time(2)、mktime(3C)、または gp_mktime(3c) によって生成された絶対時間値です (UTC (協定世界時) 1970 年 1 月 1 日 00:00:00 から経過した秒数)。TPQTIME_ABS と TPQTIME_REL は、相互に排他的なフラグです。絶対時間は、キュー マネージャ プロセスが存在するマシン クロックによって決定されます。
TPQTIME_REL
ctl
deq_time は、キューの登録が完了した後、出された要求が処理されるまでの遅延秒数を指定します。TPQTIME_ABS と TPQTIME_REL は、相互に排他的なフラグです。
TPQPRIORITY
ctl
priority に格納されます。優先順位は、1 以上 100 以下の範囲でなければなりません。数値が高いほど優先順位も高くなり、高い数値のメッセージが低い数値のメッセージより先にキューから取り出されます。優先順位によって順序付けられていないキューでは、この値は参考として使用されます。
TPQCORRID
ctl
corrid で指定された相関識別子の値は、要求が tpdequeue() によってキューから取り出されるときに使用できます。この識別子は、キューに登録されるすべての応答メッセージまたは異常終了メッセージに付加されるので、アプリケーションは応答を特定の要求に結び付けることができます。また、相関識別子の値は 32 バイト全体が意味を持つため、ctl
corrid で指定された値を完全に初期化する必要があります (たとえば、NULL 文字で埋めるなど)。
TPQREPLYQ
ctl
replyqueue で指定された応答キューは、待機メッセージに関連付けられます。メッセージに対する応答はすべて、要求メッセージと同じキュー スペース内の、指定されたキューに登録されます。この文字列は、NULL で終了しなければなりません (最大 15 文字)。
TPQFAILUREQ
ctl
failurequeue で指定された異常終了キューは、待機メッセージに関連付けられます。(1) キューに登録されたメッセージが TMQFORWARD() によって処理され、(2) TMQFORWARD が -d オプションで開始され、さらに (3) サービスが異常終了して NULL 以外の応答を返す場合は、その応答と関連する tpurcode によって構成される異常終了メッセージが、元の要求メッセージと同じキュー スペース内で指定されたキューに登録されます。この文字列は NULL で終了し、15 文字以下であることが必要です。
TPQDELIVERYQOS、TPQREPLYQOS
TPQDELIVERYQOS フラグが設定されていると、ctl->delivery_qos で指定されたフラグにより、メッセージの配信サービスの品質が制御されます。その場合、相互に排他的な 3 つのフラグ TPQQOSDEFAULTPERSIST、TPQQOSPERSISTENT、TPQQOSNONPERSISTENT のいずれかを ctl->delivery_qos に設定しなければなりません。TPQDELIVERYQOS フラグが設定されていない場合、対象のキューのデフォルトの配信ポリシーがメッセージに対するサービスの配信品質を指定します。
TPQREPLYQOS フラグが設定されていると、ctl->reply_qos で指定されるフラグが、メッセージの応答に対するサービスの品質を制御します。その場合、相互に排他的な 3 つのフラグ TPQQOSDEFAULTPERSIST、TPQQOSPERSISTENT、TPQQOSNONPERSISTENT のいずれかを ctl->reply_qos に設定しなければなりません。TPQREPLYQOS フラグは、TMQFORWARD によって処理されるメッセージから応答が返されるときに使用されます。サービスを呼び出すときに TMQFORWARD を使用しないアプリケーションでは、自身の応答メカニズムのヒントとして TPQREPLYQOS フラグを使用できます。
ctl->replyqueue キューのデフォルトの配信ポリシーが応答に対するサービスの配信品質を指定します。デフォルトの配信ポリシーは、メッセージへの応答がキューに登録されるときに決定される点に注意してください。つまり、元のメッセージがキューに登録されてから応答が登録されるまでの間に、応答キューのデフォルトの配信ポリシーが変更された場合は、最後に応答が登録された時点で有効なポリシーが使用されます。
ctl->delivery_qos と ctl->reply_qos の有効なフラグです。
TPQEXPTIME_ABS
ctl->exp_time に格納された値で示されます。ctl->exp_time の値は、time(2)、mktime(3C)、または gp_mktime(3c) によって生成された絶対時間、つまり世界協定時 (UTC) 1970 年 1 月 1 日 00:00:00 から経過した秒数に設定されなければなりません。
TPQEXPTIME_ABS、TPQEXPTIME_REL、および TPQEXPTIME_NONE は、相互に排他的なフラグです。この 3 つのどのフラグも設定されていない場合、対象のキューに対応しているデフォルトの有効期限の時間がメッセージに適用されます。
TPQEXPTIME_REL
ctl->exp_time に格納された値で示されます。
TPQEXPTIME_ABS、TPQEXPTIME_REL、および TPQEXPTIME_NONE は、相互に排他的なフラグです。この 3 つのどのフラグも設定されていない場合、対象のキューに対応しているデフォルトの有効期限の時間がメッセージに適用されます。
TPQEXPTIME_NONE
TPQEXPTIME_ABS、TPQEXPTIME_REL、および TPQEXPTIME_NONE は、相互に排他的なフラグです。この 3 つのどのフラグも設定されていない場合、対象のキューに対応しているデフォルトの有効期限の時間がメッセージに適用されます。
また、TPQCTL の要素 urcode にユーザ戻り値を設定することができます。この値は、メッセージをキューから取り出すアプリケーションに返されます。
tpenqueue() からの出力時には、次の要素が TPQCTL 構造体に設定されます。
long flags; /* どの値が
* 設定されるかの指定 */
char msgid[32]; /* キューに登録されたメッセージの ID */
long diagnostic; /* 異常終了の原因 */
tpenqueue() からの出力情報を制御する flags パラメータの有効なビットの一覧を次に示します。tpenqueue() の呼び出し時にこのフラグがオンになっていると、/Q サーバ TMQUEUE(5) は、構造体の対応する要素にメッセージ識別子を挿入します。tpenqueue() の呼び出し時にこのフラグ ビットをオフにしていると、TMQUEUE() によって構造体の関連要素にメッセージ識別子は設定されません。
TPQMSGID
tpenqueue() の呼び出しが正常終了した場合、メッセージ識別子が ctl
msgid に格納されます。メッセージ識別子の値は 32 バイト全体が意味を持つため、ctl
msgid に格納される値は完全に初期化されます (たとえば、NULL 文字で埋めるなど)。初期化に使用される実際の埋め文字は、Oracle Tuxedo ATMI /Q コンポーネントのリリースによって異なります。
制御構造体の残りのメンバーは、tpenqueue() への入力に使用されません。
tpenqueue() の呼び出しが異常終了して tperrno に TPEDIAGNOSTIC が設定された場合は、異常終了の原因を示す値が ctl
diagnostic に返されます。返される可能性のある値は、この後の「診断」の項で定義しています。
このパラメータが NULL である場合、入力フラグは、TPNOFLAGS と見なされ、アプリケーション プログラムは出力情報を利用できません。
異常終了すると、tpenqueue() は -1 を返し、tperrno を設定してエラー条件を示します。エラーでないときは、メッセージは、tpenqueue() の終了時に正しくキューに登録されます。
異常終了時には、tpenqueue() は tperrno を次のいずれかの値に設定します (特に記述した場合を除いては、エラーが呼び出し側のトランザクションに影響を及ぼすことはありません)。
TPEINVAL]
TPENOENT]
qspace を利用できないので、これにアクセスできません (関連する TMQUEUE(5) サーバは利用できません)。または、グローバル トランザクション テーブル (GTT) にエントリがないので、グローバル トランザクションを開始できません。
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。
TPETIME が発生します。ただし、例外が 1 つあります。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態に置かれます。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
TPEDIAGNOSTIC]
QMEINVAL]
QMEBADRMID]
QMENOTOPEN]
QMETRAN]
TPNOTRAN フラグを設定して呼び出したときに、メッセージをキューに登録するトランザクションを開始してエラーが発生しました。この診断は、Oracle Tuxedo リリース 7.1 以降のキュー マネージャからは返されません。
QMEBADMSGID]
QMESYSTEM]
QMEOS]
QMEABORTED]
QMEPROTO]
QMEBADQUEUE]
QMENOSPACE]
QMENOSPACE が返されます。(1) キュー スペースに割り当てられたディスク容量 (永続的)、(2) キュー スペースに割り当てられたメモリ容量 (非永続的)、(3) 同時にアクティブ状態になるトランザクションの最大数 (キュー スペースで許容される数であることが必要です)、(4) キュー スペースに一度に入れることができる最大メッセージ数、(5) キューイング サービス コンポーネントが処理できる並列アクションの最大数、または (6) キューイング サービス コンポーネントを同時に使用できる認証されたユーザの最大数。
QMERELEASE]
QMESHARE]
qmadmin(1)、gp_mktime(3c)、tpacall(3c)、tpalloc(3c)、tpdequeue(3c)、tpinit(3c)、tpsprio(3c)、APPQ_MIB(5)、TMQFORWARD(5)、TMQUEUE(5)
tpenvelope() - 型付きメッセージ バッファに関連付けられているデジタル署名と暗号化情報へのアクセス
#include <atmi.h>
int tpenvelope(char *data, longlen, intoccurrence, TPKEY *outputkey, long *status, char *timestamp, longflags)
tpenvelope() は、型付きメッセージ バッファに関連付けられている以下のデジタル署名と暗号化情報へのアクセスを提供します。
送信プロセスがメッセージ バッファのデジタル署名要求を登録する場合は、tpsign() を呼び出して明示的に登録するか、TPKEY_AUTOSIGN フラグを指定した tpkey_open() を呼び出して暗黙的に登録します。
メッセージ バッファが送信される直前に、各暗号化登録要求に対して、公開鍵ソフトウェアがデジタル署名を生成し、メッセージ バッファにアタッチします。デジタル署名によって、受信プロセスはメッセージの署名者 (発信元) を確認することができます。
送信プロセスがメッセージ バッファの暗号化 (封印) 要求を登録する場合、tpseal() を呼び出して明示的に登録するか、TPKEY_AUTOENCRYPT フラグを指定した tpkey_open() を呼び出して暗黙的に登録します。
公開鍵ソフトウェアは、メッセージ バッファが送信される直前に、各暗号化登録要求に対して、メッセージの内容を暗号化し、暗号化エンベロープをメッセージ バッファに添付します。暗号化エンベロープにより、受信プロセスはメッセージを復号化することができます。
署名および暗号化の情報は、送信プロセスと受信プロセスのどちらからも利用できます。送信プロセスでは、デジタル署名と暗号化の情報は普通は保留状態にあり、メッセージが送信されるまで待機しています。受信プロセスでは、デジタル署名が確認され、暗号化と復号化も既に行われています。復号化または署名の確認に失敗した場合、メッセージの配信が行われない可能性があります。この場合、受信プロセスはメッセージ バッファを受け取ることができないため、メッセージ バッファの情報が伝わりません。
data は、(1) 以前 tpalloc() を呼び出すプロセスによって割り当てられたメッセージ バッファ、または (2) システムによって受信プロセスに渡されたメッセージ バッファのうち、いずれかの有効な型付きメッセージ バッファを指している必要があります。メッセージ バッファが自己記述型の場合、len は無視されます (0 でかまいません)。それ以外の場合、len には data 内のデータの長さが格納されている必要があります。
デジタル署名登録要求、デジタル署名、暗号化登録要求、およびメッセージ バッファに関連付けられている暗号化エンベロープの複数のオカレンスが同時に存在することがあります。これらのオカレンスは順番に格納され、最初の項目が 0 位置に、以降の項目は 0 に続く連続する位置に格納されます。occurrence 入力パラメータは、要求された項目を示します。occurrence の値が最後の項目の位置を過ぎると、tpenvelope() は TPENOENT エラー状態で異常終了します。TPENOENT が返されるまで、tpenvelope() を繰り返し呼び出してすべての項目を調べることができます。
デジタル署名登録要求、暗号化登録要求、または暗号化エンベロープに関連付けられたキーのハンドルは、outputkey を介して返されます。返されたキー ハンドルは、tpkey_open() を呼び出してオープンされた元のキーの個別コピーです。PRINCIPAL 属性パラメータなどのキーのプロパティは、tpkey_getinfo() を呼び出して取得します。キー ハンドル outputkey は、呼び出し側が tpkey_close() を呼び出して解放します。
| 注意 : | outputkey が NULL の場合、キー ハンドルは返されません。 |
status 出力パラメータは、デジタル署名登録要求、デジタル署名、暗号化登録要求、または暗号化エンベロープの状態を報告します。ステータスの値が NULL でない場合、次のいずれかの状態に設定されます。
TPSIGN_PENDING
TPSIGN_OK
TPSIGN_TAMPERED_MESSAGE
TPSIGN_TAMPERED_CERT
TPSIGN_REVOKED_CERT
TPSIGN_POSTDATED
TPSIGN_EXPIRED_CERT
TPSIGN_EXPIRED
TPSIGN_UNKNOWN
TPSEAL_PENDING
TPSEAL_OK
TPSEAL_TAMPERED_CERT
TPSEAL_REVOKED_CERT
TPSEAL_EXPIRED_CERT
TPSEAL_UNKNOWN
timestamp 出力パラメータには、デジタル署名が生成されたマシンのローカル クロックに従ったタイムスタンプが含まれています。この値の整合性は、関連付けられているデジタル署名によって保護されています。timestamp によって示されるメモリ位置は、YYYYMMDDHHMMSS 形式の NULL で終了する署名時間です。ここで YYYY は年、MM は月、DD は日、HH は時間、MM は分、SS は秒を表します。timestamp は NULL でもかまいませんが、この場合値は返されません。暗号化 (封印) にはタイムスタンプは含まれず、timestamp によって示されるメモリ位置は変わりません。
TPKEY_REMOVE - occurrence の位置にある項目が削除され、バッファとの関連がなくなります。この項目に関連する出力パラメータ outputkey、status、および timestamp は、項目が削除される前に取り込まれます。その後の項目は 1 つずつ繰り下がるため、occurrence の番号が不連続になることはありません。TPKEY_REMOVEALL - メッセージ バッファに関連付けられているすべての項目が削除されます。出力パラメータ、outputkey、status、および timestamp は返されません。TPKEY_VERIFY - メッセージ バッファに関連付けられているすべてのデジタル署名が再確認されます。再確認後に署名のステータスが変わる場合があります。たとえば、受信プロセスによってメッセージ バッファが修正された場合、発信者の署名のステータスは TPSIGN_OK から TPSIGN_TAMPERED_MESSAGE に変わります。
異常終了すると、この関数は -1 を返し、tperrno を設定してエラー条件を示します。
TPEINVAL]
TPENOENT]
TPESYSTEM]
tpkey_close(3c)、tpkey_getinfo(3c)、tpkey_open(3c)、tpseal(3c)、tpsign(3c)
tperrordetail() - 最後の Oracle Tuxedo ATMI システム呼び出しから生じるエラーに関する詳細の取得
#include <atmi.h>
int tperrordetail(long flags)
tperrordetail() は、カレント スレッドで呼び出された最後の Oracle Tuxedo ATMI ルーチンにより発生したエラーに関する追加の詳細情報を返します。tperrordetail() は、数値を返します。その数値は、シンボリック名でも表わされます。カレント スレッドで呼び出された最後の Oracle Tuxedo ATMI ルーチンによりエラーが発生していない場合、tperrordetail() は、ゼロを返します。したがって、tperrordetail() はエラーが表示された後、つまり tperrno が設定されたときに呼び出す必要があります。
flags は将来の使用を考慮して予約されているため、ゼロを指定してください。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tperrordetail() の呼び出しを発行できます。
異常終了すると、tperrordetail() は -1 を返し、tperrno を設定してエラー条件を示します。
設定されるのは、tperrordetail() が返す各数値のシンボリック名および意味です。表示される順序は任意ではなく、優先順位を示すものではありません。
TPED_CLIENTDISCONNECTED
tpnotify() 呼び出しに TPACK フラグが使用され、tpnotify() の対象は現在 Jolt クライアントに接続していません。tpnotify() が異常終了したときは、中間の ATMI 呼び出しを省略して引き続き tperrordetail() を呼び出すと、TPED_CLIENTDISCONNECTED が返されます。
TPED_DECRYPTION_FAILURE
TPED_DOMAINUNREACHABLE
tperrordetail() を呼び出すと、TPED_DOMAINUNREACHABLE が返されます。
tpcall()、tpgetrply()、または tprecv() 呼び出しが異常終了した場合に tperrno が返す値を示します。引き続き tperrordetail() を呼び出すと、エラーの詳細として TPED_DOMAINUNREACHABLE が返されます。
TPED_DOMAINUNREACHABLE 機能は、Oracle Tuxedo Domains にのみ適用されます。Connect OSI TP Domains や Connect SNA Domains など、他のドメインの製品には適用されません。
TPED_INVALID_CERTIFICATE
tperrordetail() を呼び出すと、TPED_INVALID_CERTIFICATE が返されます。
TPED_INVALID_SIGNATURE
tperrordetail() を呼び出すと、TPED_INVALID_SIGNATURE が返されます。
TPED_INVALIDCONTEXT
tperrno は TPESYSTEM に設定されます。中間の ATMI 呼び出しを省略して引き続き tperrordetail() を呼び出すと、TPED_INVALIDCONTEXT が返されます。
TPED_INVALID_XA_TRANSACTION
TPED_NOCLIENT
tpnotify() 呼び出しに TPACK フラグが指定されているのに、tpnotify() の対象がありません。tpnotify() が異常終了すると、tperrno は TPENOENT に設定されます。中間の ATMI 呼び出しを省略して引き続き tperrordetail() 呼び出すと、TPED_NOCLIENT が返されます。
TPED_NOUNSOLHANDLER
tpnotify() 呼び出しに TPACK フラグが指定され、tpnotify() の対象が Oracle Tuxedo ATMI セッション内にあるのに、対象に非請求の通知ハンドラが設定されていません。tpnotify() が異常終了すると、tperrno は TPENOENT に設定されます。中間の ATMI 呼び出しを省略して引き続き tperrordetail() を呼び出すと、TPED_NOUNSOLHANDLER が返されます。
TPED_SVCTIMEOUT
UBBCONFIG 中の SVCTIMEOUT 値によって制御されます。T_SERVER および T_SERVICE クラスの TA_SVCTIMEOUT は TM_MIB(5) に記載されています。このエラーよって呼び出しが異常終了したときは、中間の ATMI 呼び出しを省略して引き続き tperrordetail() を呼び出すと、TPED_SVCTIMEOUT が返されます。
TPED_TERM
tperrordetail() を呼び出すと、TPED_TERM が返されます。
異常終了時には、tperrordetail() は tperrno を次のいずれかの値に設定します。
TPEINVAL
「C 言語アプリケーション トランザクション モニタ インタフェースについて」、tpstrerrordetail(3c)、tperrno(5)
tpexport() - 型付きメッセージ バッファを、デジタル署名と暗号化エンベロープを含むエクスポート可能なマシン独立型の文字列表現に変換
#include <atmi.h>
int tpexport(char *ibuf, longilen, char *ostr, long *olen,
longflags)
tpexport() は、型付きメッセージ バッファを外部化された表現に変換します。外部化された表現とは、通常は伝送直前にメッセージ バッファに追加される Oracle Tuxedo ATMI ヘッダ情報を含まないメッセージ バッファです。
外部化された表現は、任意の通信メカニズムを介して、プロセス、マシン、Oracle Tuxedo ATMI アプリケーション間で伝送することができます。恒久的なストレージにアーカイブでき、システムの停止および再起動後も有効です。
ibuf は、(1) 以前 tpalloc() を呼び出すプロセスによって割り当てられたメッセージ バッファ、または (2) システムによって受信プロセスに渡されたメッセージ バッファのうち、いずれかの有効な型付きメッセージ バッファを指している必要があります。ilen は、エクスポートする ibuf の大きさを指定します。ibuf が長さの指定を必要としないタイプのバッファを指している場合 (たとえば、FML のフィールド化バッファ)、ilen の値は無視されます (0 でかまいません)。
ostr は、バッファの内容と関連プロパティの外部化された表現を保持する出力領域を指します。flags に TPEX_STRING が設定されている場合、外部化の形式は文字列型になります。それ以外の場合、出力する長さは *olen によって指定され、NULL バイトを埋め込むことができます。
入力時には、*olen は ostr で使用できる最大記憶サイズを指定します。出力時には、*olen は ostr に書き込まれる実際のバイト数に設定されます。flags に TPEX_STRING が設定されている場合は、終端の NULL 文字を含みます。
出力バッファに文字列形式 (base 64 エンコード) が要求される場合、flags 引数は TPEX_STRING に設定します。それ以外の場合、出力はバイナリになります。
異常終了すると、この関数は -1 を返し、tperrno を設定してエラー条件を示します。
TPEINVAL]
TPEPERM]
TPESYSTEM]
TPELIMIT]
tpfml32toxml() - FML32 バッファを XML データに変換
#include <fml32.h>
int tpfml32toxml (FBFR32 *fml32bufp, char *vfile, char *rtag, char **xmlbufp, long flags)
この関数は、FML32 バッファを XML データに変換するために使用します。以下の引数を使用できます。
fml32bufp
vfile
rtag
Type 属性で、XML ルート タグとして使用するために識別および保存されます。入力ルート名を指定していない場合は、デフォルトの出力 XML ルート タグ <FML32> が使用されます。
xmlbufp
flag
成功した場合、tpfml32toxml() は 0 を返します。この関数は、エラー発生時に -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpfml32toxml() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPESYSTEM]
userlog(3) に書き込まれます。これは、XML への変換を実行できなかった時期も示します。そのインスタンスでは、エラーの詳細な情報が userlog に追加されます。
TPEOS]
tpxmltofml32(3c)、tpxmltofml(3c)、tpfmltoxml(3c)
tpfmltoxml() - FML バッファを XML データに変換
#include <fml.h>
int tpfmltoxml (FBFR *fmlbufp, char *vfile, char *rtag, char **xmlbufp, long flags)
この関数は、FML バッファを XML データに変換するために使用します。以下の引数を使用できます。
fmlbufp
Type 属性で、XML ルート タグとして使用するために識別および保存されます。入力ルート名を指定していない場合は、デフォルトの出力 XML ルート タグ <FML> が使用されます。
xmlbufp
flag
成功した場合、tpfmltoxml() は 0 を返します。この関数は、エラー発生時に -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpfmltoxml() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPESYSTEM]
userlog(3) に書き込まれます。これは、XML への変換を実行できなかった時期も示します。そのインスタンスでは、エラーの詳細な情報が userlog に追加されます。
[TPEOS]
tpxmltofml32(3c)、tpfml32toxml(3c)、tpxmltofml(3c)
tpforward() - サービス要求を他のサービス ルーチンに転送するルーチン
#include <atmi.h>
void tpforward(char *svc, char *data, long len, long flags)
tpforward() を使用すると、サービス ルーチンはクライアントの要求を別のサービス ルーチンに転送して処理させることができます。tpforward() は tpreturn() と同様、サービス ルーチンの中で最後に呼び出されます。tpreturn() のように、tpforward() は、Oracle Tuxedo ATMI システムのディスパッチャに制御を正常に返すことを保証するために、ディスパッチされるサービス ルーチン内から呼び出されます。tpforward() は会話型サービス内から呼び出すことはできません。
この関数は、data が指すデータを使用して svc によって指定されるサービスに要求を転送します。サービス名の先頭に "." を付けてはいけません。要求を転送するサービス ルーチンは応答を受け取りません。要求の転送が終わると、サービス ルーチンは、通信マネージャ ディスパッチャに戻り、他の作業を行える状態になります。なお、転送された要求からの応答は期待しないため、この要求は、その要求を転送するサービスと同じ実行形式内の任意のサービス ルーチンに、エラーなして転送することができます。
サービス ルーチンがトランザクション モードであると、tpforward() はトランザクションの呼び出し側の部分を、そのトランザクションの開始プロセスが tpcommit() または tpabort() のいずれかを出したときに完了できるような状態にします。トランザクションがサービス ルーチンの実行中に tpbegin() により明示的に開始された場合、このトランザクションを tpcommit() または tpabort() で終了させてから、tpforward() を呼び出さなければなりません。このため、転送チェインに関与するすべてのサービスは、トランザクション モードで起動するか、あるいはどれもトランザクション モードでは起動しないようにします。
転送チェインの最後のサーバは、tpreturn() を使用して要求の発信元に応答を返します。要約して言えば、tpforward() は待機しているリクエスタに応答を返す役割を別のサーバに転送するわけです。
tpforward() は、サービス ルーチンが出したサービス要求から期待されるすべての応答を受け取った後、呼び出すようにします。受信されていない未終了の応答は、受信後、通信マネージャ ディスパッチャによって自動的に取り除かれます。さらに、以後、これらの応答の記述子は無効になり、要求は svc に転送されません。
data は送信される応答のデータ部を指すポインタです。data が NULL でなければ、以前に tpalloc() の呼び出しによって得られたバッファを指していなければなりません。このバッファが、サービス ルーチン起動時にサービス ルーチンに渡されたバッファと同じバッファである場合、そのバッファの配置は、Oracle Tuxedo ATMI システムのディスパッチャに一任されます。したがって、サービス ルーチンをコーディングする人は、バッファが解放されているかどうかを気にする必要はありません。実際、ユーザがこのバッファを解放しようとしてもできません。しかし、tpforward() に渡されるバッファが、サービスが起動したものに等しいものでない場合は、tpforward() はそのバッファを解放します。len には送信するデータ バッファの大きさを指定します。data が長さの指定を必要としないバッファを指すポインタである場合 (FML フィールド化バッファなど)、len は 0 でもかまいません。data が NULL の場合、len は無視され、長さ 0 のデータの要求が送信されます。
引数 flags は使用されません。この引数は将来の用途のために予約されており、必ず 0 に設定します。
サービス ルーチンは、呼び出し側である通信マネージャ ディスパッチャには何も返しません。したがって、tpforward() は void で定義されています。詳細については、「tpreturn(3c)」を参照してください。
関数に渡すパラメータの処理あるいはその関数のどちらかで何らかのエラーが発生した場合は、応答が送信されない限り、「失敗」メッセージが要求を起動した側に返されます。未終了の応答または従属接続がある場合や呼び出し側のトランザクションに中途終了マークが付けられた場合には、異常終了メッセージの原因となる障害であるとみなされます。
UBBCONFIG ファイル中の SVCTIMEOUT か、TM_MIB 中の TA_SVCTIMEOUT が 0 でない場合にサービスのタイムアウトが発生すると、TPEV_SVCERR が返されます。
要求者は、エラーを示す TPESVCERR エラーによって、異常終了メッセージを検出します。このようなエラーが発生した場合、呼び出し側のデータは送信されません。また、このエラーが原因で、呼び出し側の現在のトランザクションに中途終了のマークが付けられます。
サービス ルーチンの処理中あるいは要求の転送中にトランザクション タイムアウトになると、tpcall() または tpgetrply() で応答を待つ要求元は TPETIME エラーを受け取ります。サービスがトランザクション内部で失敗すると、そのトランザクションはタイムアウトになり、TX_ROLLBACK_ONLY 状態になります。また、そのトランザクションの後続の ATMI 呼び出しは、すべて TPETIME で異常終了します。待ち状態にある要求元は、どのようなデータも受信しません。しかし、サービス ルーチンは tpreturn() または tpforward() を使用して終了させるようになっています。会話型サービス ルーチンの場合、tpreturn() を使用しなければならず、tpforward() を使用することはできません。
サービス ルーチンが、tpreturn() または tpforward() のどちらも使用しないで戻る場合、(すなわち、サービス ルーチンが C 言語の return 文を使用するか、または単に「関数の終わりで終了する」場合)、あるいは tpforward() が会話型サーバから呼び出される場合、サーバは、ログ ファイルに警告メッセージを出力し、サービス エラーを要求の起動側に返します。また、従属接続に対するオープン接続はすべて、ただちに切断され、未終了の非同期応答は無効とマークされます。サーバが異常終了時にトランザクション モードにあった場合は、そのトランザクションには中途終了マークが付けられます。tpreturn() や tpforward() がサービス ルーチンの外部から使用される場合 (たとえば、クライアントや tpsvrinit() あるいは tpsvrdone() で)、これらのルーチンは単に終了するだけです。
tpalloc(3c)、tpconnect(3c)、tpreturn(3c)、tpservice(3c)、tpstrerrordetail(3c)
#include <atmi.h>
void tpfree(char *ptr)
tpfree() の引数は、以前に tpalloc() または tprealloc() によって得られたバッファを指すポインタです。ptr が NULL の場合は、動作は行われません。ptr が型付きバッファを指していない場合 (または、その前に tpfree() を使用して解放した領域を指している場合)、不定の結果が発生します。サービス ルーチン内では、ptr がサービス ルーチンに渡されたバッファを指している場合、tpfree() は単に終了し、そのバッファを解放しません。
ある種のバッファ タイプは、バッファの解放処理の一環として、状態情報あるいは関連するデータを削除する必要があります。tpfree() は、バッファを解放する前にこうした関連情報を (通信マネージャ固有の方法に従って) 削除します。
tpfree() が終了した後は、ptr を Oracle Tuxedo ATMI システムのルーチンの引数として使用したり、その他の方法で使用したりしないようにしてください。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tpfree() の呼び出しを発行できます。
tpfree() を使用して FML32 バッファを解放するとき、ルーチンは埋め込まれたバッファをすべて再帰的に解放して、メモリ リークの発生を防ぎます。埋め込まれたバッファが解放されないようにするには、対応するポインタに NULL を指定してから tpfree() コマンドを発行します。上記で説明したように、ptr が NULL の場合アクションは発生しません。
tpfree() は、呼び出し側に値を返しません。したがって、この関数は、void で宣言されています。
この関数を、C ライブラリの malloc()、realloc()、または free() と組み合わせて使用するのは避けてください (tpalloc() で割り当てたバッファを、free() を使用して解放しないでください)。
「C 言語アプリケーション トランザクション モニタ インタフェースについて」、tpalloc(3c)、tprealloc(3c)
tpgblktime() - 以前に設定された 1 秒あたりのブロック時間値の取得
#include <atmi.h>
inttpgblktime(TPBLK_NEXT,TPBLK_ALLlong flags)
tpgblktime() は、以前に設定された 1 秒あたりのブロック時間値を取得します。tpgblktime() にブロック時間フラグ値を指定した場合、それに一致する flag 値が設定されていないと、戻り値 0 が返されます。ブロック時間フラグ値として 0 未満の値を指定すると、エラーが発生します。
TPBLK_NEXT
TPBLK_ALL
0
TPBLK_NEXT を指定した前の tpsblktime() 呼び出しがあるために設定された次のブロック ATMI セットの適用可能なブロック時間値、または TPBLK_ALL フラグのブロック時間値 (システム全体のデフォルト ブロック時間値) を返します。
| 注意 : | ワークステーション クライアントが tpgblktime() 0 を呼び出した場合は、システム全体のデフォルト ブロック時間値を返すことはできません。この場合は、値 0 が返されます。 |
成功すると、tpgblktime() は、対応するフラグ値で現在有効なブロック時間値を示す正数を返します。戻り値 0 は、上書きが有効なブロック時間値が現在ないことを示します。
この関数は、エラー発生時に -1 を返し、tperrno を設定してエラー条件を示します。エラーが既存のトランザクションに影響を及ぼすことはありません。
異常終了時には、tpgblktime() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPESYSTEM]
tpcall(3c)、tpcommit(3c)、tprecv(3c)、tpsblktime(3c)、UBBCONFIG(5)
tpgetadmkey() - 管理用認証キーを取得するルーチン
#include <atmi.h>
long tpgetadmkey(TPINIT *tpinfo)
tpgetadmkey() は、アプリケーションに特定の認証サーバによって利用されます。このルーチンは、管理認証の目的のために指定ユーザにふさわしいアプリケーション セキュリティ キーを返します。このルーチンは、tpsysadm() あるいは tpsysop() のクライアント名 (つまり tpinfo
cltname) を指定して呼び出す必要があります。そうでなければ、有効な管理キーは返されません。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpgetadmkey() の呼び出しを発行できません。
tpgetadmkey() は、正常終了時には最上位ビットがセット (0x80000000) された 0 以外の値を返し、異常終了時には 0 を返します。tpinfo が NULL で、tpinfo
cltname が tpsysadm() もしくは tpsysop() でないか、またはユーザ ID が構成されたアプリケーション管理者でない時、0 が返されます。
0 が返されることで、有効な管理キーが割り当てられなかったことが分かります。
このインタフェースは、Oracle Tuxedo リリース 5.0 またはそれ以降が稼動する UNIX System のサイトでしか利用できません。
tpaddusr(1)、tpusradd(1)、tpinit(3c)、AUTHSVR(5)
『Oracle Tuxedo アプリケーション実行時の管理』
tpgetctxt() - 現在のアプリケーション関連のコンテキスト識別子の取得
#include <atmi.h>
int tpgetctxt(TPCONTEXT_T *context, longflags)
tpgetctxt() は、現在のアプリケーション コンテキストを表す識別子を取り出し、context に入れます。この関数は、マルチスレッド環境ではスレッド単位で、非スレッド環境ではプロセス単位で動作します。
2 番目の引数 flags は現在使用されていないので、0 に設定します。
tpgetctxt() は、マルチコンテキストのアプリケーションだけでなく、シングルコンテキストのアプリケーションでも呼び出すことができます。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tpgetctxt() の呼び出しを発行できます。
正常終了時には、tpgetctxt() は負数でない値を返します。コンテキストは、以下のいずれかの形式で表される現在のコンテキスト ID に設定されます。
TPSINGLECONTEXT。カレント スレッドが TPMULTICONTEXTS フラグの指定されていない tpinit() を正常に実行したこと、または TPMULTICONTEXTS フラグが指定されていない tpinit() を正常に実行したプロセス内でカレント スレッドが作成されたことを示します。TPSINGLECONTEXT の値は 0 です。TPNULLCONTEXT。カレント スレッドがコンテキストに関連付けられていないことを示します。 TPINVALIDCONTEXT。カレント スレッドのコンテキスト状態が無効であることを示します。同じコンテキスト内で別のスレッドが作業している間に、マルチコンテキスト クライアントのスレッドが tpterm() を呼び出すと、作業中のスレッドは TPINVALIDCONTEXT コンテキストになります。TPINVALIDCONTEXT の値は -1 です。
TPINVALIDCONTEXT 状態のスレッドは、ほとんどの ATMI 関数に対する呼び出しを発行できません。呼び出せる関数、または呼び出せない関数のリストについては、「C 言語アプリケーション トランザクション モニタ インタフェースについて」を参照してください。
TPINVALIDCONTEXT コンテキスト状態の詳細については、「tpterm(3c)」を参照してください。
異常終了すると、tpgetctxt() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpgetctxt() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPESYSTEM]
TPEOS]
「C 言語アプリケーション トランザクション モニタ インタフェースについて」、tpsetctxt(3c)、tpterm(3c)
tpgetlev() - トランザクション モードかどうかチェックするルーチン
#include <atmi.h>
int tpgetlev()
tpgetlev() は現在のトランザクション レベルを呼び出し側に返します。現時点では、定義されているレベルは 0 と 1 だけです。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpgetlev() の呼び出しを発行できません。
正常終了時 tpgetlev() は、トランザクション モードではないということを示す 0、またはトランザクション モードだということを示す 1 のどちらかを返します。
異常終了すると、tpgetlev() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpgetlev() は tperrno を次のいずれかの値に設定します。
TPEPROTO]
TPESYSTEM]
TPEOS]
Oracle Tuxedo ATMI システムのトランザクションを記述するために tpbegin()、tpcommit()、および tpabort() を使用する場合、XA インタフェースに準拠した (呼び出し側に妥当にリンクされている) リソース マネージャが行う作業のみがトランザクションの特性を備えていることを記憶しておくことが重要です。トランザクションにおいて実行される他のすべての操作は、tpcommit() あるいは tpabort() のいずれにも影響されません。そのリソース マネージャが行った処理が Oracle Tuxedo ATMI システムのトランザクションの一部となるよう、XA インタフェースを満たすリソース マネージャをサーバにリンクする方法については、「buildserver(1)」を参照してください。
tpabort(3c)、tpbegin(3c)、tpcommit(3c)、tpscmt(3c)
tpgetmbenc() - 型付きバッファからコード セットのエンコード名を取得
#include <atmi.h>
extern int tperrno;
int
tpgetmbenc (char *bufp, char *enc_name, long flags)
この関数は、型付きバッファで送信されたコードセットのエンコード名を取得するために使用します。この名前は、変換が必要な場合に対象のコードセットと比較することができます (「tpconvmb(3c)」を参照)。
引数 bufp は、型付きバッファのメッセージを指す有効なポインタです。
引数 enc_name は、この関数の正常終了時に、bufp で指定されたエンコード名に設定されます。戻り値の文字列は、NULL で終了します。エンコード名と NULL 終端文字を保持するための十分な大きさをバッファに割り当てる必要があります (<limits.h> の NL_LANGMAX を参照)。エンコード名が未設定の MBSTRING 型付きバッファは無効です。
引数 flags は現在使用されていないため、0 に設定します。
tpgetmbenc() は、正常終了時には値 0 を返し、エラー発生時には -1 を返し、関数ごとに次のように tperrno を設定します。この関数は、次の原因により異常終了する可能性があります。
TPEINVAL]
TPEPROTO]
TPESYSTEM]
tpalloc(3c)、tpconvmb(3c)、tpsetmbenc(3c)
tpgetrepos() - Tuxedo サービス メタデータ リポジトリ ファイルからのサービス パラメータ情報の取得
#include <atmi.h>
int tpgetrepos(char *reposfile, FBFR32* idata, FBFR32** odata)
tpgetrepos() は、TMMETADATA(5) で提供されている .TMMETAREPOS サービスへの代替リポジトリ アクセス インタフェースを提供します。tpgetrepos() は、Tuxedo サービス メタデータ リポジトリ ファイルからサービス パラメータを取得します。tpgetrepos() を使用するには、メタデータ リポジトリ ファイルが、要求元のネイティブ クライアントまたはサーバに存在している必要があります。このファイルにより、TMMETADATA(5) を開始していない場合でも、リポジトリ情報へのアクセスが可能になります。
| 注意 : | tpgetrepos() は、Jolt リポジトリ ファイルの表示にも使用できます。既存の Jolt リポジトリ ファイルを変更したり、新しい Jolt リポジトリ ファイルを作成したりすることはできません。 |
tpgetrepos() では、以下のパラメータを使用できます。
reposfile
idata
odata
「METAREPOS(5)」では、tpgetrepos() が使用する FML32 バッファ形式について説明します。これは、Tuxedo MIB で使用する形式と同じです。
tpgetrepos() は、成功した場合に 0 を返します。異常終了した場合は、tperrno を設定し、-1 を返します。ほとんどの異常終了では、Tuxedo MIB の場合と同様に、*odata の TA_ERROR フィールドに特定のエラーに関する情報が格納されています。
異常終了時には、tpgetrepos() は tperrno を次のいずれかの値に設定します。
| 注意 : | TPEINVAL の場合を除き、odata は、エラー条件についてさらに詳しい情報が得られるように、サービス エントリごとに TA_ERROR、TA_STATUS を含める形で変更されます。 |
[TPEINVAL]
[TPEMIB]
[TPEPROTO]
[TPEOS]
[TPESYSTEM]
このインタフェースは、Oracle Tuxedo リリース 9.0 またはそれ以降でしか利用できません。
${TUXDIR}/lib/libtrep.a
${TUXDIR}/lib/libtrep.so.<rel>
${TUXDIR}/lib/libtrep.lib
buildclient を使用する場合は、ライブラリを手動でリンクする必要があります。この場合、-L${TUXDIR}/lib -ltrep を指定します。
tpsetrepos(3c)、tmloadrepos(1)、tmunloadrepos(1)、TMMETADATA(5)、『Oracle Tuxedo アプリケーションの設定』の「Tuxedo サービス メタデータ リポジトリの管理」
tpgetrply() - 以前の要求に対する応答を受信するためのルーチン
#include <atmi.h>
int tpgetrply(int *cd, char **data, long *len, long flags)
tpgetrply() は、以前に送られた要求に対する応答を返します。この関数の最初の引数 cd は、tpacall() が返す呼び出し記述子を指します。デフォルトの設定では、この関数は、*cd と一致する応答が届くか、タイムアウトが発生するまで処理を進めません。
data は、以前に tpalloc() で割り当てたバッファを指すポインタのアドレスでなければならず、len は tpgetrply() が正常に受信したデータ量を設定する long 型の値を指すようにしてください。正常終了時には、*data は、その応答を収めたバッファを指し、*len には、そのデータのサイズが入ります。FML と FML32 バッファは、通常最小サイズ 4096 バイトを確保します。応答が 4096 バイトより大きい場合には、バッファ サイズは返されるデータを入れるのに十分な大きさに拡大します。リリース 6.4 では、バッファに対するデフォルトの割り当ては 1024 バイトです。また、最近使用したバッファの履歴情報が保持され、最適サイズのバッファをリターン バッファとして再利用できます。
容量まで満たされていないかもしれない送信者側のバッファ (たとえば、FML または FML32 バッファ) は、送信に使用されたサイズになります。システムは、受信データのサイズを任意の量で拡大します。これは、受信者が送信者の割り当てたバッファ サイズより小さく、送信されたデータのサイズより大きいバッファを受け取ることを意味します。
受信バッファのサイズは、増加することも減少することもあります。また、アドレスもシステムがバッファを内部で交換するごとに常に変更されます。応答バッファのサイズが変わったどうか (また変わったとしたらどれくらい変わったのか) を決定するには、tpgetrply() が *len とともに発行される前に、合計サイズを比べてください。バッファ管理の詳細については、「C 言語アプリケーション トランザクション モニタ インタフェースについて」を参照してください。
返されたときに *len が 0 の場合は、応答にはデータ部分がなく、*data やそれが指示するバッファは変更されていません。
*data または len が NULL であるとエラーになります。
マルチスレッド プログラムの各コンテキスト内では、次の条件があります。
これらの制限のどちらかに違反する tpgetrply() 呼び出しを発行した場合は、-1 が返され、tperrno は TPEPROTO に設定されます。
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]
cd、data、*data または len が NULL、あるいは flags が無効など)。cd が NULL でない場合、エラーが発生した後もこの値は有効で、応答は未終了のまま残されます。
TPEOTYPE]
TPNOCHANGE が flags に設定されていて、*data のタイプとサブタイプがそのサービスから送られた応答のタイプおよびサブタイプと一致しません。*data の内容も *len も変更されていません。呼び出し側の現在のトランザクションのために応答が受信された場合は、そのトランザクションには中途終了マークが付けられます。
TPEBADDESC]
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。いずれのケースでも、*data、その内容、*len はどれも変更されません。*cd は、呼び出し側がトランザクション モードでなければ (そして、TPGETANY が設定されていない場合) そのまま有効です。
TPETIME が発生します。ただし、例外が 1 つあります。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態に置かれます。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPESVCFAIL]
TPFAIL で tpreturn() を呼び出しました。これは、アプリケーション レベルの障害です。サービスの応答の内容は (送信された場合) は、*data が指すバッファに入ります。呼び出し側のトランザクションの代わりにサービス要求が発行された場合、トランザクションは「アボートのみ」とマークされます。トランザクションがタイムアウトしたかどうかに関わりなく、トランザクションがアボートされる前の通信で有効であるのは、TPNOREPLY、TPNOTRAN、および TPNOBLOCK を設定した tpacall() の呼び出しだけです。
TPESVCERR]
tpreturn() あるいは tpforward() でエラーを検出しました (たとえば、誤った引数が渡された場合など)。このエラーが発生すると、応答データは返されません (つまり、data、その内容、および *len はいずれも変更されません)。呼び出し側のトランザクションの代わりにサービス要求が発行された場合、トランザクションは「アボートのみ」とマークされます。トランザクションがタイムアウトしたかどうかに関わりなく、トランザクションがアボートされる前の通信で有効であるのは、TPNOREPLY、TPNOTRAN、および TPNOBLOCK を設定した tpacall() の呼び出しだけです。UBBCONFIG ファイル中の SVCTIMEOUT か、TM_MIB 中の TA_SVCTIMEOUT が 0 でない場合にサービスのタイムアウトが発生すると、TPESVCERR が返されます。
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpacall(3c)、tpalloc(3c)、tpcancel(3c)、tperrordetail(3c)、tprealloc(3c)、tpreturn(3c)、tpstrerrordetail(3c)、tptypes(3c)
tpgprio() - サービス要求の優先順位を受け取るルーチン
#include <atmi.h>
int tpgprio(void)
tpgprio() は、カレント スレッドがカレント コンテキストで最後に送信または受信した要求の優先順位を返します。優先順位の範囲は 1 から 100 までです。最高優先順位は 100 です。tpgprio() は tpcall() または tpacall() (キュー管理機能がインストールされている場合には、tpenqueue() または tpdequeue()) の後に呼び出すことができ、返される優先順位は送信された要求のものです。また、tpgprio() はサービス ルーチン内から呼び出して、呼び出されたサービスがどの優先順位で送られたかを明らかにします。tpgprio() は何回でも呼び出すことができ、次の要求が送られるまでは同じ値を返します。
マルチスレッドのアプリケーションでは、tpgprio() はスレッド単位で動作します。
会話プリミティブは優先順位とは関連付けられていないので、tpsend() や tprecv() を出しても、tpgprio() が返す優先順位には影響しません。また、会話型サービス ルーチンの場合も、tpcall() や tpacall() がそのサービス内から出されない限り、優先順位は関連付けられません。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpgprio() の呼び出しを発行できません。
正常終了時には、tpgprio() は要求の優先順位を返します。
異常終了すると、tpgprio() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpgprio() は tperrno を次のいずれかの値に設定します。
TPENOENT]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpacall(3c)、tpcall(3c)、tpdequeue(3c)、tpenqueue(3c)、tpservice(3c)、tpsprio(3c)
tpimport() - メッセージ バッファの外部化された表現を型付きメッセージ バッファに変換
#include <atmi.h>
int tpimport(char *istr, longilen, char **obuf, long *olen,
longflags)
tpimport() は、メッセージ バッファの外部化された表現を、型付きメッセージ バッファに変換します。外部化された表現とは、通常は伝送直前にメッセージ バッファに追加される Oracle Tuxedo ATMI ヘッダ情報を含まないメッセージ バッファです。プロセスによって tpexport() 関数が呼び出され、型付きメッセージ バッファが外部化された表現に変換されます。
istr に関連付けられているデジタル署名は、バッファがインポートされるときに確認されますが、インポート後も tpenvelope() を介して確認できます。
istr バッファ表現が暗号化されている場合、インポート プロセスは復号化に有効なプライベート キーにアクセスする必要があります。復号化はインポート プロセス内で自動的に実行されます。
flags に TPEX_STRING が設定されていない場合、istr に含まれるバイナリ データの長さは ilen に含まれます。ilen が 0 の場合は、istr は NULL 終了文字列を指していると推定され、TPEX_STRING フラグが指定されているものと考えられます。
*obuf は、(1) 以前 tpalloc() を呼び出すプロセスによって割り当てられたメッセージ バッファ、または (2) システムによって受信プロセスに渡されたメッセージ バッファのうち、いずれかの有効な型付きメッセージ バッファを指している必要があります。バッファは結果に応じて再度割り当てられ、バッファのタイプまたはサブタイプは変更される場合があります。
*olen は出力バッファに含まれる有効なデータ量に設定されます。olen が入力時に NULL の場合は、無視されます。
入力する外部化表現が文字列形式 (base 64 エンコード) の場合は、flags 引数は TPEX_STRING に設定されています。それ以外の場合、入力は ilen の長さのバイナリ形式です。
異常終了すると、この関数は -1 を返し、tperrno を設定してエラー条件を示します。
TPEINVAL]
TPEPERM]
TPEPROTO]
TPESYSTEM]
#include <atmi.h>
int tpinit(TPINIT *tpinfo)
tpinit() は、クライアントが Oracle Tuxedo ATMI システムのアプリケーションに参加するときに使用します。Oracle Tuxedo ATMI システムのコミュニケーションあるいはトランザクション ルーチンをクライアントが使用する前には、あらかじめクライアントは Oracle Tuxedo ATMI システムのアプリケーションに参加しなければなりません。
tpinit() には、シングルコンテキスト モードとマルチコンテキスト モードの 2 つの動作モードがあります。これについては、後で詳しく説明します。シングルコンテキスト モードでは tpinit() の呼び出しはオプションのため、シングルコンテキストのクライアントは、tpinfo を NULL に設定して tpinit() を透過的に呼び出す多くの ATMI ルーチン (たとえば、tpcall()) を呼び出すことによって、アプリケーションに参加することもできます。クライアントは、tpinit() を直接呼び出して、後に示すパラメータを設定する必要がある場合があります。また、マルチコンテキスト モードが必要な場合、アプリケーションの認証が必要な場合 (「UBBCONFIG(5)」の SECURITY キーワードの説明を参照)、またはアプリケーションが独自のバッファ タイプ スイッチを提供する場合 (「typesw(5)」を参照) は、tpinit() を使用しなければなりません。tpinit() が正常に終了した場合は、クライアントはサービス要求を開始し、トランザクションを定義できます。
シングルコンテキスト モードでは、tpinit() を 2 回以上呼び出す場合 (つまり、クライアントが既にアプリケーションに参加した後に呼び出す場合) は、何もアクションは実行されず、成功を示す戻り値が返されます。
マルチスレッド クライアントの場合、TPINVALIDCONTEXT 状態のスレッドは tpinit() の呼び出しを発行できません。Oracle Tuxedo ATMI アプリケーションに参加するには、マルチスレッドのワークステーション クライアントは、たとえシングルコンテキスト モードで動作している場合でも、必ず TPMULTICONTEXTS フラグを設定して tpinit() 関数を呼び出さなければなりません。
| 注意 : | TMNOTHREADS 環境変数を yes に設定しても、tpinit の TPMULTICONTEXTS モードは正しく機能します。この環境変数を yes に設定すると、スレッドを使用しないアプリケーションでマルチスレッド処理が無効になります。 |
tpinit() の引数 tpinfo は、TPINIT タイプおよび NULL サブタイプの型付きバッファを指すポインタです。TPINIT はバッファ タイプであり、ヘッダ ファイル atmi.h に typedef で定義されています。このバッファは、tpinit() を呼び出す前に tpalloc() で割り当てなければなりません。このバッファの解放は、tpinit() の呼び出しの後、tpfree() を使用して行います。TPINIT 型付きバッファ構造体は次のようなメンバーで構成されています。
char usrname[MAXTIDENT+2];
char cltname[MAXTIDENT+2];
char passwd[MAXTIDENT+2];
char grpname[MAXTIDENT+2];
long flags;
long datalen;
long data;
usrname、cltname、grpname、および passwd はすべて NULL で終了する文字列です。usrname は呼び出し側を表す名前です。cltname は、その意味付けがアプリケーション側で定義されているクライアント名です。値 sysclient は、cltname フィールド用にシステムによって予約されています。usrname と cltname フィールドは、tpinit() 実行時にクライアントと関連付けられ、ブロードキャスト通知と管理統計情報の検索に使用されます。これらの名前は、MAXTIDENT の文字数を超えてはなりません。MAXTIDENT は 30 字に定義されています。passwd は、アプリケーション パスワードとの認証に使用される非暗号化形式のアプリケーション パスワードです。一方通行の暗号化方式に関する UNIX システムの制限から、passwd は 8 文字までしか意味をもちません。grpname は、クライアントをリソース マネージャ グループ名と関連付けるときに使用します。grpname が長さ 0 の文字列として設定されている場合は、クライアントはリソース マネージャに関連付けられず、デフォルトのクライアント グループに含まれます。ワークステーション クライアントの場合、grpname の値には NULL 文字列 (長さが 0 の文字列) を指定します。grpname は ACL グループとは関連がないことに注意してください。
tpinit() には、シングルコンテキスト モードとマルチコンテキスト モードの 2 つの動作モードがあります。シングルコンテキスト モードでは、プロセスは一度に 1 つのアプリケーションに参加できます。このアプリケーションには、複数のアプリケーション スレッドがアクセスできます。シングルコンテキスト モードを指定するには、NULL のパラメータを指定した tpinit() を呼び出すか、TPINIT 構造体の flags フィールドに TPMULTICONTEXTS フラグを指定せずに tpinit() を呼び出します。また、tpinit() が別の ATMI 関数によって暗黙的に呼び出されたときも、シングルコンテキスト モードが指定されます。シングルコンテキスト モードで動作するプロセスのコンテキスト状態は、TPSINGLECONTEXT です。
| 注意 : | TMNOTHREADS 環境変数を "yes" に設定しても、tpinit の TPMULTICONTEXTS モードは正しく機能します。 |
シングルコンテキスト モードでは、tpinit() を 2 回以上呼び出す場合 (つまり、クライアントが既にアプリケーションに参加した後に呼び出す場合) は、何もアクションは実行されず、成功を示す戻り値が返されます。
TPINIT 構造体の flags フィールドに TPMULTICONTEXTS フラグを設定して tpinit() を呼び出すと、マルチコンテキスト モードに移行します。マルチコンテキスト モードでは、tpinit() を呼び出すたびに別のアプリケーション関連が作成されます。
アプリケーションの関連とは、プロセスと Oracle Tuxedo ATMI アプリケーションを関連付けるコンテキストです。クライアントは、複数の Oracle Tuxedo ATMI アプリケーションと関連を持ったり、同じアプリケーションに対して複数の関連を持つことができます。クライアントの関連は、すべて同じリリースの Oracle Tuxedo ATMI システムを実行するアプリケーションに対する関連でなければなりません。また、すべての関連はネイティブ クライアントかワークステーション クライアントのいずれかでなければなりません。
ネイティブ クライアントの場合、新しい関連の生成元になるアプリケーションは、TUXCONFIG 環境変数の値で決まります。ワークステーション クライアントの場合、新しい関連の生成元になるアプリケーションは、WSNADDR または WSENVFILE 環境変数の値で決まります。カレント スレッドのコンテキストは、新しい関連に設定されます。
マルチコンテキスト モードでは、アプリケーションは tpgetctxt() を呼び出してカレント コンテキストのハンドルを取得し、そのハンドルをパラメータとして tpsetctxt() に渡し、特定のスレッドまたはプロセスが動作するコンテキストを設定することができます。
シングルコンテキスト モードとマルチコンテキスト モードの両方を使用することはできません。アプリケーションがどちらかのモードを選択した場合、すべてのアプリエケーション関連で tpterm() が呼び出されるまで、他のモードで tpinit() を呼び出すことはできません。
マルチコンテキスト モードとシングルコンテキスト モードを制御するほかに、flags の設定により、クライアント固有の通知メカニズムとシステム アクセスのモードの両方を示すことができます。この 2 つの設定で、アプリケーションのデフォルト設定を上書きすることができます。これらの設定でアプリケーションのデフォルトを上書きできない場合、tpinit() はログ ファイルに警告メッセージを記録し、その設定を無視して、tpinit() からの戻り時に flags フィールドの設定をアプリケーションのデフォルト設定に戻します。クライアントへの通知の場合、flags の値として次のものがあります。
TPU_SIG
TPMULTICONTEXTS フラグが設定されている場合、このフラグは使用できません。
TPU_DIP
TPU_THREAD
THREAD 通知を選択します。このフラグは、マルチスレッドをサポートするプラットフォーム専用です。マルチスレッドをサポートしていないプラットフォームで TPU_THREAD が指定されると、無効な引数と見なされ、エラーが返されて tperrno が TPEINVAL に設定されます。
TPU_IGN
一度に上記の中から 1 つのフラグだけを使用できます。クライアントがフラグ フィールドを使用して通知方法を選択しない場合、アプリケーションのデフォルトの方法が、tpinit() の終了時にフラグ フィールドに設定されます。
システム アクセス モードの設定の場合、flags の値として次のものがあります。
TPSA_FASTPATH
TPSA_PROTECTED
一度に上記の中から 1 つのフラグだけを使用できます。クライアントが通知方法あるいはシステム アクセス モードをフラグ フィールドで選択しない場合、tpinit() の終了時にアプリケーションのデフォルトの方法が flags フィールドに設定されます。クライアントの通知方法とシステム アクセス モードの詳細については、「UBBCONFIG(5)」を参照してください。
アプリケーションがマルチスレッドまたはマルチコンテキストを使用する場合は、次のフラグを設定する必要があります。
TPMULTICONTEXTS
datalen は、それに続くアプリケーション固有のデータの長さです。TPINIT 型付きバッファのバッファ タイプ スイッチ エントリは、そのバッファに対して渡される合計サイズに基づいてこのフィールドを設定します (アプリケーション データのサイズは、合計サイズから TPINIT 構造体自体のサイズを差し引き、構造体に定義されているプレースホルダのサイズを加えたものです)。data は、アプリケーションで定義された認証サービスに転送される可変長データ用のプレースホルダです。これは常に、この構造体の最後の要素となります。
マクロ TPINITNEED は、目的のアプリケーション固有のデータ長を収めるのに必要とされる TPINIT のバッファのサイズを判別するときに使用できます。たとえば、アプリケーション固有のデータを 8 バイトにしたい場合、TPINITNEED(8) は必要とされる TPINIT のバッファ サイズを返します。
アプリケーションが Oracle Tuxedo ATMI システムの認証機能を使用しない場合には、tpinfo に NULL 値を使用できます。NULL 引数を使用するクライアント プロセスは、usrname、cltname、および passwd についてはデフォルトの設定である長さ 0 の文字列を取得します。フラグは設定されず、アプリケーション データも得られません。
異常終了すると、tpinit() は呼び出しプロセスを元のコンテキストに維持したまま -1 を返し、tperrno を設定してエラー条件を示します。また tpurcode() は、AUTHSVR(5) サーバによって返される値に設定されます。
異常終了時には、tpinit() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPENOENT]
TPEPERM]
tpurcode() は、クライアントがアプリケーションに参加できない理由を説明するため、アプリケーション固有の認証サーバによって設定される場合があります。
TPEPROTO]
tpinit() が不正に呼び出されました。たとえば、(a) 呼出し元がサーバである、(b) シングルコンテキスト モードで TPMULTICONTEXTS フラグが指定されている、または (c) マルチコンテキスト モードで TPMULTICONTEXTS フラグが指定されていない場合があります。
TPESYSTEM]
TPEOS]
tpchkauth() および、tpinit() の TPINIT タイプのバッファ引数に対する NULL 以外の値は、リリース 4.2 またはそれ以降を使用しているサイトでしか使用できません。
tpinit(3c) に記述されているインタフェースは、UNIX、Windows、および MS-DOS オペレーティング システム上でサポートされています。ただし、シグナル ベースの通知方法は、16 ビットの Windows および MS-DOS ではサポートされていません。tpinit() の実行時にこの通知方法が選択されると、userlog() メッセージが生成され、通知方式は自動的にディップインに設定されます。
TUXCONFIG
tpinit() 内で使用されます。この変数は、クライアントの接続先になるアプリケーションを示します。なお、この環境変数は、tpinit() が呼び出されたときのみ参照されます。これ以降の呼び出しには、アプリケーション コンテキストが使用されます。
WSENVFILE
tpinit() 内で使用されます。この変数には、環境変数の設定条件を収めたファイルを指定しますが、この設定は呼び出し側の環境で行うようにします。ワークステーション クライアントに必要とされる環境変数の設定に関する詳細については、「compilation(5)」を参照してください。なお、このファイルは、tpinit() が呼び出されるとき (その前ではなく) にのみ処理されます。
WSNADDR
tpinit() 内で使用されます。これは、アプリケーションをアクセスするときに使用されるワークステーション リスナ プロセスのネットワーク アドレスを示します。この変数はワークステーション クライアントの場合は必須ですが、ネイティブ クライアントの場合は無視されます。
//host.name:port_number
//#.#.#.#:port_number
hostname のアドレスを見つけます。hostname はローカル マシンでなければならず、ローカル ネーム解決機能は、ローカル マシンのアドレスへ hostname を解決しなければなりません。
#.#.#.# はドットで区切った 10 進数の形式です。ドットで区切った 10 進数の形式では、各 # は 0 から 255 までの数でなければなりません。このドットで区切った 10 進数は、ローカル マシンの IP アドレスを表現します。
port_number はドメイン プロセスが着信要求をリスンする TCP ポート番号です。port_number は 0 から 65535 の間の数字または名前です。port_number が名前の場合は、ローカル マシンのネットワーク サービス データベースになければなりません。
0x をつけ、16 進形式で指定することもできます。先頭の 0x に続く文字として、0 ~ 9 までの数字か、または A から F までの文字 (大文字と小文字は区別しない) を指定できます。16 進数の形式は、IPX/SPX や TCP/IP のような任意のバイナリ ネットワーク アドレスに使うことができます。
NETWORK セクションの NLSADDR パラメータに指定された値と同じでなければなりません。
WSNADDR アドレス用のコンマで区切られたパス名のリストを指定すると、複数のアドレスを指定することができます。接続が確立するまで順番にアドレス指定が試みられます。アドレス リストのメンバーは、どれでもパイプで区切られたネットワーク アドレスのかっこ付きのグループとして指定することができます。次に例を示します。
WSNADDR=(//m1.acme.com:3050|//m2.acme.com:3050),//m3.acme.com:3050
set WSNADDR=(//m1.acme.com:3050^|//m2.acme.com:3050),//m3.acme.com:3050|) は Windows では特殊文字と見みなされるため、コマンドラインで指定する際は、その前に Windows 環境でのエスケープ文字のカレット (^) を前に付ける必要があります。ただし、envfile で WSNADDR が定義されている場合、Oracle Tuxedo ATMI システムは tuxgetenv(3c) 関数を介して WSNADDR が定義する値を取得します。この場合、パイプ記号 (|) は特殊文字と見なされないので、カレット (^) を使用する必要はありません。
0x" で始まる文字列の場合は、16 進値文字列と解釈され、それ以外の場合は、ASCII 文字列と解釈されます。
WSFADDR
tpinit() 内で使用されます。この変数は、ワークステーション クライアントがワークステーション リスナまたはワークステーション ハンドラに接続するときに使用するネットワーク アドレスを指定します。この変数は、WSFRANGE 変数とともに、ワークステーション クライアントがアウトバウンド接続を行う前にバインドしようとする TCP/IP ポートの範囲を決定します。このアドレスには、TCP/IP アドレスを指定する必要があります。TCP/IP アドレスのポート部分は、ワークステーション クライアントによってバインドされる一連の TCP/IP ポートのベース アドレスを表します。WSFRANGE 変数は、範囲の大きさを指定します。たとえば、このアドレスが //mymachine.oracle.com:30000 で WSFRANGE が 200 の場合、この LMID からアウトバウンド接続を試みるネイティブ プロセスはすべて、mymachine.oracle.com 30000 から 30200 の間のポートをバインドします。この変数を設定しないと、空の文字列が使用され、オペレーティング システムはローカル ポートをランダムに選択します。
WSFRANGE
tpinit() 内で使用されます。この変数は、ワークステーション クライアント プロセスが、アウトバウンド接続を行う前にバインドを試みる TCP/IP ポートの範囲を指定します。WSFADDR パラメータは、範囲のベース アドレスを指定します。たとえば、WSFADDR パラメータが //mymachine.oracle.com:30000 に設定され、WSFRANGE が 200 に設定されると、この LMID からアウトバウンド接続を試みるネイティブ プロセスはすべて、mymachine.oracle.com 30000 から 30200 の間のポートにバインドします。有効範囲は 1 から 65535 までです。デフォルト値は 1 です。
WSDEVICE
tpinit() 内で使用されます。これは、ネットワークのアクセス時に使用するデバイス名を示します。この変数はワークステーション クライアントが使用し、ネイティブ クライアントの場合は無視されます。なお、ソケットや NetBIOS などトランスポート レベルのネットワーク インタフェースはデバイス名を必要としません。このようなインタフェースによってサポートされているワークステーション クライアントは、WSDEVICE を指定する必要はありません。
WSTYPE
tpinit() 内から使用され、ネイティブ サイトとの間でエンコード/デコードの責任範囲について調整を行います。この変数はワークステーション クライアントの場合は省略可能で、ネイティブ クライアントの場合は無視されます。
WSRPLYMAX
tpinit() によって使用され、アプリケーションの応答をファイルに格納する前にバッファに入れるために使用するコア メモリの最大サイズを設定します。このパラメータのデフォルトは、256,000 バイトです。詳細については、プログラミング マニュアルを参照してください。
TMMINENCRYPTBITS
TMMAXENCRYPTBITS
シグナル ベースの通知は、マルチコンテキスト モードでは使用できません。また、シグナルの制約によって、クライアントがシグナル ベースの通知を選択しても、システムがそれを使用できない場合があります。このような場合、システムは、選択されたクライアントに対する通知をディップ インに切り替えることを示すログ メッセージを生成し、クライアントはそれ以降ディップ イン通知によって通知されます (通知方法の詳細については、「UBBCONFIG(5)」の RESOURCES セクションの NOTIFY パラメータの説明を参照してください)。
クライアントのシグナル通知は、常にシステムによって行われるので、元の通知呼び出しがどこで行われるかにかかわらず、通知の形態は一貫しています。したがって、シグナル ベースの通知を使用するには次の条件が必要です。
アプリケーション管理者の ID は、アプリケーション コンフィグレーションの一部として識別されます。
クライアントにシグナル ベースの通知を選択すると、ある種の ATMI 呼び出しは正常に実行できないことがあります。このとき、TPSIGRSTRT の指定がない場合、非請求メッセージを受け取るため、TPGOTSIG が返されます。
「C 言語アプリケーション トランザクション モニタ インタフェースについて」、tpgetctxt(3c)、tpsetctxt(3c)、tpterm(3c)
tpkey_close() - 以前にオープンしたキー ハンドルのクローズ
#include <atmi.h>
int tpkey_close(TPKEYhKey, longflags)
tpkey_close() は、以前にオープンしたキー ハンドルと、それに関連するすべてのリソースを解放します。プリンシパルのプライベート キーなどの重要情報はすべて、メモリから消去されます。
tpkey_close() を呼び出してキー リソースを解放するのは、アプリケーションの役目です。あるプロセスがキーをクローズすると、同じプロセスがそのキー ハンドルを使ってデジタル署名や暗号化のメッセージ バッファを登録することはできなくなります。プロセスが TPKEY_AUTOSIGN または TPKEY_AUTOENCRYPT フラグを指定した tpkey_open() でキーをオープンした場合、キーをクローズした後の通信操作にはそのキー ハンドルは適用されません。
ただし、キーをクローズした後でも、そのキー ハンドルは、クローズ前に登録された関連署名要求や暗号化要求に対しては有効です。クローズしたキーに関連付けられている最後のバッファが解放されるか上書きされると、そのキーに属していたリソースは解放されます。
引数 flags は使用されません。この引数は将来の用途のために予約されており、0 に設定します。
異常終了すると、この関数は -1 を返し、tperrno を設定してエラー条件を示します。
TPEINVAL]
TPESYSTEM]
tpenvelope(3c)、tpkey_getinfo(3c)、tpkey_open(3c)、tpkey_setinfo(3c)
tpkey_getinfo() - キー ハンドルに関連付けられた情報の取得
#include <atmi.h>
int tpkey_getinfo(TPKEYhKey, char *attribute_name, void *value, long *value_len, longflags)
tpkey_getinfo() は、キー ハンドルに関する情報を報告します。キー ハンドルは、特定のプリンシパルのキーおよびそれに関連付けられている情報を表します。
調査対象のキーは、hKey 入力パラメータによって識別されます。情報が要求されている属性は、attribute_name 入力パラメータによって識別されます。一部の属性は暗号サービス プロバイダ固有のものですが、以下に示す属性は、すべてのプロバイダによってサポートされています。
次の表に、デフォルトの公開鍵実装でサポートされる ASN.1 DER アルゴリズム オブジェクト識別子を示します。
指定された attribute_name パラメータに関連付けられている情報は、値によって示されるメモリ位置に格納されます。この位置に格納できる最大データ量は、呼び出し側によって value_len に指定されます。
tpkey_getinfo() が完了すると、value_len は実際に返されたデータ サイズに設定されます。この場合、string 値の終了 NULL 値も含まれます。返されるバイト数が value_len より大きい場合、tpkey_getinfo() は異常終了し (TPELIMIT エラー コードを返し)、value_len を必要な大きさに設定します。
引数 flags は使用されません。この引数は将来の用途のために予約されており、0 に設定します。
異常終了すると、この関数は -1 を返し、tperrno を設定してエラー条件を示します。
TPEINVAL]
TPESYSTEM]
TPELIMIT]
TPENOENT]
tpkey_close(3c)、tpkey_open(3c)、tpkey_setinfo(3c)
tpkey_open() - デジタル署名の生成、メッセージの暗号化、またはメッセージの復号化のためのキー ハンドルのオープン
#include <atmi.h>
int tpkey_open(TPKEY *hKey, char *principal_name, char *location, char *identity_proof, longproof_len, longflags)
tpkey_open() は、呼び出し側のプロセスからキー ハンドルを使用できるようにします。キー ハンドルは、特定のプリンシパルのキーおよびそれに関連付けられている情報を表します。
キーは、以下に示す目的のうち、1 つまたは複数の目的に使用できます。
プリンシパル名と TPKEY_SIGNATURE または TPKEY_AUTOSIGN フラグを設定して tpkey_open() を呼び出すと、そのプリンシパルのプライベート キーとデジタル証明書に対するハンドルが返されます。
署名の検証には tpkey_open() を呼び出す必要はありません。この確認プロセスでは、デジタル署名付きメッセージが添付されたデジタル証明書に指定されている公開鍵を使用して署名が検証されます。
プリンシパル名と TPKEY_ENCRYPT または TPKEY_AUTOENCRYPT フラグを設定して tpkey_open() を呼び出すと、プリンシパルのデジタル証明書を介して、プリンシパルの公開鍵に対するハンドルが返されます。
プリンシパルの名前と TPKEY_DECRYPT フラグを使って tpkey_open() を呼び出すと、プリンシパルのプライベート キーとデジタル証明書に対するハンドルが返されます。
tpkey_open() によって返されたキー ハンドルは *hKey に格納されますが、値に NULL を使用することはできません。
principal_name 入力パラメータは、キーのオーナーの ID を指定します。principal_name の値が NULL ポインタまたは空の文字列の場合、デフォルト ID が使用されます。デフォルトのアイデンティティは、現在のログイン セッション、現在のオペレーティング システム アカウント、またはローカル ハードウェア デバイスなどの別の属性に基づいて決定されます。
キーのファイル位置は、location パラメータに渡されます。基本となるキー管理プロバイダが位置を示すパラメータを必要としない場合、このパラメータの値は NULL を使用できます。
principal_name の ID を認証するには、パスワードやパス フレーズなどの証明資料が必要になります。証明資料が必要な場合は、identity_proof によって資料を参照する必要があります。証明資料が不要な場合、このパラメータの値は NULL でかまいません。
証明資料の長さ (バイト) は、proof_len で指定します。proof_len が 0 の場合、identity_proof は NULL で終了する文字列と見なされます。
キーの操作モードに必要なキー アクセスのタイプは、flags パラメータで指定します。
TPKEY_SIGNATURE:
TPKEY_AUTOSIGN:
TPKEY_SIGNATURE が暗黙的に指定されています。
TPKEY_ENCRYPT:
TPKEY_AUTOENCRYPT:
TPKEY_ENCRYPT が暗黙的に指定されています。
TPKEY_DECRYPT:
これらのフラグは 1 つまたは複数を組み合わせて使用することができます。キーを暗号化のみに使用する場合 (TPKEY_ENCRYPT)、identity_proof は必要ないので NULL に設定できます。
正常終了すると、*hKey はこのキーを表す値に設定され、tpsign() や tpseal() などの関数で使用できるようになります。
異常終了すると、この関数は -1 を返し、tperrno を設定してエラー条件を示します。
TPEINVAL]
TPEPERM]
TPESYSTEM]
tpkey_close(3c)、tpkey_getinfo(3c)、tpkey_setinfo(3c)
tpkey_setinfo() - キー ハンドルに関連するオプション属性パラメータの設定
#include <atmi.h>
int tpkey_setinfo(TPKEYhKey, char *attribute_name, void *value, longvalue_len, longflags)
tpkey_setinfo() は、キー ハンドルのオプション属性パラメータを設定します。キー ハンドルは、特定のプリンシパルのキーおよびそれに関連付けられている情報を表します。
情報が修正されるキーは、hKey 入力パラメータで識別されます。情報が修正される属性は、attribute_name 入力パラメータで識別されます。一部の属性は暗号サービス プロバイダ固有のものですが、「tpkey_getinfo(3c)」リファレンス ページで示す基本的属性は、すべてのプロバイダでサポートされる必要があります。
attribute_name パラメータに関連付けられた情報は、value によって示されるメモリ位置に格納されます。value のデータ内容が自己記述型の場合、value_len は無視されます (0 でかまいません)。それ以外の場合、value_len には value 内のデータの長さが格納されている必要があります。
引数 flags は使用されません。この引数は将来の用途のために予約されており、0 に設定します。
異常終了すると、この関数は -1 を返し、tperrno を設定してエラー条件を示します。
TPEINVAL]
TPELIMIT]
TPESYSTEM]
TPENOENT]
tpkey_close(3c)、tpkey_getinfo(3c)、tpkey_open(3c)
tpnotify() - クライアント識別子によって通知を送信するルーチン
#include <atmi.h>
int tpnotify(CLIENTID *clientid, char *data, long len, long flags)
tpnotify() は、各クライアントに非請求メッセージを送信できるようにします。
clientid は、以前のあるいは現在のサービス呼び出しの TPSVCINFO 構造体から保存された、または、他の何らかの通信機構によってクライアントに渡された (たとえば、管理インタフェースを使って検索された) クライアント識別子を指すポインタです。
この要求のデータ部は data によって示され、以前に tpalloc() によって割り当てられたバッファです。len に送信するデータの大きさを指定します。ただし、data が長さの指定を必要としないタイプのバッファを指す場合 (たとえば、FML フィールド化バッファ)、len は 0 でかまいません。また、data は NULL であってもかまいません。この場合、len は無視されます。
tpnotify() が正常終了した場合、メッセージはシステムに渡され、指定されたクライアントに送信されます。TPACK フラグが設定されている場合は、正常終了は、クライアントがメッセージを受信したことを意味します。さらに、クライアントが非請求のメッセージ ハンドラに登録している場合は、ハンドラが呼び出されます。
TPACK
TPNOBLOCK
TPNOTIME
TPSIGRSTRT
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpnotify() の呼び出しを発行できません。
異常終了すると、tpnotify() は -1 を返し、tperrno を設定してエラー条件を示します。呼び出しが異常終了して tperrno に特定の値が設定されたときは、中間の ATMI 呼び出しを省略して引き続き tperrordetail() を呼び出すと、エラーに関する詳細な情報が提供されます。詳細については、「tperrordetail(3c)」リファレンス ページを参照してください。
異常終了時には、tpnotify() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPENOENT]
TPETIME]
TPNOBLOCK と TPNOTIME のいずれも指定されなかったか、TPACK は設定されたが承認が受信されず、TPNOTIME が指定されませんでした。ブロッキング タイムアウトは、TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
TPERELEASE]
「C 言語アプリケーション トランザクション モニタ インタフェースについて」、tpalloc(3c)、tpbroadcast(3c)、tpchkunsol(3c)、tperrordetail(3c)、tpinit(3c)、tpsetunsol(3c)、tpstrerrordetail(3c)、tpterm(3c)
#include <atmi.h>
int tpopen(void)
tpopen() は、呼び出し側がリンクされるリソース マネージャをオープンします。呼び出し側には、多くとも 1 つのリソース マネージャしかリンクできません。この関数はリソース マネージャ固有の open() 呼び出しの代わりに使用するもので、これにより、移植性を損なう可能性のある呼び出しをサービス ルーチンからなくすことができます。リソース マネージャは初期化の内容がそれぞれで異なるため、個々のリソース マネージャを開くために必要な情報をコンフィグレーション ファイルに記述します。
リソース マネージャがすでにオープンされている場合 (すなわち、tpopen() を 2 回以上呼び出した場合)、何も処理は行われず、正常終了を示すコードが返されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT のスレッドは tpopen() の呼び出しを発行できません。
異常終了すると、tpopen() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpopen() は tperrno を次のいずれかの値に設定します。
TPERMERR]
TPEPROTO]
TPESYSTEM]
TPEOS]
#include <atmi.h>
int tppost(char *eventname, char *data, long len, long flags)
呼び出し側は tppost() を使用して、イベントとそれに伴うすべてのデータをポストします。イベント名は eventname に指定し、data は、NULL 以外の場合はデータを指すようにします。ポストされたイベントとそのデータは、Oracle Tuxedo ATMI のイベント ブローカによって、eventname に対して評価が成功するサブスクリプションを持ち、data に対して評価が成功するオプションのフィルタ ルールを持つすべてのサブスクライバにディスパッチされます。
eventname には、最大で 31 文字の NULL で終了する文字列を指定します。eventname の最初の文字にドット (".") は使用できません。これは、Oracle Tuxedo ATMI システム自体が定義するあらゆるイベントの最初の文字として、ドットが予約されているためです。
data には、NULL 以外の場合は、tpalloc() によって以前に割り当てたバッファを指定し、len にはバッファ内のイベントと共にポストするバッファに入っているデータの長さを指定しなければなりません。長さを指定する必要のないタイプのバッファ (FML フィールド化バッファなど) を data が指す場合、len は無視されます。data が NULL の場合、len は無視され、イベントはデータなしでポストされます。
tppost() をトランザクション中で使用する場合は、トランザクションの境界を拡大して、これらのサーバ上、およびイベント ブローカが通知する安定ストレージ上のメッセージ キューを含むようにすることができます。トランザクションによるポストでは、ポストされたイベントを受け取ったことがポスト元のトランザクションに通知される場合 (サーバやキューなど) と、通知されない場合 (クライアントなど) があります。
ポスト元がトランザクション内にあり、TPNOTRAN がセットされている場合は、ポストされたイベントはイベント ブローカに渡されます。これは、イベント ブローカがイベントをポスト元のトランザクションの一部として処理できるようにするためです。イベント ブローカはトランザクションによるイベント通知を、tpsubscribe() に渡される ctl
flags パラメータで TPEVTRAN ビットの設定を使用したサービス ルーチンおよび安定ストレージ上のキューのサブスクリプションだけにディスパッチします。イベント ブローカは、クライアントへの通知、および tpsubscribe() に渡される ctl
flags パラメータで TPEVTRAN ビットの設定を使用しなかったサービス ルーチンおよび安定ストレージ上のキューにあるサブスクリプションのディパッチも行いますが、これはポスト元プロセスのトランザクションの一部としてではありません。
ポスト元がトランザクションの外部にある場合、イベントに関連するサービスが異常終了すると、tppost() は肯定応答のない一方向のポストになります。このような状況は、イベント用に TPEVTRAN が設定されている場合でも起こります (この設定には、tpsubscribe() に渡される ctl
flags パラメータを使用します)。ポスト元がトランザクション内にある場合は、イベントに関連するサービスが異常終了すると tppost() は TPESVCFAIL を返します。
TPNOTRAN
TPNOREPLY
tppost() が戻る前にイベント ブローカが eventname に対するすべてのサブスクリプションを処理するのを待たないように、tppost に通知します。TPNOREPLY がセットされると、tppost() が成功して戻ったかどうかにかかわらず、tpurcode() はゼロに設定されます。呼び出しプロセスがトランザクション モードにあるとき、TPNOTRAN が設定されない限りこの設定は使用できません。
TPNOBLOCK
tperrno には TPEBLOCK が設定されます。TPNOBLOCK が指定されていないときにブロッキング条件が存在すると、呼び出し側は、その条件が解消されるか、またはタイムアウト (トランザクションまたはブロッキング) が発生するまではブロックされます。
TPNOTIME
TPSIGRSTRT
TPSIGRSTRT が指定されていない場合にシグナルがシステム コールを中断させると、tppost() は失敗し、tperrno には TPGOTSIG が設定されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tppost() の呼び出しを発行できません。
tppost() から成功して戻ると、tpurcode() には eventname の代わりにイベント ブローカによってディスパッチされるイベント通知の数が設定されています (つまり、eventname に対するイベント表現の評価が成功し、data に対するフィルタ ルールの評価が成功したサブスクリプションへのポストです)。tperrno が TPESVCFAIL に設定されて戻った場合は、tpurcode() には、eventname の代わりにイベント ブローカによってディスパッチされたトランザクション以外のイベント通知の数が設定されています。
異常終了すると、tppost() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tppost() は tperrno を次のいずれかの値に設定します (特に記述した場合を除いては、エラーが呼び出し側のトランザクションに影響を及ぼすことはありません)。
TPEINVAL]
TPENOENT]
TPETRAN]
TPNOTRAN が設定されず、トランザクション伝達をサポートしないイベント ブローカに tppost() がコンタクトしました。つまり、TMUSREVT(5) が、トランザクションをサポートする Oracle Tuxedo ATMI グループで実行されていません。
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。
TPETIME が発生します。ただし、例外が 1 つあります。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
tppost() がトランザクション内部で失敗すると、そのトランザクションは TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPESVCFAIL]
tpurcode() には、eventname の代わりにイベント ブローカがディスパッチするトランザクション以外のイベント通知の数が設定されています。トランザクションのポスティングは、トランザクションの完了と共にその効果がなくなるため、カウントされません。なお、トランザクションがタイムアウトしないかぎり、通信はトランザクションがアボートするまで継続され、呼び出し側のトランザクションのためになされた作業はトランザクションが完了する時点でアボートされます (つまり、以降のやりとりで何らかの結果が得られる場合には、TPNOTRAN を設定しておく必要があります)。
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpsubscribe(3c)、tpunsubscribe(3c)、EVENTS(5)、TMSYSEVT(5)、TMUSREVT(5)
tprealloc() - 型付きバッファのサイズを変更するルーチン
#include <atmi.h>
char * tprealloc(char *ptr, long size)
tprealloc() は、ptr が指すバッファのサイズを size バイトに変更し、新しい (おそらく移動した) バッファを指すポインタを返します。tpalloc() と同様、割り当てるバッファは少なくとも size および dfltsize と同じ大きさになります。ここで、dfltsize は特定のバッファ タイプの tmtype_sw に指定されたデフォルトのバッファ サイズです。この 2 つの値の大きい方のサイズが 0 またはそれ以下であると、このバッファは変更されず、NULL が返されます。バッファの型は、再割り当ての後も変わりません。この関数が正常に終了した場合、返されたポインタは、バッファを参照するために使用します。以後、バッファの参照に ptr を使用しないようにしてください。バッファの内容は、新しいサイズと古いサイズのうち短い方の長さまでは変更されません。
ある種のバッファ タイプは、使用する前に初期化を行っておく必要があります。tprealloc() は、バッファを再割り当てした後、(通信マネージャ固有の方法で) バッファを再度初期化します。このため、呼び出し側から返されるバッファはすぐに使用できます。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tprealloc() の呼び出しを発行できます。
tprealloc() は正常終了すると、long ワードに境界を合わせた、適切なタイプのバッファへのポインタを返します。
異常終了すると、tprealloc() は NULL を返し、tperrno を設定してエラー条件を示します。
再初期化関数が正常に実行できなかった場合、tprealloc() は異常終了して NULL を返し、ptr が指すバッファの内容は無効になってしまう可能性があります。異常終了時には、tprealloc() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPEPROTO]
TPESYSTEM]
TPEOS]
バッファの再初期化が正常に実行できなかった場合、tprealloc() は異常終了して、NULL を返し、ptr が指すバッファの内容は無効になってしまう可能性があります。この関数は、C ライブラリの malloc()、realloc()、または free() とともに使用することはできません (たとえば、tprealloc() で割り当てたバッファは free() で解放することはできません)。
tpalloc(3c)、tpfree(3c)、tptypes(3c)
tprecv() - 会話型接続でメッセージを受信するルーチン
#include <atmi.h>
int tprecv(int cd, char **data, long *len, long flags, long \
*revent)
tprecv() は、別のプログラムからオープン接続を介してデータを受け取るときに使用します。tprecv() の最初の引数 cd は、データを受け取るオープン接続を指定します。cd には、tpconnect() から返される記述子、あるいは会話型サービスに渡される TPSVCINFO パラメータに含まれる記述子のいずれかを指定します。2 番目の引数 data は、tpalloc() によって以前に割り当てられたバッファを指すポインタのアドレスです。
data は、前に tpalloc() が割り当てたバッファへのポインタのアドレスでなければなりません。また、len は long 型 (tprecv() が受信したデータのサイズに設定した) を指さなければなりません。*data は応答を含んでいるバッファを指し、*len は、バッファのサイズを含みます。FML と FML32 バッファは、通常最小サイズ 4096 バイトを確保します。したがって、応答が 4096 バイトより大きい場合は、バッファ サイズは返されるデータを入れるのに十分な大きさに拡大します。
容量まで満たされていない送信側のバッファ (たとえば、FML および STRING バッファ) は、送信に使用された大きさになります。システムは、受信データのサイズを任意の量で拡大します。これは、受信者が送信者の割り当てたバッファ サイズより小さく、送信されたデータのサイズより大きいバッファを受け取ることを意味します。
受信バッファのサイズは、増加することも減少することもあります。また、アドレスもシステムがバッファを内部で交換するごとに常に変更されます。応答バッファのサイズが変わったどうか (また変わったとしたらどれくらい変わったのか) を決定するには、tprecv() が *len とともに発行される前に、合計サイズを比べてください。バッファ管理の詳細については、「C 言語アプリケーション トランザクション モニタ インタフェースについて」を参照してください。
*len が 0 の場合、データは受け取られず、*data も、それが指すバッファも、変更されていません。data、*data または len が NULL であると、エラーになります。
tprecv() は、接続の制御をもたないプログラムしか出せません。
TPNOCHANGE
data が指すバッファとは異なるタイプのバッファが受信されると、受信側が着信バッファのタイプを識別する限り、*data のバッファ タイプは、受信されたバッファのタイプに変更されます。このフラグが設定されていると、*data が指すバッファのタイプは変更されません。つまり、受信されたバッファのタイプとサブタイプは、*data が指すバッファのタイプとサブタイプと一致しなければなりません。
TPNOBLOCK
tprecv() はデータが到着するまで待機しません。すでにデータが受信できる状態であると、tprecv() はデータを取り込んで終了します。このフラグが設定されておらず、かつ受信できるデータがない場合、呼び出し側はデータが到着するまでブロックされます。
TPNOTIME
TPSIGRSTRT
記述子 cd に対してイベントが存在すると、tprecv() は終了し、tperrno を TPEEVENT に設定します。イベントのタイプが revent で返されます。TPEV_SVCSUCC、TPEV_SVCFAIL および TPEV_SENDONLY イベントとともに、データを受け取ることができます。tprecv() の有効なイベントを次に示します。
TPEV_DISCONIMM
tpdiscon() により即時切断要求を出したこと、あるいは接続をオープンにしたままで tpreturn()、tpcommit()、または tpabort() を出したことを示します。このイベントは、通信エラー (サーバ、マシン、ネットワークの障害など) により接続が切断されたときにも起動元またはその従属側に返されます。これは即時切断通知 (つまり、正常ではなく中途の終了) であるため、処理途中のデータは失われます。2 つのプログラムが同じトランザクションに参加していた場合、そのトランザクションは中途終了マークが付けられます。この接続に使用された記述子は無効になります。
TPEV_SENDONLY
TPEV_SVCERR
tpreturn() を出したことを示します。tpreturn() に、サービスが正しく応答を返すことができないようなエラーが発生しています。たとえば、不正な引数が tpreturn() に渡されていたり、tpreturn() が、そのサービスが別の従属側にオープン接続を持っている最中に呼び出されている可能性があります。このイベントの性質上、アプリケーションが定義したデータや戻りコードは返されません。この接続は切断され、記述子は無効になります。このイベントが受信側のトランザクションの一部として発生した場合は、トランザクションには「アボートのみ」のマークが付けられます。
TPEV_SVCFAIL
TPFAIL または TPEXIT とともに tpreturn() が呼び出されています)。従属サービスは、tpreturn() が呼び出されたときにこの接続の制御下にあった場合は、アプリケーション定義の戻りコードおよび型付きバッファを接続の要求元に返すことができます。サービス ルーチンの終了処理の一部として、サーバはこの接続を切断しています。このため、cd は無効な記述子となります。このイベントが、受信側のトランザクションの一部として発生すると、そのトランザクションに中途終了マークが付けられます。
TPEV_SVCSUCC
TPSUCCESS とともに tpreturn() が呼び出されています)。サービス ルーチンの終了処理の一部として、サーバはこの接続を切断しています。このため、cd は無効な記述子となります。受信側がトランザクション モードにいる場合、そのトランザクションをコミットする (それが起動元でもある場合) か、中途終了して、サーバが行った作業内容 (トランザクション モードである場合) をコミットあるいは中途終了させます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tprecv() の呼び出しを発行できません。
revent が TPEV_SVCSUCC または TPEV_SVCFAIL のどちらかに設定されている場合に、tprecv() が終了した場合は、グローバル変数 tpurcode には、tpreturn() の一部として送信されるアプリケーション定義の値が含まれます。
異常終了すると、tprecv() は -1 を返し、tperrno を設定してエラーの条件を示します。呼び出しが異常終了して tperrno に特定の値が設定されたときは、中間の ATMI 呼び出しを省略して引き続き tperrordetail() を呼び出すと、エラーに関する詳細な情報が提供されます。詳細については、「tperrordetail(3c)」リファレンス ページを参照してください。
異常終了時には、tprecv() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPEOTYPE]
TPNOCHANGE が flags に設定されていて、*data のタイプおよびサブタイプが受け取るバッファのタイプおよびサブタイプと合っていません。*data の内容も *len も変更されていません。会話が呼び出し側の現在のトランザクションの一部になっている場合は、受け取るバッファが放棄されるため、トランザクションには「アボートのみ」のマークが付けられます。
TPEBADDESC]
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。いずれの場合でも、*data もその内容も変更されません。
TPETIME が発生します。ただし、例外が 1 つあります。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPEEVENT]
TPETIME] と、[TPEEVENT] リターン コードには関連があります。トランザクション モードにおいては、会話の受信側が tprecv にブロックされていて、送信側が tpabort() を出した場合、受信側は [TPEVENT] リターン コードを TPEV_DISCONIMM のイベントと共に取得します。ただし、受信側が tprecv() を呼び出す前に、送信側が tpabort() を出した場合は、そのトランザクションはすでに GTT から削除されてしまっているので、tprecv() は異常終了し、[TPETIME] コードが返されます。
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
サーバは、tpreturn() を呼び出すとき、アプリケーション定義の戻りコードおよび型付きバッファを渡すことができます。戻りコードはグローバル変数 tpurcode で使用され、バッファは data で使用されます。
tpalloc(3c)、tpconnect(3c)、tpdiscon(3c)、tperrordetail(3c)、tpsend(3c)、tpservice(3c)、tpstrerrordetail(3c)
tpresume() - グローバル トランザクションの再開
#include <atmi.h>
int tpresume(TPTRANID *tranid, long flags)
tpresume() を使用して、中断されているトランザクションでの作業を再開します。呼び出し側がトランザクションの作業を再開した場合、その作業は tpsuspend() で再度停止させるか、あるいはあとで tpcommit() または tpabort() を利用して完了させる必要があります。
トランザクションの作業を再開する際には、呼び出し側はリンクされたリソース マネージャが (tpopen() を利用して) オープンされていることを確認する必要があります。
tpresume() は、tranid でポイントされるグローバル トランザクション識別子により呼び出し側をトランザクション モードにします。tranid が NULL の場合はエラーです。
flags は将来使用するために予約されており、0 に設定されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpresume() の呼び出しを発行できません。
tpresume() は、エラーが発生すると -1 を返し、tperrno を設定してエラー条件を示します。
次の条件の場合、tpresume() は異常終了し、tperrno を次の値に設定します。
TPEINVAL]
tranid が NULL ポインタか、または存在しないトランザクション識別子 (前に完了しているトランザクションやタイムアウトしたトランザクションを含む) を指しているか、あるいは呼び出し側が再開することを許可されていないトランザクション識別子を指しています。トランザクションに関する呼び出し側の状態は変化しません。
TPEMATCH]
TPETRAN]
TPEPROTO]
TPESYSTEM]
TPEOS]
XA 準拠のリソース マネージャがグローバル トランザクションに含まれるようにするには、そのリソース マネージャが正常にオープンされている必要があります (詳細については、「tpopen(3c)」を参照)。
中断したトランザクションを再開するプロセスは、トランザクションを中断したプロセスと同じ論理マシン (LMID) 上に存在しなければなりません。ワークステーション クライアントの場合、そのワークステーションが接続されているワークステーション ハンドラ (WSH) は、そのトランザクションを停止させたワークステーション クライアントのハンドラと同じ論理マシン上に存在している必要があります。
tpabort(3c)、tpcommit(3c)、tpopen(3c)、tpsuspend(3c)
tpreturn() - Oracle Tuxedo ATMI システム サービス ルーチンからの復帰
void tpreturn(int rval, long rcode, char *data, long len, long \
flags)
tpreturn() は、サービス ルーチンが完了したことを示します。tpreturn() の働きは、C 言語における return 文と似ています (つまり、tpreturn() が呼び出されると、サービス ルーチンは Oracle Tuxedo ATMI システムのディスパッチャに制御を返します)。制御を Oracle Tuxedo ATMI システムのディスパッチャに確実に正しく戻すために、ディスパッチされたサービス ルーチン内から tpreturn() を呼ぶようにしてください。
tpreturn() はサービスの応答メッセージを送るときに使用します。応答を受け取るプログラムが tpcall()、tpgetrply() または tprecv() で待機している場合、tpreturn() の呼び出しが成功した時点で、受信側のバッファに応答が入ります。
会話型サービスの場合、tpreturn() は接続自体も切断します。したがって、サービス ルーチンは、tpdiscon() を直接呼び出すことができません。正常な結果を保証するためには、会話型サービスに接続しているプログラムは tpdiscon() を呼び出してはなりません。そのようなプログラムは、会話型サービスが完了したという通知を待たなければなりません (たとえば、そのプログラムは、tpreturn() によって送信される TPEV_SVCSUCC または TPEV_SVCFAIL などのイベントのちの 1 つを待つ必要があります)。
また、サービス ルーチンがトランザクション モードにあった場合には、tpreturn() はトランザクションのサービス部分を、そのトランザクションの完了時点でコミットあるいはアボートできる状態にします。サービスは同じトランザクションの一部として複数回呼び出すことができるので、tpcommit() あるいは tpabort() がそのトランザクションの開始プロセスによって呼び出されるまでは、完全にコミットあるいはアボートさせる必要は必ずしもありません。
tpreturn() は、該当サービス ルーチンが出したサービス要求から期待されるすべての応答を受け取った後、呼び出すようにしてください。そうしない場合は、サービスの性質によって決まりますが、TPESVCERR 状態または TPEV_SVCERR イベントのいずれかが、サービス ルーチンとの接続を開始したプログラムに返ります。受け取られなかった応答は、受信処理の後、通信マネージャによって自動的に取り除かれます。また、これらの応答に対応する記述子は無効になります。
tpreturn() は、サービスが出したすべての接続をクローズした後、呼び出される必要があります。そうしない場合はサービスの性質によって決まりますが、TPESVCERR または TPEV_SVCERR イベントのいずれかが、サービス ルーチンとの通信を開始したプログラムに返されます。また、即時切断イベント (つまり、TPEV_DISCONIMM) が、オープンしているすべての接続を通して従属側に送信されます。
会話型サービスは、自分で開始しなかったオープン接続を 1 つだけ備えているため、通信マネージャは、送信すべき記述子データ (およびイベント) を認識しています。このため、記述子は、tpreturn() に渡されません。
次に、tpreturn() の引数について説明します。rval は次のいずれかに設定できます。
TPSUCCESS
tpreturn() は、そのトランザクションの呼び出し側の部分を、トランザクションが最終的にコミットすべき時点でコミットできるような状態にします。なお、tpreturn() を呼び出しても、必ずしもトランザクション全体が終了することにはつながりません。また、呼び出し側が正常終了を示したとしても、未終了の応答またはオープン接続がある場合、該当サービス内で行われた作業が原因でトランザクションが「ロールバックのみ」のマークを付けられた場合、異常終了メッセージが送られます (つまり、応答の受信側は TPESVCERR 指示あるいは TPEV_SVCERR イベントを受け取ります)。なお、サービス ルーチンの処理中に何らかの理由でトランザクションに「ロールバックのみ」のマークが付けられると、rval が TPFAIL に設定されます。TPSUCCESS が会話型サービスに対して指定されると、TPEV_SVCSUCC イベントが生成されます。
TPFAIL
TPSVCFAIL 指示あるいは TPEV_SVCFAIL イベントを受け取ります。呼び出し側がトランザクション モードであると、tpreturn() はそのトランザクションに「ロールバックのみ」のマークを付けます (ただし、そのトランザクションには、すでに「ロールバックのみ」のマークが付いている場合もあります)。戻り処理が失敗した場合を除き、呼び出し側のデータが (もしあれば) 送られます。トランザクション タイムアウトになって、呼び出し側のデータが送られない場合もあります。このケースでは、応答を待つプログラムは TPETIME エラーを受け取ることになります。会話型サービスに TPFAIL が指定された場合には、TPEV_SVCFAIL イベントが生成されます。
TPEXIT
TPFAIL と同じように動作しますが、TPEXIT が返されると、サーバは、トランザクションがロールバックして応答が要求元に返された後に終了します。
TPEXIT は (そのプロセス内の単一のスレッドではなく) プロセス全体が強制終了されることを示します。
rval がこれら 3 つの値のいずれかに設定されていない場合、デフォルトの値として TPFAIL が使用されます。
アプリケーションが定義した戻りコード rcode をサービスの応答を受け取るプログラムに送ることもできます。このコードは、応答を正常に送ることができさえすれば (つまり、受信呼び出しが正常に行われる、あるいは TPESVCFAIL が返されれば)、rval の設定には関係なく送ることができます。さらに、会話型サービスでは、このコードは、サービス ルーチンが tpreturn() を発行したときに接続の制御権を持っている場合のみ送信されます。rcode の値は、受信側の変数 tpurcode() に入ります。
data は送信される応答のデータ部を指すポインタです。data が NULL でなければ、以前に tpalloc() の呼び出しによって得られたバッファを指していなければなりません。このバッファが、サービス ルーチン起動時にサービス ルーチンに渡されたバッファと同じバッファである場合、そのバッファの配置は、Oracle Tuxedo ATMI システムのディスパッチャに一任されます。したがって、サービス ルーチンをコーディングする人は、バッファが解放されているかどうかを気にする必要はありません。実際、ユーザがこのバッファを解放しようとしてもできません。ただし、tpreturn() に渡されたバッファが、そのサービスが呼び出されたときのものと異なる場合には、tpreturn() でそのバッファを解放することができます。メイン バッファが解放されても、そのバッファ内に埋め込まれたフィールドが参照するバッファは解放されません。len は送信するデータ バッファの大きさを指定します。data が長さの指定を必要としないバッファを指すポインタである場合 (FML フィールド化バッファなど)、len は 0 でもかまいません。
data が NULL の場合、len は無視されます。この場合、サービスを起動したプログラムが応答を待っている状態にあると、データなしの応答が返されます。応答を待たない状態にあると、tpreturn() は、必要に応じて data を解放し、応答を送信しないで復帰します。
現在、flags は将来の用途のために予約されており、0 に設定します (0 以外の値に設定すると、応答の受信者は TPESVCERR または TPEV_SVCERR イベントを受信します)。
会話型サービスの場合、アプリケーションの戻りコードとデータ部が送られないケースがいくつかあります。
サービス ルーチンは呼び出し側である Oracle Tuxedo ATMI システムのディスパッチャに値を返しません。このため、このルーチンは void として宣言されます。しかし、サービス ルーチンは tpreturn() または tpforward() を使用して終了させるようになっています。会話型サービス ルーチンの場合、tpreturn() を使用しなければならず、tpforward() を使用することはできません。サービス ルーチンを tpreturn() または tpforward() のいずれも使用せずに終了させる場合 (すなわち、このルーチンが C 言語の return 文を使用するか、ごく単純に関数の実行に失敗した場合)、あるいは tpforward() が会話型サーバから呼び出された場合、そのサーバはログに警告メッセージを出し、サービス エラーをサービスの要求元に返します。従属側へのオープン接続はすべてただちに切断され、未終了の非同期応答は取り除かれます。障害時にサーバがトランザクション モードであった場合、このトランザクションには「ロールバックのみ」のマークが付けられます。tpreturn() や tpforward() がサービス ルーチンの外部から使用される場合 (たとえば、クライアントや tpsvrinit() あるいは tpsvrdone() で)、これらのルーチンは単に終了するだけです。
tpreturn() はサービス ルーチンを終了させるので、引数処理またはサービス処理の間に発生したエラーについて、関数の呼び出し側に示すことはできません。このようなエラーが起こると、tpcall() または tpgetrply() を使用してサービスの結果を受信するプログラムのために tperrno が TPESVCERR に設定されます。またイベント TPEV_SVCERR が、tpsend() または tprecv() を使用するプログラムに、会話を通して送信されます。
UBBCONFIG ファイル中の SVCTIMEOUT か、TM_MIB 中の TA_SVCTIMEOUT が 0 でない場合にサービスのタイムアウトが発生すると、TPEV_SVCERR が返されます。
tperrordetail() と tpstrerrordetail() を使用すると、現在のスレッドの中で呼び出された最新の Oracle Tuxedo ATMI システムのルーチンが出したエラーに関して、追加的な情報を取得できます。エラーが起きると、tperrordetail() は数値を返しますが、この数値を trstrerrordetail() への引数として利用することで、エラーの詳細に関するテキストを受け取ることができます。
tpalloc(3c)、tpcall(3c)、tpconnect(3c)、tpforward(3c)、tprecv(3c)、tpsend(3c)、tpservice(3c)
tpsblktime() - 次のサービス呼び出しまたはすべてのサービス呼び出しのブロックタイムを秒単位で設定するルーチン
#include <atmi.h>
inttpsblktime(int blktime,long flags)
tpsblktime() は、潜在的なブロッキング API のブロック時間値を秒単位で設定するために使用します。潜在的なブロッキング API は、値としてフラグ TBNOBLOCK を使用できるシステム API として定義します。トランザクション タイムアウト値には影響しません。
blktime の値の範囲は 0 ~ 32767 です。次の例で示すように、有効なブロック時間値は SCANUNIT 値の最も近い倍数に切り上げられます。
値 0 は、以前に設定されたブロック時間フラグ値がキャンセルされており、別のブロック時間フラグ値で設定されたブロック時間が優先されることを示します。tpsblktime() を呼び出さない場合は、UBBCONFIG ファイルの *SERVICES セクションまたはデフォルトの *RESOURCES セクションの BLOCKTIME 値が使用されます。
| 注意 : | tpsblktime() で設定したブロッキング タイムアウトは、UBBCONFIG ファイルの *SERVICES セクションおよび *RESOURCES セクションに設定された BLOCKTIME パラメータよりも優先されます。ブロック時間チェックの優先順位は次のとおりです。tpsblktime(TPBLK_NEXT)、tpsblktime(TPBLK_ALL)、*SERVICES、*RESOURCES |
TPBLK_NEXT
TPNOBLOCK フラグが含まれている場合、tpsblktime (TPBLK_NEXT) は影響せず、ブロッキングなしの状態が継続します。
TPBLK-NEXT フラグ値は、その直後の API 呼び出しの TPBLK_ALL フラグ値をオーバーライドします。次に例を示します。
tpsblktime(50,TPBLK_ALL)
tpcall(one)
tpsblktime(30,TPBLK_NEXT)
tpcall(two)
tpcall(three)tpcall(two) には、tpsblktime(30,TPBLK_NEXT) を基に 30 秒のブロック タイムアウト値が入ります。tpcall(one) および tpcall(three) には、tpsblktime(50,TPBLK_ALL) を基に 50 秒のタイムアウト値が入ります。
tpsblktime(TPBLK_NEXT) はスレッド単位で動作します。したがって、アプリケーションで tpsblktime(TPBLK_NEXT) 呼び出しや後続の API 呼び出しの周囲にミューテックスを使用する必要はありません。
TPBLK_ALL
tpsblktime() が呼び出されるまでの間、後続のすべての潜在的なブロッキング API のブロック時間値を設定します。呼び出された API に TPNOBLOCK フラグが含まれている場合、tpsblktime(TPBLK_ALL) は影響せず、ブロッキングなしの状態が継続します。
tpsblktime(TPBLK_ALL) はコンテキスト単位で動作します。したがって、tpsblktime(TPBLK_ALL) は、複数のスレッドで使用されるコンテキストのいずれか 1 つのスレッドで呼び出す必要があります。
tpsblktime(TPBLK_ALL) は、tpterm(3c) が呼び出された後のコンテキストには影響しません。
| 注意 : | スレッド タイミングの依存関係に影響されないブロック時間値を実行するためには、tpinit(3c) の直後、tpgetctxt(3c) の戻り値がほかのスレッドで使用できるようになる前に、TPMULTICONTEXTS フラグを使用してマルチスレッド コンテキストで tpsblktime(TPBLK_ALL) を呼び出すのが最適な方法です。 |
| 注意 : | マルチスレッド サーバ上のサービスで tpsblktime(TPBLK_ALL) を呼び出した場合は、その時点で実行されているスレッドにのみ影響します。すべてのサービスのブロック時間値を設定するには、tpsvrinit(3c) または tpsvrthrinit(3c) と一緒に tpsblktime(TPBLK_ALL) を使用するのが最適な方法です。 |
tpsblktime() は、エラーが発生すると -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpsblktime() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPERELEASE]
TPESYSTEM]
tpcall(3c)、tpcommit(3c)、tprecv(3c)、tpgblktime(3c)、UBBCONFIG(5)
tpscmt() - tpcommit() がいつ戻るかを設定するルーチン
#include <atmi.h>
int tpscmt(long flags)
tpscmt() は、flags で指定した値を TP_COMMIT_CONTROL 特性に設定します。TP_COMMIT_CONTROL 特性は、tpcommit() の呼び出し側に制御を戻すことに関して、tpcommit() の動作に影響を与えます。プログラムがトランザクション モードにあるかどうかに関係なく、プログラムから tpscmt() を呼び出すことができます。他のプログラムがコミットしなければならないトランザクションに呼び出し側が参加している場合は、tpscmt() を呼び出してもそのトランザクションに影響を与えないことに注意してください。むしろ、呼び出し側がコミットするその後のトランザクションに影響を与えます。
ほとんどの場合、Oracle Tuxedo ATMI システムのスレッドの制御が tpcommit() を呼び出す場合にのみ、トランザクションがコミットされます。ただし、例外が 1 つあります。UBBCONFIG ファイルの SERVICES セクションで AUTOTRAN 変数が使用可能になっているために、サービスがトランザクション モードでディスパッチされる場合は、そのトランザクションは tpreturn() の呼び出し時点で完了します。tpforward() が呼び出されると、最終的にサーバが tpreturn() を呼び出すことでトランザクションが完了します。このように、tpreturn() を呼び出すサービスの TP_COMMIT_CONTROL 属性の設定によって、サーバ中で tpcommit() からいつ制御が戻るかが決まります。tpcommit() がヒューリスティックなエラー コードを返した場合、サーバはメッセージをログ ファイルに書き込みます。
クランアントが Oracle Tuxedo ATMI システムのアプリケーションに参加する場合は、この特性の初期設定はコンフィグレーション ファイルから取られます (「UBBCONFIG(5)」の RESOURCES セクションの CMTRET 変数を参照)。
TP_CMT_LOGGED
tpcommit() から返ることを指定します。この設定は、tpcommit() の呼び出し側に対するより速い反応を見込んでいます。だだし、第 2 フェーズの完了を待つ時間的な遅延のため、トランザクションの参加リソースが処理をヒューリスティックに完了する (すなわち、異常終了を示します) と決めるかもしれないという危険が存在します。この場合は、tpcommit() はすでに戻っているので、これを呼び出し側に伝える方法はありません (ただし、リソース マネージャがヒューリスティックな設定を行うと、Oracle Tuxedo ATMI システムはメッセージをログ ファイルに書き込みます)。正常な状態では、第 1 フェーズの間にコミットすることを約束している参加リソースは、第 2 フェーズでコミットします。一般に、ネットワークやサイトの障害が原因で問題が生じると、第 2 フェーズでヒューリスティックな判断がなされます。
TP_CMT_COMPLETE
tpcommit(3c) が終了することを指定します。この設定により、tpcommit() は第 2 フェーズのコミット中にヒューリスティックな判断がなされたことを示すことができます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpscmt() の呼び出しを発行できません。
成功の場合、tpscmt() は TP_COMMIT_CONTROL 特性の以前の値を返します。
異常終了すると、tpscmt() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpscmt() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPEPROTO]
TPESYSTEM]
TPEOS]
Oracle Tuxedo ATMI システムのトランザクションを記述するために tpbegin()、tpcommit()、および tpabort() を使用する場合、XA インタフェースに準拠した (呼び出し側に妥当にリンクされている) リソース マネージャが行う作業のみがトランザクションの特性を備えていることを記憶しておくことが重要です。トランザクションにおいて実行される他のすべての操作は、tpcommit() あるいは tpabort() のいずれにも影響されません。そのリソース マネージャが行った処理が Oracle Tuxedo ATMI システムのトランザクションの一部となるよう、XA インタフェースを満たすリソース マネージャをサーバにリンクする方法については、「buildserver(1)」を参照してください。
tpabort(3c)、tpbegin(3c)、tpcommit(3c)、tpgetlev(3c)
tpseal() - 暗号化する型付きメッセージ バッファのマーク
#include <atmi.h>
int tpseal(char *data, TPKEYhKey, longflags)
tpseal() は、暗号化するメッセージ バッファをマーク (登録) します。hKey を所有するプリンシパルは、このバッファを復号化し、その内容にアクセスすることができます。tpseal() を何度か呼び出すことによって、複数の受信者のプリンシパルに 1 つのバッファを指定できます。
data は、(1) 以前 tpalloc() を呼び出すプロセスによって割り当てられたメッセージ バッファ、または (2) システムによって受信プロセスに渡されたメッセージ バッファのうち、いずれかの有効な型付きメッセージ バッファを指している必要があります。バッファの内容は、tpseal() を呼び出した後で修正することができます。
data が指すメッセージ バッファがプロセスから伝送されると、公開鍵ソフトウェアがメッセージ内容を暗号化し、各暗号化登録要求のメッセージ バッファに暗号化エンベロープをアタッチします。暗号化エンベロープによって、受信プロセスはメッセージを復号化することができます。
引数 flags は使用されません。この引数は将来の用途のために予約されており、0 に設定します。
異常終了すると、この関数は -1 を返し、tperrno を設定してエラー条件を示します。
TPEINVAL]
TPESYSTEM]
tpkey_close(3c)、tpkey_open(3c)
tpsend() - 会話型接続でメッセージを送信するルーチン
#include <atmi.h>
int tpsend(intcd, char *data, longlen, longflags, long *revent)
tpsend() は、別のプログラムにオープン接続を介してデータを送信するときに使用します。このとき、呼び出し側がこの接続を制御できなければなりません。tpsend() の最初の引数 cd は、データを送信するオープン接続を指定するものです。cd には、tpconnect() から返される記述子、あるいは会話型サービスに渡される TPSVCINFO パラメータに含まれる記述子のいずれかを指定します。
2 番目の引数 data は、tpalloc() によって以前に割り当てられたバッファを指していなければなりません。len には送信バッファの大きさを指定します。ただし、data が長さの指定を必要としないバッファを指している場合 (FML フィールド化バッファなど)、len は無視されます (0 でかまいません)。また、data は NULL でもかまいません。この場合、len は無視されます (アプリケーション データは送信されません。これはデータを送信せず、たとえば接続の制御だけを与えるときに使用されます)。data のタイプとサブタイプは、接続の他方の側が認識するタイプおよびサブタイプと一致していなければなりません。
TPRECVONLY
tpsend() 呼び出しを出すことはできなくなります)。接続の他方の側のプログラムが tpsend() から送られたデータを受け取る場合、接続の制御権を得たことを示すイベント (TPEV_SENDONLY) も受け取ります (そして、それ以上、tprecv() を呼び出すことができなくなります)。
TPNOBLOCK
TPNOBLOCK が指定されていないときにブロッキング条件が存在すると、呼び出し側は、その条件が解消されるか、またはタイムアウト (トランザクションまたはブロッキング) が発生するまではブロックされます。
TPNOTIME
TPSIGRSTRT
記述子 cd にイベントが発生すると、tpsend() は正常終了できず、呼び出し側のデータは送信されません。イベントのタイプが revent で返されます。tpsend() の有効なイベントを次に示します。
TPEV_DISCONIMM
tpdiscon() により即時切断要求を出したことを、または接続をオープンにしたままで tpreturn() か、tpcommit() か、もしくは tpabort() を出したことを示します。このイベントは、通信エラー (サーバ、マシン、ネットワークの障害など) により接続が切断されたときにも起動元またはその従属側に返されます。
TPEV_SVCERR
tpreturn() を出したことを示します。さらに、tpreturn() は、TPEV_SVCFAIL について後述している方法とは異なる方法で出されました。このイベントは ACL パーミッション違反によっても発生します。つまり、呼び出し側が受け取り先プロセスに接続するためのパーミッションをもっていないことを示します。このイベントは、tpconnect() が出されるのと同時にではなく、最初の tpsend() と共に (フラグ TPSENDONLY をもった tpconnect() に続いて) 返されるか、または最初の tprecv() と共に (フラグ TPRECVONLY をもった tpconnect() に続いて) 返されます。また、システム イベントとログ メッセージも生成されます。
TPEV_SVCFAIL
tpreturn() を出したことを示します。さらに、tpreturn() は、rval として TPFAIL または TPEXIT を設定し、data として NULL を設定した状態で出されました。
これらのイベントはそれぞれ、即時切断通知 (つまり、正常ではなく中途で終了) を示すので、処理途中のデータは失われます。この接続に使用された記述子は無効になります。2 つのプログラムが同じトランザクションに参加していた場合には、そのトランザクションに中途終了マークが付けられます。
UBBCONFIG ファイル中の SVCTIMEOUT か、TM_MIB 中の TA_SVCTIMEOUT のどちらか一方が 0 でない場合にサービスのタイムアウトが発生すると、TPESVCERR が返されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpsend() の呼び出しを発行できません。
TPEV_SVCSUCC または TPEV_SVCFAIL のどららかが revent に設定されて tpsend() が戻った場合、tpurcode() によってポイントされているグローバル変数には、tpreturn() の一部として送信された、アプリケーションで定義した値が入っています。関数 tpsend() はエラー時には -1 を返し、tperrno を設定してエラーの条件を示します。またイベントが存在し、かつエラーが発生しない場合、tpsend() は -1 を返し、tperrno に [TPEEVENT] を設定します。
異常終了時には、tpsend() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPEBADDESC]
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。
TPETIME が発生します。ただし、例外が 1 つあります。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPEEVENT]
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpalloc(3c)、tpconnect(3c)、tpdiscon(3c)、tprecv(3c)、tpservice(3c)
tpservice() - サービス ルーチンのテンプレート
#include <atmi.h> /* C インタフェース */
void tpservice(TPSVCINFO *svcinfo) /* C++ インタフェース -
* C リンケージが必要 */
extern “C” void tpservice(TPSVCINFO *svcinfo)
tpservice() は、サービス ルーチン作成時のテンプレートです。このテンプレートは、ルーチン tpcall()、tpacall()、または tpforward() を介して要求を受け取るサービス、およびルーチン tpconnect()、tpsend()、または tprecv() を介して通信を行うサービスに使用できます。
tpcall() または tpacall() を介して行われる要求を処理するサービス ルーチンは、1 つだけ着信メッセージを受け取り (svcinfo の data 要素内に)、1 つだけ応答を送る (tpreturn() を使用してサービス ルーチンを終了するとき) ことができます。
一方、会話サービスは、最大 1 つの着信メッセージとオープン接続の参照手段とともに、接続要求により呼び出されます。会話型サービス ルーチンが呼び出されると、接続元プログラムあるいは会話型サービスはアプリケーション側で定義されたようにデータの送信および受信を行うことができます。この接続は半二重方式で確立されます。つまり、接続の一方の側は、他方から明示的に制御を渡されるまで、会話を制御することはできません (データを送信できません)。
トランザクションとの関連で言えば、サービス ルーチンはトランザクション モードで呼び出されると、1 つのトランザクションにしか参加できません。サービス ルーチン作成者側から見るかぎり、トランザクションはサービス ルーチンから返った時点で終了します。サービス ルーチンは、トランザクション モードで呼び出されなかった場合、tpbegin()、tpcommit() および tpabort() を使用して必要な回数だけトランザクションを起動できます。ただし、トランザクションの終了には tpreturn() を使用しません。したがって、サービス ルーチン内から起動された未終了のトランザクションについて、tpreturn() を呼び出すと、エラーになります。
サービス ルーチンは、1 つの引数、つまり svcinfo を使用して呼び出します。この引数は、サービス情報が定義された構造体を指すポインタです。この構造体には、次のメンバーが含まれます。
char name[32];
char *data;
long len;
long flags;
int cd;
long appkey;
CLIENTID cltid;
name には、要求元がサービスの呼び出しに使用したサービス名を指定します。
サービス ルーチンに入った時点で設定される flags は、サービス ルーチンが注目する必要のある属性を示します。以下に、flags に指定できる値を示します。
TPCONV
TPTRAN
TPNOREPLY
TPSENDONLY
TPRECVONLY と相互に排他的で、TPCONV が設定されているときにしか設定できません。
TPRECVONLY
TPSENDONLY と相互に排他的で、TPCONV が設定されているときにしか設定できません。
data は要求メッセージのデータ部を指し、len はデータの長さです。data によって指されたバッファは、通信マネージャで tpalloc() により割り当てられたものです。このバッファのサイズは、ユーザが tprealloc() を使用して大きくすることができます。ただし、これをユーザが解放することはできません。このバッファは、サービス終了時に tpreturn() または tpforward() に渡すようにしてください。異なるバッファをこれらのルーチンに渡すと、そのバッファはそれらによって解放されてしまいます。なお、data によって指されるバッファは、このバッファが tpreturn() または tpforward() に渡されない場合でも、次に出されたサービス要求によって変更されてしまいます。data は、要求とともにデータが渡されなかった場合には NULL になります。この場合、len は 0 になります。
TPCONV を flags に設定する場合、cd に接続記述子を指定しますが、これはこの会話を開始したプログラムとのコミュニケーションを行うために tpsend() および tprecv() とともに使用します。
appkey は、アプリケーション側で定義した認証サービスが要求クライアントに割り当てるアプリケーション キーに設定します。このキー値は、このサービス ルーチンのこの呼び出し中になされたあらゆるサービス要求とともに渡されます。アプリケーション認証サービスを通らないクライアントを起動する場合には、appkey の値は -1 になります。
cltid は、このサービス要求に対応する元のクライアントを示すユニークなクライアント識別子です。この構造体は atmi.h にのみ、アプリケーションが利用できるよう定義されているので、必要によりアプリケーション サーバ間でクライアント識別子をやりとりすることができます。このため、以下に定義されているフィールドの意味は明記されていません。アプリケーション側では CLIENTID 構造体の内容を操作しないようにしてください。内容を操作してしまうと、この構造体自体が無効になってしまいます。CLIENTID 構造体には、次のようなメンバーが含まれます。
C++ では、サービス関数に C リンケージが必要なことに注意してください。リンケージは、関数を「extern “C”」と宣言することで行えます。
サービス ルーチンは呼び出し側である通信マネージャ ディスパッチャに値を返しません。このため、このルーチンは void として宣言します。しかし、サービス ルーチンは tpreturn() または tpforward() を使用して終了させるようになっています。会話型サービス ルーチンの場合、tpreturn() を使用しなければならず、tpforward() を使用することはできません。サービス ルーチンを tpreturn() または tpforward() のいずれをも使用せずに終了させる場合 (すなわち、このルーチンが C 言語の return 文を使用するか、ごく単純に関数の実行に失敗した場合)、あるいは tpforward() が会話型サーバから呼び出された場合、そのサーバはログ ファイルに警告メッセージを出し、サービス エラーを要求元あるいはリクエスタに返します。また、従属接続に対するオープン接続はすべて、ただちに切断され、未終了の非同期応答は無効とマークされます。サーバが異常終了時にトランザクション モードにあった場合は、そのトランザクションには中途終了マークが付けられます。tpreturn() や tpforward() がサービス ルーチンの外部から使用される場合 (たとえば、クライアントや tpsvrinit() あるいは tpsvrdone() で)、これらのルーチンは単に終了するだけです。
tpreturn() はサービス ルーチンを終了させるので、引数処理またはサービス処理の間に発生したエラーについて、関数の呼び出し側に示すことはできません。このようなエラーが起こると、tpcall() または tpgetrply() を使用してサービスの結果を受信するプログラムのために tperrno が TPESVCERR に設定されます。またイベント TPEV_SVCERR が、tpsend() または tprecv() を使用するプログラムに、会話を通して送信されます。
tpalloc(3c)、tpbegin(3c)、tpcall(3c)、tpconnect(3c)、tpforward(3c)、tpreturn(3c)、servopts(5)
tpsetctxt() - 現在のアプリケーション関連に対するコンテキスト識別子の設定
#include <atmi.h>
int tpsetctxt(TPCONTEXT_Tcontext, longflags)
tpsetctxt() は、現在のスレッドが動作するコンテキストを定義します。この関数は、マルチスレッド環境ではスレッド単位で、非スレッド環境ではプロセス単位で動作します。
次にこのスレッドで Oracle Tuxedo ATMI が呼び出されると、コンテキストが示すアプリケーションが参照されます。コンテキストは、同一プロセス内のスレッドで tpgetctxt() の呼び出しを発行することによって提供されます。context の値が TPNULLCONTEXT の場合、現在のスレッドはどの Oracle Tuxedo ATMI コンテキストにも関連付けられません。
マルチコンテキスト モードで動作しているプロセスの各スレッドでは、次の呼び出しを発行するによって、TPNULLCONTEXT 状態にすることができます。
tpsetctxt(TPNULLCONTEXT, 0)
TPINVALIDCONTEXT は、context に入力できる有効な値ではありません。
TPINVALIDCONTEXT 状態のスレッドは、ほとんどの ATMI 関数に対する呼び出しを発行できません (呼び出せる関数と呼び出せない関数のリストについては、「C 言語アプリケーション トランザクション モニタ インタフェースについて」を参照してください)。このため、必要に応じてスレッドの TPINVALIDCONTEXT 状態を終了させる必要があります。それには、コンテキストを TPNULLCONTEXT か別の有効なコンテキストに設定して tpsetctxt() を呼び出します。また、tpterm() 関数を呼び出して TPINVALIDCONTEXT 状態を終了させることもできます。
2 番目の引数 flags は現在使用されていないので、0 に設定します。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tpsetctxt() の呼び出しを発行できます。
tpsetctxt() は、正常終了時には 0 以外の値を返します。
異常終了すると、tpsetctxt() は呼び出しプロセスを元のコンテキストに維持したまま -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpsetctxt() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPENOENT]
TPEPROTO]
tpsetctxt() が正しくないコンテキストで呼び出されました。たとえば、(a) サーバがディスパッチしたスレッドで呼び出された、(b) tpinit() を呼び出していないプロセスで呼び出された、(c) TPMULTICONTEXTS フラグを指定しないで tpinit() を呼び出したプロセスで呼び出された、または (d) TMNOTHREADS 環境変数がオンになっているプロセスで複数のスレッドから呼び出された、などです。
TPESYSTEM]
TPEOS]
「C 言語アプリケーション トランザクション モニタ インタフェースについて」、tpgetctxt(3c)
tpsetmbenc() - 型付きバッファにコード セットのエンコード名を設定
#include <atmi.h>
extern int tperrno;
int
tpsetmbenc(char *bufp, char *enc_name, long flags)
この関数は、コードセットのエンコード名の設定またはリセットに使用します。エンコード名は、型付き入力バッファと共に送信されます。このメッセージを受信するプロセスでは、tpgetmbenc() を使用してエンコード名を取得します。
tpsetmbenc() は、Tuxedo システム要求に含めるコードセットのエンコード名を設定します。この関数で呼び出し側のバッファに NULL 以外のエンコード名を設定すると、その設定をリセットまたは解除するまで、(tpcall()、tpsend() によって) 送信されるすべてのメッセージに、この文字列が入ります。tpalloc() の実行時に、TPMBENC 環境変数で初期コードセットのエンコード名が MBSTRING バッファに適用されます。エンコード名が未定義の MBSTRING バッファは無効です。
引数 bufp は、エンコード名で型付きバッファを指す有効なポインタです。
引数 enc_name は、コードセットのエンコードの識別に使用するエンコード名です。
引数 flags には、0 または RM_ENC を指定します。RM_ENC の場合、エンコード名が MBSTRING バッファから削除され、引数 enc_name は無視されます。MBSTRING バッファにエンコード名を設定しないと、_tmconvmb() による変換は失敗します。
正常終了の場合、tpsetmbenc() は値 0 を返します。エラーが発生した場合は、ゼロ以外の値を返し、tperrno を設定してエラー条件を示します。この関数は、次の原因により異常終了する可能性があります。
TPEINVAL]
TPESYSTEM]
tpalloc(3c)、tpconvmb(3c)、tpgetmbenc(3c)、tpservice(3c)、tuxsetmbenc(3c)
tpsetrepos() - Tuxedo サービス メタデータのリポジトリ ファイルのサービス パラメータの情報を追加、編集、削除
int tpsetrepos(char *reposfile, FBFR32* idata, FBFR32** odata)
tpsetrepos() は、TMMETADATA(5) で提供されている .TMMETAREPOS サービスへの代替リポジトリ アクセス インタフェースを提供し、Tuxedo サービス メタデータのリポジトリ ファイルのパラメータの情報を追加、編集、削除します。tpsetrepos() を使用するには、メタデータ リポジトリ ファイルが、要求元のネイティブ クライアントまたはサーバに存在している必要があります。このファイルにより、TMMETADATA(5) を開始していない場合でも、リポジトリ情報へのアクセスが可能になります。
tpsetrepos() は、Oracle Tuxedo ネイティブ ライブラリにリンクされたプロセスで使用できますが、Oracle Tuxedo ワークステーション ライブラリにリンクされたプロセスでは使用できません。
| 注意 : | tpsetrepos() を使用して、JOLT リポジトリ ファイルのサービス パラメータ情報を追加、編集、または削除することはできません。 |
reposfile
idata
odata
「METAREPOS(5)」では、tpsetrepos() が使用する FML32 バッファ形式について説明します。これは、MIB(5) で使用する形式と同じです。
tpsetrepos() は、成功した場合に 0 を返します。異常終了した場合は、tperrno を設定し、-1 を返します。ほとんどの異常終了では、Tuxedo MIB の場合と同様に、*odata の TA_ERROR フィールドに特定のエラーに関する情報が格納されています。
異常終了時には、tpsetrepos() は tperrno を次のいずれかの値に設定します。
| 注意 : | TPEINVAL の場合を除き、odata は、エラー条件についてさらに詳しい情報が得られるように、サービス エントリごとに TA_ERROR、TA_STATUS を含める形で変更されます。 |
[TPEINVAL]
[TPEMIB]
[TPEPROTO]
[TPEPERM]
[TPEOS]
[TPESYSTEM]
このインタフェースは、Oracle Tuxedo リリース 9.0 またはそれ以降でしか利用できません。
${TUXDIR}/lib/libtrep.a
${TUXDIR}/lib/libtrep.so.<rel>
${TUXDIR}/lib/libtrep.lib
buildclient を使用する場合は、ライブラリを手動でリンクする必要があります。この場合、-L${TUXDIR}/lib -ltrep を指定します。
tpgetrepos(3c)、tmloadrepos(1)、tmunloadrepos(1)、TMMETADATA(5)、『Oracle Tuxedo アプリケーションの設定』の「Tuxedo サービス メタデータ リポジトリの管理」
tpsetunsol() - 非請求メッセージの処理方式の設定
#include <atmi.h>
void (*tpsetunsol (void (_TMDLLENTRY *)(*disp) (char *data, long len, long flags))) (char *data, long len, long flags)
tpsetunsol() は、非請求メッセージが Oracle Tuxedo ATMI システムのライブラリによって受け取られる際に呼び出すルーチンをクライアントが指定できるようにします。tpsetunsol() の最初の呼び出しの前に、Oracle Tuxedo ATMI システムのライブラリがクライアントのために受け取った非請求メッセージは記録されますが、無視されます。NULL 関数ポインタを使用する tpsetunsol() を呼び出した場合も、同じ結果になります。システムが通知や検出のために使用する方法は、アプリケーションのデフォルトの設定で決まります。このデフォルトは、クライアントごとに変更できます (「tpinit(3c)」を参照)。
tpsetunsol() の呼び出し時に渡される関数ポインタは、所定のパラメータ定義に準拠していなければなりません。Tuxedo ライブラリとご使用のコードの間の適切な呼び出し規約を取得するために、Windows ベースのオペレーティング システムでは _TMDLLENTRY マクロが必要になります。Unix システムでは null 文字列に拡張されるため、_TMDLLENTRY マクロは必要ありません。
data は受け取った型付きバッファを指し、len はそのデータの長さを指定します。flags は現時点では使用されていません。data は、通知と一緒にデータが渡されない場合には NULL になります。data は、クライアントが認識しないタイプ/サブタイプのバッファであることがありますが、その場合、メッセージ データは不明瞭になります。
data はアプリケーション コードで解放することはできません。ただし、システムはこれを解放し、終了後、データ領域を無効にします。
アプリケーションの非請求メッセージ処理ルーチン内での処理は、Oracle Tuxedo ATMI 関数 tpalloc()、tpfree()、tpgetctxt()、tpgetlev()、tprealloc()、および tptypes() に限定されています。
マルチスレッド プログラミング環境では、非請求メッセージ処理ルーチンが tpgetctxt() を呼び出して、別のスレッドを作成し、そのスレッドに適切なコンテキストの tpsetctxt() を呼び出し、新しいスレッドに、クライアントが使用できる ATMI 関数をすべて使用させることができます。
tpsetunsol() がコンテキストに関連していないスレッドから呼び出されると、新しく生成されるすべての tpinit() コンテキストに対して、プロセスごとのデフォルトの非請求メッセージ ハンドラが作成されます。これは、既にシステムに関連付けられているコンテキストには影響しません。特定のコンテキストは、コンテキストがアクティブのときに tpsetunsol() を再度呼び出して、そのコンテキストの非請求メッセージ ハンドラを変更することができます。プロセス単位のデフォルトの非請求メッセージ ハンドラは、コンテキストに現在対応付けされていないスレッドで tpsetunsol() を再度呼び出すと、変更できます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tpsetunsol() の呼び出しを発行できません。
tpsetunsol() は、正常終了時には、非請求メッセージ処理ルーチンの以前の設定条件を返します (NULL も正常な戻り値の 1 つであり、メッセージ処理関数を事前に設定していなかったことを示します)。
異常終了すると、この関数は TPUNSOLERR を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpsetunsol() は tperrno を次のいずれかの値に設定します。
TPEPROTO]
TPESYSTEM]
TPEOS]
tpnotify(3c) で説明したインタフェースはすべて、ネイティブ サイトの UNIX システムベースのプロセッサおよび Windows プロセッサ上で利用できます。さらに、ルーチン tpbroadcast() と tpchkunsol() は、関数 tpsetunsol() ともとに、UNIX システムおよび MS-DOS ベースのプロセッサ上で利用することができます。
tpsign() - デジタル署名のための型付きメッセージ バッファのマーク
#include <atmi.h>
int tpsign(char *data, TPKEYhKey, longflags)
tpsign() は、hKey に関連するプリンシパルに代わって、デジタル署名のためのメッセージ バッファをマーク (登録) します。
data は、(1) 以前 tpalloc() を呼び出すプロセスによって割り当てられたメッセージ バッファ、または (2) システムによって受信プロセスに渡されたメッセージ バッファのうち、いずれかの有効な型付きメッセージ バッファを指している必要があります。バッファの内容は、tpsign() を起動してから修正することができます。
data が指すバッファがプロセスから伝送されると、デジタル署名登録要求に対して、公開鍵ソフトウェアがデジタル署名を生成し、メッセージ バッファにアタッチします。デジタル署名によって、受信プロセスはメッセージの署名者 (発信者) を検証することができます。
引数 flags は使用されません。この引数は将来の用途のために予約されており、0 に設定します。
異常終了すると、この関数は -1 を返し、tperrno を設定してエラー条件を示します。
TPEINVAL]
TPESYSTEM]
tpkey_close(3c)、tpkey_open(3c)
#include <atmi.h>
int tpsprio(prio, flags)
tpsprio() は、カレント コンテキストのカレント スレッドが、次に送信または転送する要求の優先順位を設定します。設定された優先順位は、次に送信される要求に対してのみ有効です。メッセージのキュー登録機能がインストールされている場合、優先順位を tpenqueue() や tpdequeue() によってキューへ登録、または削除されたメッセージに対しても設定することができます。デフォルトでは、prio に正または負の値を設定することにより、サービスの優先順位が、そのデフォルト値を基準として設定値の分だけ上下します。上限は 100、下限は 1 で、100 が最も高い優先順位を表します。要求のデフォルトの優先順位は、その要求の送信先となるサービスによって決まります。このデフォルトの設定は、管理時に指定してもよいですし (「UBBCONFIG(5)」を参照)、システムの省略時値 50 を使用してもかまいません。tpsprio() は、tpconnect() または tpsend() を介して送られるメッセージには影響しません。
メッセージは、10 回に 1 回は FIFO 方式に基づいて取り出されるため、優先順位の低いメッセージがキューにいつまでも残されることはありません。優先度の低いインタフェースやサービスでは、応答時間を問題にすべきではありません。
マルチスレッドのアプリケーションでは、tpsprio() はスレッド単位で動作します。
TPABSOLUTE
prio の絶対値で送信されます。この絶対値は 1 から 100 までの範囲内の数値とします (最も高い優先順位は 100 です)。この範囲外の値を指定すると、デフォルトの値が使用されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpsprio() の呼び出しを発行できません。
異常終了すると、tpsprio() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpsprio() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpacall(3c)、tpcall(3c)、tpdequeue(3c)、tpenqueue(3c)、tpgprio(3c)
tpstrerror() - Oracle Tuxedo ATMI システムのエラー メッセージ文字列の取得
#include <atmi.h>
char *
tpstrerror(interr)
tpstrerror() は LIBTUX_CAT からエラー メッセージのテキストを取得するために使用します。err は、Oracle Tuxedo ATMI システムの関数呼び出しが -1 またはその他の異常終了値を返した場合に tperrno に設定されるエラー コードです。
ユーザは、tpstrerror() から返されるポインタを、userlog() または fprintf() への引数として使用できます。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても tpstrerror() の呼び出しを発行できます。
正常終了すると、tpstrerror() はエラー メッセージ テキストを含む文字列を指すポインタを返します。
err が無効なエラー コードであった場合は、tpstrerror() は、NULL を返します。
異常終了すると、tpstrerror() は NULL を返しますが tperrno は設定しません。
#include <atmi.h>
.
.
.
char *p;
if (tpbegin(10,0) == -1) {
p = tpstrerror(tperrno);
userlog(“%s”, p);
(void)tpabort(0);
(void)tpterm();
exit(1);
}
userlog(3c)、Fstrerror、Fstrerror32(3fml)
tpstrerrordetail() - Oracle Tuxedo ATMI のエラーに関する詳細なメッセージ文字列の取得
#include <atmi.h>
char * tpstrerrordetail(interr, longflags)
tpstrerrordetail() は、Tuxedo ATMI エラーの詳細情報のテキストを取り出すのに使用します。err は、tperrordetail() が返す値です。
ユーザは、tpstrerrordetail() が返したポインタを userlog() または fprintf() に対する引数として使用できます。
flags は将来の使用を考慮して予約されているため、ゼロを指定してください。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tpstrerrordetail() の呼び出しを発行できます。
正常終了した場合は、この関数は、エラー メッセージのテキストを持つ文字列を指すポインタを返します。
異常終了時 (すなわち err が無効なエラー コードの場合)、tpstrerrordetail() は NULL を返します。
異常終了すると、tpstrerrordetail() は NULL を返し、tperrno は設定しません。
#include <atmi.h> . . .
int ret;
char *p;
if (tpbegin(10,0) == -1) {
ret = tperrordetail(0);
if (ret == -1) {
(void) fprintf(stderr, “tperrordetail() failed!\n”);
(void) fprintf(stderr,“tperrno = %d, %s\n”,
tperrno, tpstrerror(tperrno));
}
else if (ret != 0) {
(void) fprintf(stderr, “errordetail:%s\n”,
tpstrerrordetail(ret, 0));
}
.
.
.
}
「C 言語アプリケーション トランザクション モニタ インタフェースについて」、tperrordetail(3c)、tpstrerror(3c)、userlog(3c)、tperrno(5)
tpsubscribe() - イベントをサブスクライブする
#include <atmi.h>
long tpsubscribe(char *eventexpr, char *filter, TPEVCTL *ctl, long flags)
呼び出し側は tpsubscribe() を使用して、eventexpr で示されるイベントまたはイベントの集合をサブスクライブします。サブスクリプションは、Oracle Tuxedo ATMI のイベント ブローカ、TMUSREVT(5) によって保持され、イベントがポストされたときにサブスクライバに通知するために、tppost() によって使用されます。それぞれのサブスクリプションには、通知メソッドを指定します。通知メソッドは、クライアント通知、サービス呼び出し、または安定ストレージ内のキューへのメッセージ登録の 3 つの内いずれかの形式をとります。通知メソッドはサブスクライバのプロセスのタイプと tpsubscribe() に渡された引数によって決まります。
サブスクライブするイベントまたはイベントの集合は、eventexpr で指定します。eventexpr には、最大で 255 文字の正規表現が入った NULL で終了する文字列を指定します。たとえば、eventexpr が「¥e¥e..*」であれば、呼び出し側はシステムで生成されたすべてのイベントをサブスクライブします。eventexpr が「¥e¥e.SysServer.*」であれば、呼び出し側はシステムで生成されたサーバに関連するすべてのイベントをサブスクライブします。eventexpr が「[A-Z].*」であれば、呼び出し側は先頭に A-Z を持つすべてのユーザ イベント文字列をサブスクライブします。eventexpr が「.*(ERR|err).*」である場合、呼び出し側はサブストリング ERR または err のいずれかを含むすべてのユーザ イベントを登録しています。たとえば、account_error および ERROR_STATE と呼ばれるイベントは、どちらも登録の対象となります。正規表現の詳細については、「正規表現」を参照してください。
filter を指定する場合は、ブール値のフィルタ ルールを含む文字列を指定します。このルールは、イベント ブローカがイベントをポストする前に正しく評価しなければなりません。ポストするイベントを受け取ると、イベント ブローカはそのイベントのデータにフィルタ ルール (存在する場合) を適用します。データがフィルタ ルールのチェックにパスした場合、イベント ブローカは通知メソッドを呼び出します。データがフィルタ ルールを通過しない場合は、イベント ブローカは対応する通知メソッドを呼び出しません。呼び出し側は、異なるフィルタ ルールを利用して同じイベントを何度でもサブスクライブすることができます。
フィルタ ルールは、それが適用される型付きバッファに固有なものです。FML バッファおよび VIEW バッファの場合は、フィルタ ルールはそれぞれのブール式コンパイラ (それぞれ Fboolco(3fml) および Fvboolco(3fml) を参照) に渡すことができて、ポストされたバッファ (Fboolev(3fml) および Fboolev(3fml) を参照) に対して評価することができる文字列です。STRING バッファの場合は、フィルタ ルールは正規表現です。他のすべてのタイプのバッファの場合、カスタマイズしたフィルタ評価機構が必要です (カスタマイズしたフィルタ評価機構を追加する方法についての詳細は、buffer(3c) および typesw(5) を参照してください)。filter には、最大 255 文字の NULL で終了する文字列を指定します。
サブスクライバが Oracle Tuxedo ATMI のクライアント プロセスで、ctl が NULL の場合は、サブスクライブしているイベントがポストされたときに、イベント ブローカはサブスクライバに非請求メッセージを送ります。この場合、eventexpr に対して評価が成功するイベント名がポストされると、イベント ブローカは eventexpr に対応したフィルタ ルールに対してポストされたデータをテストします。データがフィルタ ルールによるチェックにパスした場合、あるいはそのイベントに対して適用すべきフィルタ ルールが存在しない場合は、サブスクライバはイベントとそのデータ、および非請求メッセージを受け取ることになります。非請求メッセージを受け取るためには、クライアントは非請求通知処理ルーチンを (tpsetunsol() を利用して) 登録しておく必要があります。Oracle Tuxedo ATMI システムのサーバ プロセスが、ctl パラメータを NULL にして tpsubscribe() を呼び出した場合は、tpsubscribe() は異常終了して tperrno を TPEPROTO に設定します。
非請求メッセージによってイベント通知を受け取るクライアントは、終了する前にイベント ブローカのアクティブなサブスクリプションのリストから、そのサブスクリプションを削除するべきです (詳細については、「tpunsubscribe(3c)」を参照してください)。クライアントは、tpunsubscribe() のワイルドカード ハンドル、-1 を使用することにより、非請求通知メソッドに関連するサブスクリプションを含むあらゆる「非永続的」サブスクリプションを削除することができます。プロセス終了後も存続するサブスクリプションおよびそれらに関連する通知メソッドについては、以下の TPEVPERSIST の説明を参照してください。クライアントが非持続型のサブスクリプションを削除せずに終了した場合は、イベント ブローカはクライアントにアクセスできなくなったことを検出すると、そのクライアントのサブスクリプションを削除します。
サブスクライバが (プロセス タイプにかかわらず) イベント通知をサービス ルーチンまたは安定ストレージ内のキューに送りたい場合は、ctl パラメータは有効な TPEVCTL 構造体を指さなければいけません。この構造体には次の要素が含まれます。
long flags;
char name1[32];
char name2[32];
TPQCTL qctl;
| 注意 : | サービス名の長さは 15 バイト以内に制限されています。サービス名の長さが 15 バイトを超える場合は、TPEINVAL が戻されます。 |
次に、ctl
flags 要素に指定する、イベントをサブスクライブするための制御オプションの有効なビットの一覧を示します。
TPEVSERVICE
ctl
name1 という名前の Oracle Tuxedo ATMI システムのサービス ルーチンに送りたいことを示します。この場合、eventexpr に対して評価が成功するイベント名がポストされると、イベント ブローカは eventexpr に対応したフィルタ ルールに対してポストされたデータをテストします。データがフィルタ ルールを通過する場合、またはイベントに対するフィルタ ルールが存在しない場合は、サービス要求はイベントと共にポストされたデータと合わせて ctl
name1 に送られます。ctl
name1 のサービス名には、Oracle Tuxedo ATMI システムの有効な任意のサービス名を指定することができ、このサービスはサブスクライブされたときにアクティブである場合もあれば、アクティブでない場合もあります。イベント ブローカによって呼び出されたサービス ルーチンは、応答データなしで戻ります。つまり、引数に NULL データを指定して tpreturn() を呼び出すはずです。tpreturn() に渡されるデータはドロップされます。TPEVSERVICE と TPEVQUEUE を同時に指定することはできません。
TPEVTRAN も同時に ctl
flags に設定し、また tppost() を呼び出すプロセスがトランザクション モードにある場合は、イベント ブローカはサービス ルーチンがポスト元のトランザクションの一部となるようにサブスクライブされたサービス ルーチンを呼び出します。イベント ブローカ (TMUSREVT(5)) とサブスクライブされたサービス ルーチンの両方が、トランザクションをサポートするサーバ グループに属していなければなりません (詳しくは、「UBBCONFIG(5)」を参照してください)。ctl
flags に TPEVTRAN を設定していない場合は、イベント ブローカは、サービス ルーチンがポスト元のトランザクションの一部とならないように、サブスクライブされたサービス ルーチンを呼び出します。
TPEVQUEUE
ctl
name1 という名前のキュー スペース、および ctl
name2 という名前のキューへ登録することを希望していることを示します。この場合、eventexpr に対して評価が成功するイベント名がポストされると、イベント ブローカは eventexpr に対応したフィルタ ルールに対してポストされたデータをテストします。データがフィルタ ルールを通過した場合、またはイベントに対応したフィルタ ルールが存在しない場合は、イベント ブローカはメッセージをイベントと共にポストされたデータと合わせて、ctl
name1 という名前のキュー スペース、および ctl
name2 という名前のキューに登録します。キュー スペースとキューの名前は、Oracle Tuxedo ATMI システムの有効な任意のキュー スペースおよびキューの名前で、サブスクリプションの実行時に存在している場合と存在していない場合があります。
ctl
qctl には、ポストされたイベントをイベント ブローカがキューに登録することに関するオプションをさらに指定することができます。オプションを何も指定しない場合は、ctl
qctl.flags には TPNOFLAGS を設定してください。設定する場合は、tpenqueue(3c) のマニュアル ページの「制御パラメータ」サブセクションで説明しているようにオプションを設定できます (特に、tpenqueue(3c) への入力情報を制御するフラグの有効なリストを説明しているセクションを参照してください)。TPEVSERVICE と TPEVQUEUE を同時に指定することはできません。
ctl
flags に TPEVTRAN も同時に指定し、tppost() を呼び出すプロセスがトランザクション モードにある場合は、イベント ブローカは、ポストされたイベントとそのデータがポスト元のトランザクションの一部となるように、それらをキューに登録します。イベント ブローカ (TMUSREVT(5)) はトランザクションをサポートするサーバ グループに属していなければなりません (詳しくは、「UBBCONFIG(5)」を参照してください)。ctl
flags に TPEVTRAN を設定しない場合は、イベント ブローカは、ポストされたイベントとそのデータがポスト元のトランザクションの一部とならないように、それらをキューに登録します。
TPEVTRAN
TPEVSERVICE または TPEVQUEUE のどちらかと同時に指定できます。
TPEVPERSIST
TPEVTRAN と同時に指定し、イベントの通知時にリソースが利用できない場合は、イベント ブローカはポスト元に戻り、トランザクションが中止しなければならないようにします。つまり、サブスクリプションが保持されている場合でも、リソースが使用できなければポスト元のトランザクションは異常終了します。
イベント ブローカのアクティブなサブスクリプションのリストに、tpsubscribe() が要求するサブスクリプションと一致するものがある場合は、この関数は異常終了して tperrno に TPEMATCH を設定します。サブスクリプションが既存のサブスクリプションと一致するためには、eventexpr と filter の両方が、イベント ブローカのアクティブなサブスクリプションのリストにすでに存在するサブスクリプションの eventexpr と filter に一致しなければなりません。また、通知メソッドによっては、サブスクリプションの一致を判断する際にこれ以外の基準も使用されます。
サブスクライバが Oracle Tuxedo ATMI システムのクライアント プロセスで、(イベントがポストされたときに、呼び出し側が非請求通知を受け取るように) ctl に NULL を設定した場合は、システム定義によるそのクライアント識別子 (CLIENTID と呼ばれています) も一致を調べるために使用されます。つまり tpsubscribe() は、eventexpr、filter、および呼び出し側の CLIENTID が、イベント ブローカにすでに知られているサブスクリプションが持つそれらの値と一致する場合に異常終了します。
呼び出し側が ctl
flags に TPEVSERVICE を設定した場合は、eventexpr、filter、および ctl
name1 に設定されたサービス名が、イベント ブローカにすでに知られているサブスクリプションが持つそれらの値と一致する場合に tpsubscribe() は異常終了します。
安定ストレージ内のキュー、キュー スペース、およびキューの名前へのサブスクリプションの場合は、一致を調べる際に eventexpr および filter に加えて相関識別子が使用されます。相関識別子を利用することにより、同じ送信先の、同じイベント式やフィルタ ルールに対する複数のサブスクリプションを区別することができます。したがって、呼び出し側が ctl
flags に TPEVQUEUE を設定し、ctl
qctl.flags に TPQCOORID が設定されなかった場合、eventexpr、filter、ctl
name1 に設定されたキュー スペース名、および ctl
name2 に設定されたキュー名が、イベント ブローカにすでに知られている (相関識別子が指定された) サブスクリプションが持つそれらの値と一致すると tpsubscribe() は異常終了します。さらに、ctl
qctl.flags に TPQCOORID が設定されている場合は、eventexpr、filter、ctl
-name1、ctl
name2、および ctl
qctl.corrid がイベント ブローカに既に知られている (同じ相関識別子が指定された) サブスクリプションのデータと一致すると、tpsubscribe() は異常終了します。
次に tpsubscribe() に指定できる有効な flags の一覧を示します。
TPNOBLOCK
tperrno には TPEBLOCK が設定されます。TPNOBLOCK が指定されていないときにブロッキング条件が存在すると、呼び出し側は、その条件が解消されるか、またはタイムアウト (トランザクションまたはブロッキング) が発生するまではブロックされます。
TPNOTIME
TPSIGRSTRT
TPSIGRSTRT が指定されていない場合にシグナルがシステム コールを中断させると、tpsubscribe() は異常終了し、tperrno には TPGOTSIG が設定されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpsubscribe() の呼び出しを発行できません。
表 11 で説明する正規表現は、UNIX システム エディタ、ed(1) で使用されるパターンに似ています。一般的な正規表現のほか、代替演算子 (|) も使用できます。ただし、全体的にほとんど変わりません。
正規表現 (RE: Regular Expressions) は、次に示すいずれかの規則を 1 回以上適用して作成します。
優先順位のレベルは 3 つあります。結合の強さの順に並べると、次のようになります。
上記のとおり、かっこは優先順位が高いことを明示的に示すために使用します。
tpsubscribe() は正常終了すると、イベント ブローカのアクティブなサブスクリプションのリストからこのサブスクリプションを削除するために使用できるハンドルを返します。サブスクライバやその他のプロセスは、いずれも返されたハンドルを利用してこのサブスクリプションを削除することができます。
異常終了すると、tpsubscribe() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpsubscribe() は tperrno を次のいずれかの値に設定します (特に記述した場合を除いては、エラーが呼び出し側のトランザクションに影響を及ぼすことはありません)。
TPEINVAL]
TPENOENT]
TPELIMIT]
TPEMATCH]
TPEPERM]
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。
TPETIME が発生します。ただし、例外が 1 つあります。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
buffer(3c)、tpenqueue(3c)、tppost(3c)、tpsetunsol(3c)、tpunsubscribe(3c)、Fboolco、Fboolco32、Fvboolco、Fvboolco32(3fml)、Fboolev、Fboolev32、Fvboolev、Fvboolev32(3fml)、EVENTS(5)、EVENT_MIB(5)、TMSYSEVT(5)、TMUSREVT(5)、tuxtypes(5)、typesw(5)、UBBCONFIG(5)
tpsuspend() - グローバル トランザクションの中断
#include <atmi.h>
int tpsuspend(TPTRANID *tranid, long flags)
tpsuspend() を使用して、呼び出し側のプロセス内でアクティブなトランザクションを中断します。tpbegin() により開始したトランザクションは、tpsuspend() で中断できます。中断を行ったプロセスまたは他のプロセスのいずれかが tpresume() を使用して、中断されたトランザクション上の作業を再開できます。tpsuspend() が復帰すると、呼び出し側はトランザクション モードではなくなります。ただし、トランザクションが中断されている間は、そのトランザクションに関係のあるリソース (データベース ロックなど) はすべてアクティブな状態に保たれます。アクティブなトランザクションと同様、中断されたトランザクションにもトランザクションを最初にスタートする際に割り当てたトランザクション タイムアウトの値が適用されます。
トランザクションを別のプロセスで再開するには、tpsuspend() の呼び出し側が明示的に tpbegin() を呼び出すことによってトランザクションを起動している必要があります。tpsuspend() は、トランザクションの開始元以外のプロセスから呼び出すこともできます (たとえば、トランザクション モードで要求を受信するサーバ)。後者の場合、tpsuspend() の呼び出し側のみ tpresume() を呼び出してトランザクションを再開することができます。このような方法が認められているのは、プロセスがトランザクションのスタートを一時中断し、そのトランザクションを終了する前に別のトランザクションをスタートさせ、作業を行えるようにするためです (エラーを記録するトランザクションを実行してから最初のトランザクションをロールバックする場合など)。
tpsuspend() は、中断されているトランザクションの識別子を、tranid で指される領域に返します。呼び出し側は tranid が指す空間を割り当てなければなりません。tranid が NULL の場合はエラーです。
正常終了するためには、呼び出し側は tpsuspend() を実行する前に、サーバとの未終了のコミュニケーションを全て完了していなければなりません。すなわち、呼び出し側は、呼び出し側のトランザクションに関連のある tpacall() で送出した要求に対する応答を、すべて受け取っていなければなりません。また、呼び出し側は、呼び出し側のトランザクションに関連のある会話型サービスとの接続を、全てクローズしていなければなりません (つまり、tprecv() は TPEV-SVCSUCC イベントを返していなければなりません)。この規則のいずれかが守られない場合には、tpsuspend() は異常終了し、呼び出し側の現在のトランザクションは中断されず、トランザクション コミュニケーションの記述子は有効なままです。呼び出し側のトランザクションに関連しないコミュニケーション記述子は、tpsuspend() の結果に関係なく有効なままです。
flags は将来使用するために予約されており、0 に設定されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpsuspend() の呼び出しを発行できません。
tpsuspend() はエラーの場合は -1 を返し、tperrno を設定してエラー条件を示します。
次の条件の場合、tpsuspend() は異常終了し、tperrno を次の値に設定します。
TPEINVAL]
TPEABORT]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpacall(3c)、tpbegin(3c)、tprecv(3c)、tpresume(3c)
tpsvrdone() - Oracle Tuxedo ATMI システム サーバの終了
#include <atmi.h>
void tpsvrdone(void)
Oracle Tuxedo ATMI システムのサーバ用ルーチンは、サービス要求の処理完了後、ルーチンを終了する前に tpsvrdone() を呼び出します。このルーチンを呼び出した時点では、サーバはまだシステムの一部のままですが、それ独自のサービスは宣言から外されています。このため、このルーチンで、Oracle Tuxedo ATMI システムとのコミュニケーションとトランザクションの定義を行うことができます。ただし、接続がオープン状態にある場合、保留中の非同期応答がある場合、あるいはまだトランザクション モードにある場合に tpsvrdone() が終了すると、Oracle Tuxedo ATMI システムはその接続をクローズし、保留中の応答を無視し、サーバが終了する前にトランザクションをアボートさせます。
サーバが tmshutdown -y を呼び出して停止された場合、サービスは中断され、tpsvrdone() で通信したりトランザクションを開始する機能は制限されます。
アプリケーションがこのルーチンをサーバで提供していない場合、Oracle Tuxedo ATMI システムが提供するデフォルトのバージョンが代わりに呼び出されます。サーバがシングルスレッド サーバとして定義されている場合、デフォルトの tpsvrdone() は tpsvrthrdone() を呼び出し、デフォルト バージョンの tpsvrthrdone() は tx_close() を呼び出します。サーバがマルチスレッド サーバとして定義されている場合、各サーバのディスパッチ スレッドで tpsvrthrdone() が呼び出され、tpsvrdone() からは呼び出されません。サーバがマルチスレッドかどうかに関わらず、デフォルトの tpsvrdone() は userlog を呼び出し、サーバが終了することを示します。
tpsvrdone() で呼び出された場合、tpreturn() と tpforward() は何も行わずただちに戻ります。
tpsvrthrdone(3c)、tpsvrthrinit(3c)、servopts(5)
tpsvrinit() - Oracle Tuxedo システム サーバの初期化
#include <atmi.h>
int tpsvrinit(intargc, char **argv)
Oracle Tuxedo ATMI システムのサーバ用ルーチンは、その初期化処理中に tpsvrinit() を呼び出します。このルーチンは、サーバに制御が移った後、サービス要求を処理する前に呼び出されます。このため、Oracle Tuxedo ATMI システムとのコミュニケーションとトランザクションの定義をこのルーチンで行うことができます。ただし、接続がオープン状態にあるとき、保留中の非同期応答があるとき、あるいはまだトランザクション モードにあるときに tpsvrinit() が戻った場合、Oracle Tuxedo ATMI システムはその接続をクローズし、保留中の応答を無視し、サーバが終了する前にトランザクションをアボートします。
アプリケーションがこのルーチンをサーバで提供していない場合、Oracle Tuxedo ATMI システムが提供するデフォルトのバージョンが代わりに呼び出されます。
サーバがシングルスレッド サーバとして定義されている場合、デフォルトの tpsvrinit() は tpsvrthrinit() を呼び出し、デフォルト バージョンの tpsvrthrinit() は tx_open() を呼び出します。サーバがマルチスレッド サーバとして定義されている場合、tpsvrthrinit() は各サーバのディスパッチ スレッドで呼び出されますが、tpsvrinit() からは呼び出されません。サーバがシングルスレッドかマルチスレッドかに関わらず、デフォルト バージョンの tpsvrinit() は userlog() を呼び出してサーバが正常に開始したことを示します。
アプリケーション固有のオプションをサーバに渡し、tpsvrinit() で処理させることができます (「servopts(5)」を参照)。このオプションは argc と argv を使用して渡します。getopt() が Oracle Tuxedo ATMI システムのサーバ用ルーチンで使用されているため、optarg()、optind() および opterr() を使用してオプションの解析やエラー検出を tpsvrinit() で制御できます。
| 注意 : | プログラムで tpsvrinit() を呼び出す場合は、ロング ブロッキングを行わないでください。ロング ブロッキングを行った場合、MP コンフィグレーション内の 1 つのリモート サーバが tpsvrinit() 処理を行うと、tmboot を実行しても、同じノード上のほかのサーバを起動できません。 |
tpsvrinit() でエラーが生じた場合、アプリケーションから -1 を返して明示的にサーバを終了させることができます (サービス要求をとらずに)。アプリケーション自体では exit() を呼び出さないようにしてください。
tpsvrinit() が -1 を返した場合、サーバはシステムによって再起動されません。代わりに、管理者が tmboot を実行してサーバを再起動する必要があります。
tpreturn() や tpforward() がサービス ルーチンの外部 (たとえば、クライアントや tpsvrinit()、あるいは tpsvrdone() で) 使用された場合、tpreturn() および tpforward() は何も行わずただちに戻ります。
tpopen(3c)、tpsvrdone(3c)、tpsvrthrinit(3c)、servopts(5)
C 言語リファレンス マニュアルの getopt(3)
tpsvrthrdone() - Oracle Tuxedo ATMI サーバのスレッドの終了
#include <atmi.h>
void tpsvrthrdone(void)
Oracle Tuxedo ATMI のサーバでは、ディスパッチされたサービス要求を処理するために開始された各スレッドを終了するときに、tpsvrthrdone() を呼び出します。つまり、スレッドが要求を処理する前に終了された場合でも、tpsvrdone() 関数が呼び出されます。このルーチンが呼び出されたとき、対象のスレッドはまだ Oracle Tuxedo ATMI サーバの一部ですが、すべてのサービス要求の処理を終了しています。このため、Oracle Tuxedo ATMI とのコミュニケーションとトランザクションの定義をこのルーチンで行うことができます。ただし、接続がオープン状態にある場合や保留中の非同期応答がある場合、あるいはまだトランザクション モードにある場合に tpsvrthrdone() が終了すると、Oracle Tuxedo ATMI システムはその接続をクローズし、保留中の応答を無視し、サーバが終了する前にトランザクションを異常終了させます。
アプリケーションがサーバ中にこのルーチンを記述していない場合、Oracle Tuxedo ATMI システムによって提供されるデフォルト バージョンの tpsvrthrdone() が代わりに呼び出されます。デフォルト バージョンの tpsvrthrdone() では、tx_close() が呼び出されます。
tpsvrthrdone() は、シングルスレッド サーバでも呼び出されます。シングルスレッド サーバの tpsvrthrdone() は、デフォルト バージョンの tpsvrdone() から呼び出されます。複数のディスパッチ スレッドが予測されるサーバでは、tpsvrdone() は tpsvrthrdone() を呼び出しません。
tpsvrthrdone() から呼び出された場合、tpreturn() と tpforward() 関数は単純に返るだけで影響はありません。
tpforward(3c)、tpreturn(3c)、tpsvrdone(3c)、tpsvrthrinit(3c)、tx_close(3c)、servopts(5)
tpsvrthrinit() - Oracle Tuxedo ATMI サーバのスレッドの初期化
#include <atmi.h>
int tpsvrthrinit(intargc, char **argv)
Oracle Tuxedo ATMI のサーバでは、ディスパッチされたサービス要求を処理する各スレッドを初期化するときに、tpsvrthrinit() を呼び出します。このルーチンは、サーバに制御が移った後、サービス要求を処理する前に呼び出されます。このため、Oracle Tuxedo ATMI とのコミュニケーションとトランザクションの定義をこのルーチンで行うことができます。ただし、接続がオープン状態にある場合や保留中の非同期応答がある場合、あるいはまだトランザクション モードにある場合に tpsvrthrinit() が終了すると、Oracle Tuxedo ATMI システムはその接続をクローズし、保留中の応答を無視し、サーバが終了する前にトランザクションを異常終了させます。
アプリケーションがサーバにこのルーチンを提供していない場合、Oracle Tuxedo ATMI システムによって提供されたデフォルト バージョンの tpsvrthrinit() が代わりに呼び出されます。デフォルト バージョンの tpsvrthrinit() は tx_open() を呼び出します。
tpsvrthrinit() は、シングルスレッド サーバでも呼び出されます。シングルスレッド サーバでは、tpsvrthrinit() はデフォルト バージョンの tpsvrinit() から呼び出されます。複数のディスパッチ スレッドが予測されるサーバでは、tpsvrinit() は tpsvrthrinit() を呼び出しません。
アプリケーション固有のオプションをサーバに渡し、tpsvrthrinit() で処理させることができます。オプションの詳細については、「servopts(5)」を参照してください。このオプションは argc と argv を使用して渡します。getopt() が Oracle Tuxedo ATMI サーバで使用されているため、optarg()、optind()、および opterr() を使用して tpsvrthrinit() のオプションの解析やエラー検出を制御できます。
tpsvrthrinit() でエラーが生じた場合、アプリケーションから -1 を返して正常に (サービス要求をとらずに) サーバのディスパッチ スレッドを終了させることができます。アプリケーションが、exit() やその他オペレーティング システムのスレッド終了関数を呼び出してはいけません。
負の戻り値によって、サーバのディスパッチ スレッドは正常に終了します。
サービス ルーチンの外側で使用された場合 (たとえば、クライアントまたは tpsvrinit()、tpsvrdone()、tpsvrthrinit()、tpsvrthrdone() で使用された場合)、tpreturn() と tpforward() 関数は単純に返るだけで影響はありません。
tpforward(3c)、tpreturn(3c)、tpsvrthrdone(3c)、tpsvrthrinit(3c)、tx_open(3c)、servopts(5)
#include <atmi.h>
int tpterm(void)
tpterm() は、Oracle Tuxedo ATMI システム アプリケーションからクライアントを削除します。クライアントがトランザクション モードであると、トランザクションはロールバックされます。tpterm() が正常に終了すると、呼び出し側は Oracle Tuxedo ATMI クライアント操作を実行できません。未終了の会話はただちに切断されます。
tpterm() を 2 回以上呼び出した場合 (すなわち、呼び出し側がすでにアプリケーションから離れた後で呼び出した場合)、何も処理は行われず、正常終了を示す値が返されます。
適切なプログラミングでは、1 つを残して他のすべてのスレッドがコンテキストを終了または切り替えると、最後のスレッドが tpterm() 呼び出しを発行します。このようにプログラミングされていないと、残りのスレッドは TPINVALIDCONTEXT コンテキスト状態になります。次に、このコンテキストのセマンティクスを説明します。
複数のスレッドが関連するコンテキストにおいて、1 つのスレッドで tpterm() が呼び出されると、この tpterm() は以下のように動作します。
別のスレッドがコンテキストを終了したときに ATMI 呼び出し内でブロックされたスレッドがあると、そのスレッドは ATMI 呼び出しから異常終了によって返され、tperrno は TPESYSTEM に設定されます。また、このような異常終了の後で tperrordetail() が呼び出された場合、tperrordetail() は TPED_INVALIDCONTEXT を返します。
シングルコンテキストのアプリケーションでは、単一のスレッドが tpterm() を呼び出すと、すべてのスレッドのコンテキスト状態が TPNULLCONTEXT に設定されます。
それに対して、マルチコンテキストのアプリケーションでは、tpterm() が 1 つのスレッドで呼び出されると、同じコンテキスト内の他のすべてのスレッドは、ほとんどの ATMI 関数を呼び出しても異常終了し、tperrno が TPEPROTO に設定されるような状態になります。このような無効なコンテキスト状態で使用できる関数と使用できない関数のリストについては、「C 言語アプリケーション トランザクション モニタ インタフェースについて」を参照してください。無効なコンテキスト状態 (TPINVALIDCONTEXT) のスレッドが tpgetctxt() 関数を呼び出した場合、tpgetctxt() によってコンテキストのパラメータが TPINVALIDCONTEXT に設定されます。
TPINVALIDCONTEXT 状態を終了させるには、次の関数のどちらかを呼び出します。
TPINVALIDCONTEXT コンテキストを設定して tpsetctxt() を呼び出すことはできません。このような場合は、異常終了して tperrno が TPEPROTO に設定されます。呼び出し側とアプリケーションを関連させる必要がない tpsetunsol() 以外の ATMI 関数をスレッドが呼び出すと、ATMI 関数は NULL コンテキストで呼び出されたときと同じように動作します。非請求のスレッド通知を使用するクライアント アプリーションは、tpterm() を明示的に呼び出して、非請求スレッドを終了する必要があります。
tpterm() 呼び出し後、スレッドは TPNULLCONTEXT コンテキスト状態になります。TPNULLCONTEXT コンテキストのスレッドで呼び出される ATMI 関数の多くは、暗黙的な tpinit() を実行します。tpinit() の呼び出しが成功するかどうかは、コンテキスト固有の問題やスレッド固有の問題ではなく、通常の要因によって決まります。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tpterm() の呼び出しを発行できます。
シングルコンテキストのアプリケーションで正常終了すると、このアプリケーションの現在のコンテキスト内のすべてのスレッドは、TPNULLCONTEXT 状態になります。
マルチコンテキストのアプリケーションで正常終了すると、呼び出し側のスレッドは TPNULLCONTEXT 状態になり、呼び出し側のスレッドと同じコンテキスト内の他のスレッドはすべて TPINVALIDCONTEXT 状態になります。後者のスレッドのコンテキスト状態は、引数 context を TPNULLCONTEXT か別の有効なコンテキストに設定して tpsetctxt() を実行すれば変更できます。
異常終了すると、tpterm() は呼び出し側のプロセスを元のコンテキスト状態のままで -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpterm() は tperrno を次のいずれかの値に設定します。
TPEPROTO]
TPESYSTEM]
TPEOS]
tpinit(3c)、tpgetctxt(3c)、tpsetctxt(3c)、tpsetunsol(3c)
tptypes() - 型付きバッファ情報を判別するルーチン
#include <atmi.h>
long tptypes(char *ptr, char *type, char *subtype)
tptypes() は、その第 1 引数として、データ バッファを指すポインタをとり、2 番目と 3 番目の引数でそれぞれタイプとサブタイプを返します。ptr は、tpalloc() から得たバッファを指していなければなりません。type と subtype が NULL でない場合、この関数は、そのバッファのタイプとサブタイプの名前をそれぞれ該当する文字配列に入れます。これらの名前が最大長であると (type の場合は 8、subtype の場合は 16)、この文字配列は NULL で終了しません。また、サブタイプが存在しない場合は、subtype が指す配列には NULL 文字列が入ります。
なお、type の場合は最初の 8 バイト、subtype の場合は最初の 16 バイトが格納されます。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tptypes() の呼び出しを発行できます。
正常終了の場合、tptypes() はバッファのサイズを返します。
異常終了すると、この関数は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tptypes() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpalloc(3c)、tpfree(3c)、tprealloc(3c)
tpunadvertise() - サービス名の宣言解除を行うルーチン
#include <atmi.h>
int tpunadvertise(char *svcname)
tpunadvertise() を使用すると、サーバは、宣言したサービスの宣言解除を行うことができます。デフォルトの設定では、サーバのサービスは、サーバのブート時に宣言され、サーバの停止時にその宣言が解除されます。
複数サーバ単一キュー (MSSQ) セットに属するすべてのサーバは、同じサービス セットを提供しなければなりません。これらのルーチンは、MSSQ セットを共有する全サーバを宣言することによってこの規則を適用します。
tpunadvertise() は、該当サーバ (または、呼び出し側の MSSQ セットを共有するサーバ セット) に対して宣言されたサービスとして svcname を除去します。svcname に NULL または NULL 文字列 ("") を使用することはできません。また、svcname の長さは 15 文字までとしてください (「UBBCONFIG(5)」の *SERVICES セクションを参照)。これ以上の長さの名前でも受け付けられますが、15 文字以降は切り捨てられてしまいます。このため、切り捨てられた名前が他のサービス名と同じにならないよう、注意が必要です。
異常終了すると、tpunadvertise() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpunadvertise() は tperrno を次のいずれかの値に設定します。
TPEINVAL]
TPENOENT]
TPEPROTO]
TPESYSTEM]
TPEOS]
tpunsubscribe() - イベントのサブスクリプションの削除
#include <atmi.h>
int tpunsubscribe(long subscription, long flags)
呼び出し側は tpunsubscribe() を使用して、Oracle Tuxedo ATMI のイベント ブローカのアクティブなサブスクリプションのリストからイベントのサブスクリプションまたはイベントのサブスクリプションの集合を削除します。subscription には、tpsubscribe() が返したイベントのサブスクリプションのハンドルを指定します。subscription をワイルドカード値の -1 に設定すると、tpunsubscribe() が、呼び出し側のプロセスが以前に行ったすべての非持続型のサブスクリプションを削除する指示になります。非持続型のサブスクリプションとは、tpsubscribe() の ctl
flags パラメータに TPEVPERSIST ビットを設定して行われたサブスクリプションのことです。持続タイプのサブスクリプションは、tpsubscribe() から返されたハンドルを使用することによってのみ削除できます。
ハンドル -1 を指定すると、呼び出し側のプロセスが行ったサブスクリプションのみを削除し、呼び出し側が以前に起動されたときに行ったサブスクリプションは削除しないことに注意してください (たとえば、異常終了した後で再起動したサーバでは、ワイルドカードを使用して以前のサーバが行ったサブスクリプションを削除することはできません)。
TPNOBLOCK
tperrno には TPEBLOCK が設定されます。TPNOBLOCK が指定されていないときにブロッキング条件が存在すると、呼び出し側は、その条件が解消されるか、またはタイムアウト (トランザクションまたはブロッキング) が発生するまではブロックされます。
TPNOTIME
TPSIGRSTRT
TPSIGRSTRT が指定されていない場合にシグナルがシステム コールを中断させると、tpunsubscribe() は異常終了し、tperrno には TPGOTSIG が設定されます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tpunsubscribe() の呼び出しを発行できません。
tpunsubscribe() が成功して戻ると、tpurcode() にはイベント ブローカのアクティブなサブスクリプションのリストから削除されたサブスクリプションの数 (0 または 1 以上) が指定されます。tpurcode() に 1 より大きな数が設定されるのは、ワイルドカードのハンドルを -1 に指定した場合のみです。また、tpunsubscribe() が失敗して終了した場合にも、tpurcode() に 1 より大きな数が設定されることがあります (つまり、ワイルドカードのハンドルを指定して、イベント ブローカがいくつかのサブスクリプションの削除に成功した後で、他のサブスクリプションを削除する際にエラーが発生したような場合です)。
異常終了すると、tpunsubscribe() は -1 を返し、tperrno を設定してエラー条件を示します。
異常終了時には、tpunsubscribe() は tperrno を次のいずれかの値に設定します (特に記述した場合を除いては、エラーが呼び出し側のトランザクションに影響を及ぼすことはありません)。
TPEINVAL]
TPENOENT]
TPETIME]
TPNOBLOCK または TPNOTIME が指定されている場合は発生しません。
TPETIME が発生します。ただし、例外が 1 つあります。その例外とは、ブロックされず、応答を期待せず、かつ呼び出し側のトランザクションの代わりに送信されない (つまり、TPNOTRAN、TPNOBLOCK および TPNOREPLY を設定して tpacall() を呼び出した場合の) 要求です。
TX_ROLLBACK_ONLY 状態になります。ほとんどの場合、この状態はタイムアウトと同じものとして扱われます。このトランザクションの以降の ATMI 呼び出しは、TPETIME で異常終了します (前の段落で説明した例外を除く)。
TPEBLOCK]
TPGOTSIG]
TPEPROTO]
TPESYSTEM]
TPEOS]
tppost(3c)、tpsubscribe(3c)、EVENTS(5)、EVENT_MIB(5)、TMSYSEVT(5)、TMUSREVT(5)
tputrace() - ユーザ定義のトレース情報のアプリケーション
#include <atmi.h>
int tputrace (char *trrec, int nest, char *category, char *funcname, int utrtype, va_list args)
tputrace(3c) は、詳細なトレース出力情報 (ATMI 関数との間でやり取りする完全なユーザ データの内容など) のモニタおよび取得方法を柔軟に設定できるユーザ定義の API で、この情報をどのように、またどこに出力するかを定義します。デフォルトでは、更新したり別にものに変更したりしない限り、tputrace() は、トレース レコード情報を userlog(3c) に出力します。
tputrace(3c) は、TMTRACE を指定した受信側 utrace を指定することで排他的に呼び出されます。たとえば、TMTRACE=atmi:utrace と呼び出します。utrace の受信側を指定すると、atmi トレース カテゴリ レコードに対してのみ tputrace(3c) が自動的に呼び出されて出力されます。TMTRACE および utrace 受信側の詳細については、『Oracle Tuxedo のファイル形式とデータ記述方法』の「tmtrace(5)」を参照してください。
trrec
ttrec は、tputrace(3c) の最初の引数として必ず指定されます。trrec を userlog に出力すると、tmtrace(5) と同じ結果になります。
nest
category
funcname
utrtype
args
tputrace(3c) 出力関数に渡す引数を定義します。これには、ATMI 関数に渡されるユーザ データまたはフラグが含まれます。「使用例」の tputrace() の実装例で、各 ATMI 関数の引数の一覧を示します。引数の一覧は、tmtrace(5) トレース情報出力でも参照できます。
独立した Tuxedo ライブラリである libutrace は、tputrace() と組み合わせて使用します。デフォルトの libutrace は、Tuxedo システム共有ライブラリ ディレクトリ (UNIX の場合は $TUXDIR/lib、Windows の場合は %TUXDIR%\bin) にインストールされます。
ユーザ独自のカスタム libutrace ライブラリを作成し、それを次のいずれかにインストールすることもできます。
システム ディレクトリにインストールされたカスタム libutrace ライブラリは、デフォルト libutrace に代わって、マシン上のすべての Tuxedo クライアントおよびサーバで使用されます。アプリケーション ディレクトリにインストールされたカスタム libutrace ライブラリは、そのアプリケーションのクライアントおよびサーバにのみ使用されます。
tputrace() を変更した場合には、libutrace ライブラリを必ず再コンパイルして Tuxedo 9.0 以上にリンクする必要があります。サンプルの tputrace() ソース ファイルは、$TUXDIR/samples/atmi/libutrace ディレクトリにあります。
「使用例」では、詳細な tputrace() のカスタマイズ方法を示します。
| 警告 : | デフォルトまたはカスタムの libutrace ライブラリは、BBL または WSL などのシステム サーバを含むすべての Tuxedo アプリケーション プロセスにロードされます。そのため、すべての Tuxedo システム サーバは、libutrace のロードに多少のメモリを消費します。デフォルト libutrace ライブラリは、サイズが非常に小さいので、メモリ消費を気にする必要はありませんが、カスタム libutrace の場合、ユーザが追加した機能の数によっては、メモリ消費量が増える可能性があります。 |
以下に、Tuxedo simpapp サンプル プログラムで simpcl を実行した場合のユーザレベル トレース情報の userlog の出力を示します。
ユーザレベル トレース情報をカスタマイズして出力するには、以下の操作を行う必要があります。
TMTRACE=atmi:utrace を指定した場合、ATMI 関数に渡されるユーザ データの内容とフラグが Tuxedo userlog に書き込まれます。
091206.HOST1!?proc.1560.1520.0: UTRAC:at: } tpinit = 1
091206.HOST1!?proc.1560.1520.0: UTRAC:at: { tpalloc("STRING", "", 7)
091206.HOST1!?proc.1560.1520.0: UTRAC:at: } tpalloc = 0x86a8e8
091206.HOST1!?proc.1560.1520.0: UTRAC:at: { tpalloc("STRING", "", 7)
091206.HOST1!?proc.1560.1520.0: UTRAC:at: } tpalloc = 0x87fa20
091206.HOST1!?proc.1560.1520.0: UTRAC:at: { tpcall(
091206.HOST1!?proc.1560.1520.0: UTRAC:at: svc="TOUPPER"
091206.HOST1!?proc.1560.1520.0: UTRAC:at: idata=(0x86a8e8){
091206.HOST1!?proc.1560.1520.0: UTRAC:at: len=0
091206.HOST1!?proc.1560.1520.0: UTRAC:at: type="STRING"
091206.HOST1!?proc.1560.1520.0: UTRAC:at: value="abcdef"
091206.HOST1!?proc.1560.1520.0: UTRAC:at: }
091206.HOST1!?proc.1560.1520.0: UTRAC:at: odata=(0x12ff48){
091206.HOST1!?proc.1560.1520.0: UTRAC:at: data=(0x87fa20){
091206.HOST1!?proc.1560.1520.0: UTRAC:at: len=0
091206.HOST1!?proc.1560.1520.0: UTRAC:at: type="STRING"
091207.HOST1!?proc.1560.1520.0: UTRAC:at: }
091207.HOST1!?proc.1560.1520.0: UTRAC:at: len=(0x12ff44)0
091207.HOST1!?proc.1560.1520.0: UTRAC:at: }
091207.HOST1!?proc.1560.1520.0: UTRAC:at: flags=<none>
091207.HOST1!?proc.1560.1520.0: UTRAC:at: )
091207.HOST1!simpserv.760.2188.0: UTRAC:at: { tpservice(
091207.HOST1!simpserv.760.2188.0: UTRAC:at: svcinfo=(0x5e1518){
091207.HOST1!simpserv.760.2188.0: UTRAC:at: name="TOUPPER"
091207.HOST1!simpserv.760.2188.0: UTRAC:at: flags=<none>
091207.HOST1!simpserv.760.2188.0: UTRAC:at: data=(0x602820){
091207.HOST1!simpserv.760.2188.0: UTRAC:at: len=7
091207.HOST1!simpserv.760.2188.0: UTRAC:at: type="STRING"
091207.HOST1!simpserv.760.2188.0: UTRAC:at: value="abcdef"
091207.HOST1!simpserv.760.2188.0: UTRAC:at: }
091207.HOST1!simpserv.760.2188.0: UTRAC:at: cd=0
091207.HOST1!simpserv.760.2188.0: UTRAC:at: appkey=0
091207.HOST1!simpserv.760.2188.0: UTRAC:at: cltid=(0x5e154c){1095811926,0,12,0}
091207.HOST1!simpserv.760.2188.0: UTRAC:at: }
091207.HOST1!simpserv.760.2188.0: UTRAC:at: )
091207.HOST1!simpserv.760.2188.0: UTRAC:at: { tpreturn(
091207.HOST1!simpserv.760.2188.0: UTRAC:at: rval=TPSUCCESS
091207.HOST1!simpserv.760.2188.0: UTRAC:at: rcode=0
091207.HOST1!simpserv.760.2188.0: UTRAC:at: data=(0x602820){
091207.HOST1!simpserv.760.2188.0: UTRAC:at: len=0
091207.HOST1!simpserv.760.2188.0: UTRAC:at: type="STRING"
091207.HOST1!simpserv.760.2188.0: UTRAC:at: value="ABCDEF"
091207.HOST1!simpserv.760.2188.0: UTRAC:at: }
091207.HOST1!simpserv.760.2188.0: UTRAC:at: flags=<none>
091207.HOST1!simpserv.760.2188.0: UTRAC:at: )
091207.HOST1!?proc.1560.1520.0: UTRAC:at: } tpcall(
091207.HOST1!?proc.1560.1520.0: UTRAC:at: ret=0
091207.HOST1!?proc.1560.1520.0: UTRAC:at: odata=(0x12ff48){
091207.HOST1!?proc.1560.1520.0: UTRAC:at: data=(0x881690){
091207.HOST1!?proc.1560.1520.0: UTRAC:at: len=7
|091207.HOST1!?proc.1560.1520.0: UTRAC:at: type="STRING"
091207.HOST1!?proc.1560.1520.0: UTRAC:at: value="ABCDEF"
091207.HOST1!?proc.1560.1520.0: UTRAC:at: }
091207.HOST1!?proc.1560.1520.0: UTRAC:at: len=(0x12ff44)7
091207.HOST1!simpserv.760.2188.0: UTRAC:at: } tpreturn [long jump]
091207.HOST1!?proc.1560.1520.0: UTRAC:at: }
091207.HOST1!?proc.1560.1520.0: UTRAC:at: )
091207.HOST1!?proc.1560.1520.0: UTRAC:at: { tpfree(0x86a8e8)
091207.HOST1!?proc.1560.1520.0: UTRAC:at: } tpfree
091207.HOST1!?proc.1560.1520.0: UTRAC:at: { tpfree(0x881690)
091207.HOST1!?proc.1560.1520.0: UTRAC:at: } tpfree
091207.HOST1!simpserv.760.2188.0: UTRAC:at: } tpservice
091207.HOST1!?proc.1560.1520.0: UTRAC:at: { tpterm()
091207.HOST1!?proc.1560.1520.0: UTRAC:at: } tpterm = 1
091207.HOST1!?proc.1560.1520.-2: UTRAC:at: { tpterm()
091207.HOST1!?proc.1560.1520.-2: UTRAC:at: } tpterm = 1
tmutrace(3c) は、正常に実行された場合に 0、障害が発生した場合に -1 を返します。
障害は、tputrace() ユーザレベルの実装/カスタマイズによって異なります。Tuxedo 9.0 以上に付属のデフォルト tputrace() 実装では、障害は発生しません。
userlog(3c)
tpxmltofml32() - XML データを FML32 バッファに変換
#include <fml32.h>
int tpxmltofml32 (char *xmlbufp, char *vfile, FBFR32 **fml32bufp, char **rtag, long flags)
この関数は、XML バッファを FML32 データに変換するために使用します。以下の引数を使用できます。
xmlbufp
vfile
TPXPARSNSPACE フラグと TPXPARSDOSCHE フラグを設定する必要があります。TPXPARSNEVER フラグは設定しないでください。
fml32bufp
rtag
flags
flags の一覧を示します。
| 注意 : | 同時に使用した場合、TPXPARSNEVER は TPXPARSALWAYS よりも優先されます。 |
setValidationSchemaFullChecking を true に設定します。このフラグを使用すると、完全なスキーマ制約チェックをオンまたはオフにできます。スキーマ検証が有効な場合にのみ機能します。オフにした場合は、部分的な制約チェックが実行されます。完全なスキーマ制約チェックには、多くの時間またはメモリが必要なものもあります。現在、このオプションでは、微細な固有属性チェックと派生制約チェックを制御します。
setValidationConstraintFatal を true に設定します。このフラグを使用すると、検証制約エラーが発生した場合のパーサの動作を設定できます。true に設定した場合、パーサは、検証エラーを致命的として処理し、getExitOnFirstFatalError の状態に従って終了します。false に設定した場合は、エラーを報告し、処理を続行します。
setDoNamespaces を true に設定します。このフラグを使用すると、パーサによるネームスペースの処理を有効または無効にできます。true に設定した場合、パーサは、NameSpace 仕様で指定したすべての制約とルールを適用します。
setDoSchema を true に設定します。このフラグを使用すると、パーサによるスキーマの処理を有効または無効にできます。false に設定した場合、パーサは、見つかったスキーマを処理しません。
| 注意 : | true に設定した場合は、ネームスペースの処理もオンになっている必要があります。 |
setCreateEntityReferencNodes を false に設定します。このフラグを使用すると、生成中の DOM ツリーでパーサがエンティティ参照ノードを作成するかどうかを指定できます。このフラグが true の場合、パーサは、DOM ツリーに EntityReference ノードを作成します。EntityReference ノードとその子ノードは読み取り専用です。このフラグが false の場合、EntityReference ノードは作成されません。エンティティの代替テキストが、エンティティ参照ノードの子として追加されるか、所定の参照の位置に挿入されます。
setExitOnFirstFatalError を false に設定します。このフラグを使用すると、最初に致命的なエラーが発生した場合のパーサの動作を設定できます。true に設定した場合、パーサは最初の致命的なエラーで終了します。false に設定した場合は、エラーを報告し、処理を続行します。
setIncludeIgnorableWhitespace を false に設定します。このフラグを使用すると、無視できる余白をテキスト ノードとして検証パーサに含めるかどうかを指定できます。非マークアップ テキストを常に含む非検証パーサには無効です。
setcacheGrammarFromParse を true に設定します。このフラグを使用すると、XML 文書を解析する際の文法のキャッシュを有効または無効にできます。true に設定すると、パーサは、結果の文法を以降の解析で使用するためにキャッシュします。フラグを true に設定した場合、Use キャッシュ文法フラグも true に設定されます。
成功した場合、tpxmltofml32() は 0 を返します。この関数は、エラー発生時に -1 を返し、tperrno を設定してエラー条件を示します。
TPEINVAL]
TPESYSTEM]
userlog(3) に書き込まれます。これは、FML32 への変換を実行できなかった時期も示します。そのインスタンスでは、エラーの詳細な情報が userlog に追加されます。
TPEOS]
tpfml32toxml(3c)、tpxmltofml(3c)、tpfmltoxml(3c)
tpxmltofml() - XML データを FML バッファに変換
#include <fml.h>
int tpxmltofml (char *xmlbufp, char *vfile, FBFR **fmlbufp, char **rtag, long flags)
この関数は、XML データを FML バッファに変換するために使用します。以下の引数を使用できます。
xmlbufp
vfile
TPXPARSNSPACE フラグと TPXPARSDOSCHE フラグを設定する必要があります。TPXPARSNEVER フラグは設定しないでください。
fmlbufp
rtag
flags
flags の一覧を示します。
| 注意 : | 同時に使用した場合、TPXPARSNEVER は TPXPARSALWAYS よりも優先されます。 |
setValidationSchemaFullChecking を true に設定します。このフラグを使用すると、完全なスキーマ制約チェックをオンまたはオフにできます。スキーマ検証が有効な場合にのみ機能します。オフにした場合は、部分的な制約チェックが実行されます。完全なスキーマ制約チェックには、多くの時間またはメモリが必要なものもあります。現在、このオプションでは、微細な固有属性チェックと派生制約チェックを制御します。
setValidationConstraintFatal を true に設定します。このフラグを使用すると、検証制約エラーが発生した場合のパーサの動作を設定できます。true に設定した場合、パーサは、検証エラーを致命的として処理し、getExitOnFirstFatalError の状態に従って終了します。false に設定した場合は、エラーを報告し、処理を続行します。
setDoNamespaces を true に設定します。このフラグを使用すると、パーサによるネームスペースの処理を有効または無効にできます。true に設定した場合、パーサは、NameSpace 仕様で指定したすべての制約とルールを適用します。
setDoSchema を true に設定します。このフラグを使用すると、パーサによるスキーマの処理を有効または無効にできます。false に設定した場合、パーサは、見つかったスキーマを処理しません。
| 注意 : | true に設定した場合は、ネームスペースの処理もオンになっている必要があります。 |
setCreateEntityReferencNodes を false に設定します。このフラグを使用すると、生成中の DOM ツリーでパーサがエンティティ参照ノードを作成するかどうかを指定できます。このフラグが true の場合、パーサは、DOM ツリーに EntityReference ノードを作成します。EntityReference ノードとその子ノードは読み取り専用です。このフラグが false の場合、EntityReference ノードは作成されません。エンティティの代替テキストが、エンティティ参照ノードの子として追加されるか、所定の参照の位置に挿入されます。
setExitOnFirstFatalError を false に設定します。このフラグを使用すると、最初に致命的なエラーが発生した場合のパーサの動作を設定できます。true に設定した場合、パーサは最初の致命的なエラーで終了します。false に設定した場合は、エラーを報告し、処理を続行します。
setIncludeIgnorableWhitespace を false に設定します。このフラグを使用すると、無視できる余白をテキスト ノードとして検証パーサに含めるかどうかを指定できます。非マークアップ テキストを常に含む非検証パーサには無効です。
setcacheGrammarFromParse を true に設定します。このフラグを使用すると、XML 文書を解析する際の文法のキャッシュを有効または無効にできます。true に設定すると、パーサは、結果の文法を以降の解析で使用するためにキャッシュします。フラグを true に設定した場合、Use キャッシュ文法フラグも true に設定されます。
正常終了の場合、tpxmltofml() は値 0 を返します。エラーが発生した場合は、-1 を返し、tperrno を設定してエラー条件を示します。
[TPEINVAL]
TPESYSTEM]
userlog(3c) に書き込まれます。これは、FML への変換を実行できなかった時期も示します。そのインスタンスでは、エラーの詳細な情報が userlog に追加されます。
TPEOS]
tpxmltofml32(3c)、tpfml32toxml(3c)、tpfmltoxml(3c)
#include <texc.h>
TRYtry_block
[ CATCH(exception_name)handler_block] ...
[CATCH_ALLhandler_block]
ENDTRY
TRYtry_block
FINALLYfinally_block
ENDTRY
RAISE(exception_name)
RERAISE
/* 例外の宣言 */
EXCEPTIONexception_name;
/* アドレス (アプリケーション) 例外の初期化 */
EXCEPTION_INIT(EXCEPTIONexception_name)
/* ステータス例外の初期化 (ステータスを例外にマップ) */
exc_set_status(EXCEPTION *exception_name, longstatus)
/* ステータス例外をステータスにマップ */
exc_get_status(EXCEPTION *exception_name, long *status)
/* 例外の比較 */
exc_matches(EXCEPTION *e1, EXCEPTION *e2)
/* stderr にエラーを出力 */
void exc_report(EXCEPTION *exception)
TRY/CATCH インタフェースは、ステータス変数 (たとえば、errno や RPC オペレーションで返されるステータス変数) を使用せずに例外を処理する機能を提供します。これらのマクロは texc.h に定義されています。
TRY の try_block は C または C++ の宣言文とステートメントのブロックであり、このブロック内で例外が発生します (例外の発生と関係のないコードは try_block の前、あるいは後に配置します)。TRY/ENDTRY の対により、例外のスコープ、つまり例外を検出するコード リージョンが構成されます (C 言語のスコーピングとは異なります)。これらのスコープはネストすることができます。例外が発生すると、例外を処理するためのアクション (CATCH または CATCH_ALL クローズ)、あるいはスコープを完結するためのアクション (FINALLY クローズ) に対応するアクティブなスコープを検索することにより、エラーがアプリケーションにレポートされます。スコープが例外処理を行えない場合には、そのスコープは終了し次の上位レベルで例外が生成されます (例外スコープのスタックをアンワインドします)。実行は、処理が行われた箇所の後から再開します。エラーが発生した箇所から実行を再開することはありません。いずれのスコープでも例外が処理されない場合には、プログラムは終了します (userlog(3c) と abort(3) を呼び出すことにより、メッセージがログに書き込まれます)。
CATCH (exception_name) handler_block は、存在しなくても複数回記述してもかまいません。各 handler_block は C または C++ の宣言文またはステートメントであり、対応する例外 (exception_name) の処理を行います (通常、障害からリカバリするためのアクションが指定されます)。例外が try_block 内のステートメントで発生した場合には、その例外に対応する最初の CATCH クローズが実行されます。
CATCH または CATCH_ALL handler_block 内では、現レベルの例外は EXCEPTION ポインタ THIS_CATCH により参照できます (たとえば、例外値に基づくロジックや、例外値の出力など)。
例外がいずれの CATCH クローズでも処理できない場合には、CATCH_ALL クローズが実行されます。デフォルトでは CATCH または CATCH_ALL クローズで処理される例外に対しては、それ以上のアクションは取られません。CATCH_ALL クローズが存在しない場合には、try_block が他の try_block にネストされているものと想定し、次の上位の try_block で例外が発生します。ANSI C コンパイラを使用した場合には、ハンドラ ブロック内で使用されるレジスタと自動変数に volatile 属性を付加して宣言しなければなりません (setjmp/longjmp を使用するブロックの場合も同様です)。また、例外を発生する関数からの出力パラメータと戻り値は、不明であることに注意してください。
CATCH または CATCH_ALL handler_block 内では、現レベルの例外は RERAISE ステートメントにより、次の上位のレベルに伝播されます (例外が再度発生します)。RERAISE ステートメントは、handler_block のスコープ内 (つまり handler_block により呼び出された関数内ではありません) になければなりません。検出はできますが、完全には処理できない例外はすべて出し直さなければなりません。ほとんどの場合、ハンドラはすべての例外を処理するようには書かれていないので、CATCH_ALL ハンドラは例外を再度発生させる必要があります。アプリケーションは、例外が該当するスコープで発生し、ハンドラ ブロックが適切な処理を行って該当するステータスを変更するように書かれなければなりません (たとえば、ファイルのオープン中に例外が発生した場合には、そのレベルの例外関数は、オープンされていないファイルをクローズしてはいけません)。
例外は、RAISE (exception_name) ステートメントを使用してどこででも発生させることができます。このステートメントにより、例外は現在の try_block から伝播を開始して、処理が行われる上位レベルに到達するまで出し直されます。
FINALLY クローズは、例外の発生に関係なく、try_block の後で実行されるコードの終局ブロックを指定するのに使用します。例外は try_block 内で発生した場合には、finally_block が実行された後で出し直されます。このクローズは、終局コードを重複して使用しないように、つまり CATCH_ALL クローズ内と ENDTRY の後で二度繰り返して使用しないようにするためのものです。このクローズは通常、クリーンアップ作業を行い、例外の発生に関係なく (つまりブロックでの正常終了と異常終了の両方で) スコープがアンワインドする際にインバリアント (たとえば、共有データ、ロック) をリストアするのに使用します。FINALLY クローズは、同じ try_block に対しては CATCH や CATCH_ALL クローズと一緒に使用することはできません。try_block をネストして使用します。
TRY ブロックを終了するには、ENDTRY ステートメントを使用しなければなりません。このステートメントは、例外が処理されコンテキストがクリーンアップされたことを確かめるために実行するコードを含んでいます。try_block や handler_block、finally_block には、return、ローカルではない jump、あるいは ENDTRY に到達せずにブロックを出る手法 (goto()、break()、continue()、longjmp() など) を含めてはいけません。
このインタフェースは、RPC オペレーションからの例外を処理するために提供されています。ただしこのインタフェースは、すべてのアプリケーションで使用することのできる汎用のインタフェースです。例外は、EXCEPTION の形式で宣言されます (これは複雑なデータ タイプで、long integer のようには使用できません)。2 種類の例外があります。どちらも同じ方法で宣言されますが、初期化の方法は異なります。
一方の例外はアプリケーション例外を定義するのに使用され、EXCEPTION_INIT() マクロを呼び出して初期化されます。例外のアドレスは address 例外内の値として格納されます。この値は単一のアドレス空間内でのみ有効であり、例外が自動変数の場合には変更されることに注意してください。このため address 例外は静的変数あるいは外部変数として宣言し、自動変数あるいはレジスタ変数として宣言すべきではありません。exc_get_status() マクロは、address 例外では -1 となります。この例外で exc_set_status() マクロを使用すると status 例外となります。
exc_matches マクロは、2 つの例外を比較するのに使用します。同一であるためには、どちらの例外も同じタイプであり、同じ値を持たなければなりません (つまり、status 例外に対しては同じステータス値を持つか、address 例外に対しては同じアドレスを持ちます)。この比較は、上記の CATCH クローズで使用されます。
ステータス例外が発生した場合の通常の処理は、ステータス値を表示するか、より好ましい方法としてはステータス値が何であるかを示す文字列を表示することです。文字列を標準エラー出力に表示するのであれば、文字列を 1 回の操作で表示できるように status 例外へのポインタを付加して関数 exc_report() を呼び出します。
CATCH_ALL
{
exc_report(THIS_CATCH);
}
ENDTRY
文字列に対して他の処理を行う場合には (たとえば、エラーをユーザ ログに出力する)、exc_get_status() を THIS_CATCH で使用し、ステータス値を取得できます (THIS_CATCH は EXCEPTION に対するポインタであり、EXCEPTION 自体ではありません)。dce_error_inq_text() を使用して、ステータス値の文字列を取得することができます。
CATCH_ALL
{
unsigned long status_to_convert;
unsigned char error_text[200];
int status;
exc_get_status(THIS_CATCH,status_to_convert);
dce_error_inq_text(status_to_convert, error_text, status);
userlog(“%s”, (char *)error_text);
}
ENDTRY| 注意 : | マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、TRY/CATCH インタフェースを呼び出すことができます。 |
RPC オペレーションのステータスは、各オペレーションごとにステータス変数を定義することにより決定できます ([comm_status} と [fault_status] パラメータは、ACF (Attribute Configuration File) で定義されます)。ステータス復帰インタフェースは、X/Open RPC 仕様で提供される唯一のインタフェースです。fault_status 属性は、不適切なパラメータ、リソース不足、コーディング エラー等によりサーバ上で発生したエラーが、補助的なステータス引数や戻り値でレポートされることを示しています。同様に comm_status 属性は、RPC コミュニケーション障害が補助的なステータス引数や戻り値でレポートされることを示します。ステータス値を利用する処理は、各コールごとに起こり得るエラーに対して指定されたリカバリを行う (コールごとの) きめ細かいエラー処理と、障害の時点での再試行が必要な場合にはうまく機能します。欠点としては、コールがローカルなものであってもリモートなものであっても、いずれの場合にも透過性がない点が挙げられます。リモート コールには追加のステータス パラメータ、あるいは void の代わりにステータスの戻り値が必要になります。従ってアプリケーションでは、ローカルと分散コード間で調整を行うプロシージャ宣言が必要です。
TRY/CATCH 例外復帰インタフェースは、OSF/DCE 環境からのアプリケーション移植性のためにも提供されています。このインタフェースは、すべての環境で利用できるものではありません。しかし、プロシージャ宣言をローカルと分散コード間で調整する必要がないという利点があり、既存のインタフェースを保持できます。各プロシージャ コールは固有の障害チェックやリカバリ コードを持つ必要がなく、エラー チェッキングを簡素化できます。あるレベルでエラー処理が行えない場合には、プログラムは、「エラーが検出されたが修正可能である」などのシステム エラー メッセージを出力して終了します (メッセージを省略すると、エラー チェッキングはより簡単になります)。例外は、大まかな例外処理を行う場合には有用です。
表 12 に示す例外は、この例外インタフェースで使用するために組み込まれている例外です。最初の TRY クローズはシグナル ハンドラを設定し、以下にリストされたシグナル (無視されることがなく、補足可能なもの) を補足します。その他の例外は DCE 対応のプログラムでの移植性のためにのみ定義されたものです。
名前の後に「_e」が付加された同じ例外コードが定義されています (exc_e_SIGBUS は、exc_SIGBUS_e とも定義されています)。同等のステータス コードが同様な名前で定義されていますが、「_e_」は「_s_」に変更されています (exc_e_SIGBUS は、exc_s_SIGBUS ステータス コードと同等です)。
OSF/DCE では、ヘッダ ファイルは exc_handling.h と命名されますが、Oracle Tuxedo ATMI システムのヘッダ ファイルは texc.h です。同じソース ファイルで DCE と Oracle Tuxedo ATMI システムの例外処理を両方使用することはできません。また 1 つのプログラム内では、シグナル例外の処理は DCE か Oracle Tuxedo ATMI システムのいずれか一方でしか行えません。
例外を使用する C 言語のソース ファイルを以下に示します。
#include <texc.h>
EXCEPTION badopen_e; /* 不正な open() に対する例外宣言 */
doit(char *filename)
{
EXCEPTION_INIT(badopen_e); /* 例外の初期化 */
TRY get_and_update_data(filename); /* 処理の実行 */
CATCH(badopen_e) /* 例外 - open() が異常終了しました */
fprintf(stderr, “Cannot open %s\en”, filename);
CATCH_ALL /* 他のエラーの処理 */
/* 利用できない rpc サービスの処理 ... */
exc_report(THIS_CATCH)
ENDTRY
}
/*
* 出力ファイルのオープン
* リモート データ項目の取得
* ファイルへの書き込み
*/
get_and_update_data(char *filename)
{
FILE *fp;
if ((fp == fopen(filename)) == NULL) /* 出力ファイルのオープン */
RAISE(badopen_e); /* 例外の生成 */
TRY
/* このブロックでは、ファイルは正常にオープンされました -
* FINALLY を使用してファイルをクローズします
*/
long data;
/*
* RPC コールの実行 -
* 呼び出し側関数 doit() に対して例外を出します
*/
data = remote_get_data();
fprintf(fp, “%ld\en”, data);
FINALLY
/* 例外が発生してもしなくても、ファイルをクローズします */
fclose(fp);
ENDTRY
}
UNIX システムのリファレンス マニュアルの abort(2)
『TxRPC を使用した Oracle Tuxedo アプリケーションのプログラミング』
#include <atmi.h>
char *tuxgetenv(char *name)
tuxgetenv() は、環境リストから name=value という形式の文字列を探し、その文字列が見つかった場合に、現在の環境内の value を指すポインタを返します。文字列が見つからなかった場合は、NULL ポインタを返します。
この関数は、Oracle Tuxedo ATMI がサポートされる、異なるプラットフォーム間で使用する環境変数に対して、移植可能なインタフェースを提供します。プラットフォームには、通常は環境変数を持たないプラットフォームも含まれます。
tuxgetenv は大文字と小文字を区別することに注意してください。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tuxgetenv() の呼び出しを発行できます。
文字列のポインタが存在する場合、tuxgetenv() はそのポインタを返します。ポインタが存在しない場合、tuxgetenv() は NULL ポインタを返します。
MS Windows では、この関数によって、アプリケーションとダイナミック リンク ライブラリとの間で環境変数を共有できるようになります。Oracle Tuxedo ATMI/WS DLL は、付加された各アプリケーションの環境コピーを保持します。この関連付けられた環境およびコンテキスト情報は、tpterm() が Windows アプリケーションから呼び出されると無効になります。環境変数の値は、アプリケーション プログラムが tpterm() を呼び出した後で変更できます。
Windows 環境では、大文字の変数名を使用することをお勧めします(tuxreadenv() はすべての環境変数名を大文字に変換します)。
tuxgetmbaconv() - プロセス環境で環境変数 TPMBACONV の値を取得
#include <atmi.h>
extern int tperrno;
int
tuxgetmbaconv(long flags) /* Get TPMBACONV info */
この関数は、TPMBACONV の状態を取得するために使用します。tuxgetnombaconv() 関数は、アプリケーション開発者が、型付きバッファ スイッチの自動変換機能がオフになっているかどうかをチェックするために使用します。デフォルトでは、TPMBACONV は設定されず、自動変換機能が使用されます。
引数 flags は現在使用されていないため、0 に設定します。
tuxgetnombaconv() は、TPMBACONV が設定されている場合は MBAUTOCONVERSION_ON を、設定されていない場合は MBAUTOCONVERSION_OFF を返します。
tuxgetenv(3c)、tuxsetmbaconv(3c)
tuxgetmbenc() - プロセス環境で環境変数 TPMBENC のコード セットのエンコード名を取得
#include <atmi.h>
extern int tperrno;
int
tuxgetmbenc(char *enc_name, long flags)
この関数は、環境変数 TPMBENC に保持されているコードセットのエンコード名を取得するために使用します。この環境変数は、MBSTRING 型付きバッファを作成する際に、デフォルトのコードセットのエンコード名として使用されます。新しいメッセージの取り出しが可能になると、tpsetmbenc() 関数を使用してデフォルトのエンコード名をリセットしたり設定解除したりできます。
引数 enc_name には、この関数の正常終了時に、環境変数 TPMBENC の値が入ります。このポインタには、エンコード名のコピー先として十分な大きさを確保しておく必要があります。
引数 flags は現在使用されていないため、0 に設定します。
正常終了の場合、tuxgetmbenc() は 0 を返します。エラーが発生した場合は 0 以外の値を返します。
tpconvmb(3c)、tpgetmbenc(3c)、tpsetmbenc(3c)、tuxgetenv(3c)、tuxsetmbenc(3c)
tuxputenv() - 環境の値を変更、または値を環境に追加する
#include <atmi.h>
int tuxputenv(char *string)
string は、"name=value." という形式の文字列を指すようにします。tuxputenv() は、環境変数の名前を、既存の変数を変更するか、新しい変数を作成することで値と等しくします。どちらの場合も、string によって指された文字列は環境変数の一部になります。
この関数は、Oracle Tuxedo ATMI がサポートされる、異なるプラットフォーム間で使用する環境変数に対して、移植可能なインタフェースを提供します。プラットフォームには、通常は環境変数を持たないプラットフォームも含まれます。
tuxputenv() は大文字と小文字を区別することに注意してください。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても tuxputenv() の呼び出しを発行できます。
tuxputenv() は、malloc() を介して拡張環境のための十分な領域を取得できなかった場合にゼロでない整数を返します。領域を取得できた場合はゼロを返します。
MS Windows では、この関数によって、アプリケーションとダイナミック リンク ライブラリとの間で環境変数を共有できるようになります。Oracle Tuxedo ATMI/WS DLL は、付加された各アプリケーションの環境コピーを保持します。この関連付けられた環境およびコンテキスト情報は、tpterm() が Windows アプリケーションから呼び出されると無効になります。環境変数の値は、アプリケーション プログラムが tpterm() を呼び出した後で変更できます。
DOS、Windows、および OS/2 環境では、大文字の変数名を使用することをお勧めします(tuxreadenv() はすべての環境変数名を大文字に変換します)。
tuxreadenv() - ファイルから環境へ変数を追加する
#include <atmi.h>
int tuxreadenv(char *file, char *label)
tuxreadenv() は環境変数を含むファイルを読み込み、プラットフォームから独立して環境変数を環境に追加します。変数は tuxgetenv() を使用して利用でき、tuxputenv() を使用して再設定できます。
variable=value
setvariable=value
ここで、variable は、先頭がアルファベット文字またはアンダースコア文字で、全体が英数字またはアンダースコア文字のみからなる文字列です。また、value には改行文字を除くすべての文字を使用できます。
value 内で、${env} という形式の文字列は、環境内にすでにある変数を使用して展開されます。前方参照はサポートされておらず、値が設定されていない場合、変数は空の文字列に置き換えられます。円記号 (\) を使用して、ドル記号およびそれ自体をエスケープすることができます。その他すべてのシェルのクォートおよびエスケープのメカニズムは無視され、展開された value がそのまま環境に入れられます。[label]
label は、上記の variable と同じ規則 (無効な label 値を持つ行は無視される) に従います。
file が NULL の場合、デフォルトのファイル名が使用されます。固定のファイル名は次のとおりです。
DOS、Windows、OS2、NT: C:\TUXEDO\TUXEDO.ENV または
MAC: システム環境設定ディレクトリの TUXEDO.ENV
NETWARE: SYS:SYSTEM\TUXEDO.ENV
POSIX: /usr/tuxedo/TUXEDO.ENV/var/opt/tuxedo/TUXEDO.ENV
label が NULL の場合、グローバル セクション内の変数だけが環境に挿入されます。label が他の値の場合、グローバル セクションの変数と、label に一致するセクション内の変数が環境に入れられます。
エラー メッセージは、メモリ障害が発生した場合、NULL でないファイル名が存在しない場合、または NULL でないラベルがない場合は、userlog() に出力されます。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、tuxreadenv() の呼び出しを発行できます。
TUXDIR=/usr/tuxedo
[application1]
;これはコメントです
/* これはコメントです */
#これはコメントです
//これはコメントです
FIELDTBLS=app1_flds
FLDTBLDIR=/usr/app1/udataobj
[application2]
FIELDTBLS=app2_flds
FLDTBLDIR=/usr/app2/udataobj
tuxreadenv() は、malloc() を介して拡張環境のための十分な領域を取得できなかった場合か、NULL でない名前を持つファイルをオープンできず読み取ることができない場合に、ゼロ以外の整数を返します。それ以外の場合、tuxreadenv() はゼロを返します。
DOS、Windows、OS/2、および NetWare 環境では、tuxreadenv() がすべての環境変数名を大文字に変換します。
tuxsetmbaconv() - プロセス環境で環境変数 TPMBACONV の値を設定
#include <atmi.h>
extern int tperrno;
int
tuxsetmbaconv(int onoff, long flags) /* Set TPMBACONV */
この関数は、環境変数 TPMBACONV の設定またはリセットに使用します。デフォルトでは、TPMBACONV は設定されず、自動変換機能が使用されます。
引数 onoff が MBAUTOCONVERSION_OFF の場合、TPMBACONV が設定解除され、自動変換が無効になります。MBAUTOCONVERSION_ON の場合、TPMBACONV が設定され、型付きバッファでのコードセットのマルチバイト データの自動変換が有効になります。
引数 flags は現在使用されていないため、0 に設定します。
正常終了の場合、tuxsetnombaconv() は 0 を返します。エラーが発生した場合は 0 以外の値を返します (引数 onoff が定義済みの値のいずれかでない場合、-1 を返します)。
tuxgetmbaconv(3c)、tuxputenv(3c)
tuxsetmbenc() - プロセス環境で環境変数 TPMBENC のコード セットのエンコード名を設定
#include <atmi.h>
extern int tperrno;
int
tuxsetmbenc(char *enc_name, long flags)
この関数は、環境変数 TPMBENC に保持されているコードセットのエンコード名を設定またはリセットするために使用します。この環境変数は、MBSTRING 型付きバッファを作成する際に、デフォルトのコードセットのエンコード名として使用されます。新しいメッセージの取り出しが可能になると、tpsetmbenc() 関数を使用してデフォルトのエンコード名をリセットしたり設定解除したりできます。
引数 enc_name は、コードセットの識別に使用するエンコード名です。
引数 flags は現在使用されていないため、0 に設定します。
正常終了の場合、tuxsetmbenc() は 0 を返します。エラーが発生した場合は 0 以外の値を返します。
tpconvmb(3c)、tpgetmbenc(3c)、tpsetmbenc(3c)、tuxgetmbenc(3c)、tuxputenv(3c)
tx_begin() - グローバル トランザクションの開始
#include <tx.h>
int tx_begin(void)
tx_begin() は、呼び出し側の制御スレッドをトランザクション モードにする際に使用します。呼び出し側のスレッドは、トランザクションを開始する前に、リンクされているリソース マネージャがオープンしている (tx_open() を介して) ことを、まず第 1 に確実にしなければなりません。呼び出し側がすでにトランザクション モードにある場合、または tx_open() が呼び出されていない場合には、tx_begin() は ([TX_PROTOCOL_ERROR] を返して) 異常終了します。
トランザクション モードに入ると、呼び出し側のスレッドは、現在のトランザクションを完了させるために、tx_commit() または tx_rollback() を呼び出さなければなりません。トランザクションの連鎖に関連する条件によっては、トランザクションの開始に明示的に tx_begin() を呼び出す必要がないこともあります。詳細については、tx_commit() および tx_rollback() を参照してください。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tx_begin() の呼び出しを発行できません。
tx_begin() は、正常終了時には、負数ではない戻り値 TX_OK を返します。
次の条件の場合、tx_begin() は異常終了し、次のいずれかの負の値を返します。
TX_OUTSIDE]
TX_PROTOCOL_ERROR]
TX_ERROR]
TX_FAIL]
tx_commit(3c)、tx_open(3c)、tx_rollback(3c)、tx_set_transaction_timeout(3c)
XA 準拠のリソース マネージャがグローバル トランザクションに含まれるようにするには、そのリソース マネージャが正常にオープンされている必要があります (詳細については、「tx_open(3c)」を参照してください)。X/Open TX インタフェースと X-Window システムは、いずれも型 XID を定義します。同一のファイルで X-Window コールと TX コールの両方を使用することはできません。
tx_close() - リソース マネージャ セットをクローズする
#include <tx.h>
int tx_close(void)
tx_close() は、移植性の高い方法でリソース マネージャ セットをクローズします。これにより、トランザクション マネージャが呼び出されて、リソース マネージャ固有の情報がトランザクション マネージャ固有の方法で読み取られ、この情報が呼び出し側にリンクされているリソース マネージャに渡されます。
tx_close() は、呼び出し側がリンクしているリソース マネージャをすべてクローズします。この関数は、リソース マネージャ固有の「クローズ」呼び出しの代わりに使用されるので、アプリケーション プログラムは、移植性を損なう危険性のある呼び出しを使用することがなくなります。リソース マネージャは終了の内容がそれぞれで異なるため、個々のリソース マネージャを「クローズ」するために必要な情報をリソース マネージャごとに通知しなければなりません。
tx_close() は、アプリケーションの制御スレッドがグローバル トランザクションに関与する必要がなくなったときに呼び出してください。呼び出し側がトランザクション モードにあると、tx_close() は ([TX_PROTOCOL_ERROR] を返して) 異常終了します。したがって、現在のトランザクションに関与しない制御スレッドがあっても、リソース マネージャは一切クローズされません。
tx_close() が正常に終了すると (TX_OK)、呼び出し側のスレッドにリンクしているリソース マネージャはすべてクローズされます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tx_close() の呼び出しを発行できません。
tx_close() は、正常終了時には、負数でない戻り値 TX_OK を返します。
次の条件の場合、tx_close() は異常終了し、次のいずれかの負の値を返します。
TX_PROTOCOL_ERROR]
TX_ERROR]
TX_FAIL]
X/Open TX インタフェースと X-Window システムは、いずれも型 XID を定義します。同一のファイルで X-Window コールと TX コールの両方を使用することはできません。
tx_commit() - グローバル トランザクションのコミット
#include <tx.h>
int tx_commit(void)
tx_commit() は、呼び出し側の制御スレッドでアクティブなトランザクションの作業をコミットするために使用します。
transaction_control 特性 (「tx_set_transaction_control(3c)」を参照) が TX_UNCHAINED である場合は、tx_commit() が終了すると、呼び出し側はトランザクション モードではなくなります。一方、transaction_control 特性が TX_CHAINED である場合は、tx_commit() が終了すると、呼び出し側は、新しいトランザクションのためにトランザクション モードのままになります (このページの「戻り値」および「エラー」の項を参照してください)。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tx_commit() の呼び出しを発行できません。
tx_commit() は、正常終了時には、負数でない戻り値 TX_OK を返します。
次の条件の場合、tx_commit() は異常終了し、次のいずれかの負の値を返します。
TX_NO_BEGIN]
transaction_control 特性が TX_CHAINED である場合のみ発生します。
TX_ROLLBACK]
TX_ROLLBACK_NO_BEGIN]
transaction_control 特性が TX_CHAINED である場合のみ発生します。
TX_MIXED]
transaction_control 特性が TX_CHAINED の場合は、新しいトランザクションが開始されます。
TX_MIXED_NO_BEGIN]
transaction_control 特性が TX_CHAINED である場合のみ発生します。
TX_HAZARD]
transaction_control 特性が TX_CHAINED の場合は、新しいトランザクションが開始されます。
TX_HAZARD_NO_BEGIN]
transaction_control 特性が TX_CHAINED である場合のみ発生します。
TX_PROTOCOL_ERROR]
TX_FAIL]
tx_begin(3c)、tx_set_commit_return(3c)、tx_set_transaction_control(3c)、tx_set_transaction_timeout(3c)
X/Open TX インタフェースと X-Window システムは、いずれも型 XID を定義します。同一のファイルで X-Window コールと TX コールの両方を使用することはできません。
tx_info() - グローバル トランザクション情報を返す
#include <tx.h>
int tx_info(TXINFO *info)
tx_info() は、グローバル トランザクション情報を、info が指す構造体に返します。また、この関数は、呼び出し側が現在トランザクション モードにあるかどうかを示す値も返します。info が NULL 以外の値であれば、tx_info() は、info が指す TXINFO 構造体にグローバル トランザクション情報を入れます。TXINFO 構造体には次の要素があります。
XID xid;
COMMIT_RETURN when_return;
TRANSACTION_CONTROL transaction_control;
TRANSACTION_TIMEOUT transaction_timeout;
TRANSACTION_STATE transaction_state;
tx_info() がトランザクション モードにおいて呼び出されると、xid に現在のトランザクションのブランチ識別子が、transaction_state に現在のトランザクションの状態が入ります。呼び出し側がトランザクション モードにない場合は、xid に NULL の XID が入ります (詳細は tx.h ファイルを参照)。また、呼び出し側がトランザクション モードにあるかどうかに関係なく、when_return、transaction_control および transaction_timeout に、commit_return および transaction_control 特性の現在の設定、および秒単位のトランザクション タイムアウト値が入ります。
返されるトランザクション タイムアウト値は、次のトランザクション開始時に使用される設定を反映しています。したがって、この値は、呼び出し側の現在のグローバル トランザクションのタイムアウト値を反映しているわけではありません。現在のトランザクション開始後に行われた tx_set_transaction_timeout() の呼び出しによって、この値が変更されていることがあるからです。
info が NULL である場合は、TXINFO 構造体は返されません。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tx_info() の呼び出しを発行できません。
呼び出し側がトランザクション モードにある場合は、1 を返します。呼び出し側がトランザクション モードにない場合は、0 を返します。
次の条件の場合、tx_info() は異常終了し、次のいずれかの負の値を返します。
TX_PROTOCOL_ERROR]
TX_FAIL]
tx_open(3c)、tx_set_commit_return(3c)、tx_set_transaction_control(3c)、tx_set_transaction_timeout(3c)
同一のグローバル トランザクション内では、後続の tx_info() 呼び出しは、XID に同一の gtrid 構成要素を示すことが保証されていますが、同一の bqual 構成要素を示すことは必ずしも保証されません。X/Open TX インタフェースと X-Window システムは、いずれも型 XID を定義します。同一のファイルで X-Window コールと TX コールの両方を使用することはできません。
#include <tx.h>
int tx_open(void)
tx_open() は、移植性の高い方法でリソース マネージャ セットをオープンします。これにより、トランザクション マネージャが呼び出されて、リソース マネージャ固有の情報がトランザクション マネージャ固有の方法で読み取られ、この情報が呼び出し側にリンクされているリソース マネージャに渡されます。
tx_open() はアプリケーションにリンクされているすべてのリソース マネージャのオープンを試行します。この関数は、リソース マネージャ固有の「オープン」呼び出しの代わりに使用されるので、アプリケーション プログラムは、移植性を損なう可能性のある呼び出しを使用することがなくなります。リソース マネージャは開始の内容がそれぞれで異なるため、個々のリソース マネージャを「オープン」するために必要な情報をリソース マネージャごとに通知しなければなりません。
tx_open() が TX_ERROR を返した場合は、リソース マネージャは一切オープンされません。tx_open() が TX_OK を返した場合は、いくつかまたはすべてのリソース マネージャがオープンされています。オープンされなかったリソース マネージャは、アプリケーションによってアクセスされるときに、リソース マネージャ固有のエラーを返します。tx_open() は、制御スレッドがグローバル トランザクションに関与する前に、正常に終了していなければなりません。
tx_open() が正常に終了した後で (tx_close() を呼び出す前に)、tx_open() を呼び出すことができます。このような後続の呼び出しは、正常終了しますが、トランザクション マネージャは、リソース マネージャの再オープンは一切行いません。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは、tx_open() の呼び出しを発行できません。
tx_open() は、正常終了時には、負数でない戻り値 TX_OK を返します。
次の条件の場合、tx_open() は異常終了し、次のいずれかの負の値を返します。
TX_ERROR]
TX_FAIL]
tpinit() を呼び出さずにセキュリティの掛かったアプリケーション (SECURITY APP_PW) の中で tx_open を呼び出すと、TX_FAIL が出されます。このエラーでは、トランザクション マネージャまたは 1 つ以上のリソース マネージャ、あるいはその両方は、アプリケーションのために作業を行うことができなくなります。エラーの正確な内容がログ ファイルに書き込まれます。
X/Open TX インタフェースと X-Window システムは、いずれも型 XID を定義します。同一のファイルで X-Window コールと TX コールの両方を使用することはできません。
tx_rollback() - グローバル トランザクションのロールバック
#include <tx.h>
int tx_rollback(void)
tx_rollback() は、呼び出し側の制御スレッドでアクティブなトランザクションをロールバックするのに使用します。
transaction_control 特性 (「tx_set_transaction_control(3c)」を参照) が TX_UNCHAINED である場合は、tx_rollback() が終了すると、呼び出し側はトランザクション モードではなくなります。一方、transaction_control 特性が TX_CHAINED である場合は、tx_rollback() が終了すると、呼び出し側は新しいトランザクションのためにトランザクション モードのままになります (このページの「戻り値」および「エラー」の項を参照してください)。
マルチスレッド アプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tx_rollback() の呼び出しを発行できません。
tx_rollback() は、正常終了時には、負数ではない戻り値 TX_OK を返します。
次の条件の場合、tx_rollback() は異常終了し、次のいずれかの負の値を返します。
TX_NO_BEGIN]
transaction_control 特性が TX_CHAINED である場合のみ発生します。
TX_MIXED]
transaction_control 特性が TX_CHAINED の場合は、新しいトランザクションが開始されます。
TX_MIXED_NO_BEGIN]
transaction_control 特性が TX_CHAINED である場合のみ発生します。
TX_HAZARD]
transaction_control 特性が TX_CHAINED の場合は、新しいトランザクションが開始されます。
TX_HAZARD_NO_BEGIN]
transaction_control 特性が TX_CHAINED である場合のみ発生します。
TX_COMMITTED]
transaction_control 特性が TX_CHAINED の場合は、新しいトランザクションが開始されます。
TX_COMMITTED_NO_BEGIN]
transaction_control 特性が TX_CHAINED である場合のみ発生します。
TX_PROTOCOL_ERROR]
TX_FAIL]
tx_begin(3c)、tx_set_transaction_control(3c)、tx_set_transaction_timeout(3c)
X/Open TX インタフェースと X-Window システムは、いずれも型 XID を定義します。同一のファイルで X-Window コールと TX コールの両方を使用することはできません。
tx_set_commit_return() - commit_return 特性の設定
#include <tx.h>
int tx_set_commit_return(COMMIT_RETURN when_return)
tx_set_commit_return() は、when_return で指定されている値に commit_return 特性を設定します。この特性は、呼び出し側に制御を返すことに関する tx_commit() の動作に影響します。tx_set_commit_return() は、その呼び出し側がトランザクション モードかどうかにかかわらず呼び出されます。この設定は、引き続き呼び出される tx_set_commit_return() で変更されるまで有効です。
この特性の初期設定は、TX_COMMIT_COMPLETED です。
TX_COMMIT_DECISION_LOGGED
tx_commit() が返らなければならないことを示しています。この設定をすることにより、tx_commit() を呼び出した側へ高速に応答することができます。しかし、トランザクションにヒューリスティックな結果が発生する危険があります。この場合、呼び出し側が、tx_commit() の戻り値からこの状況を知ることはできません。正常な状態では、第 1 フェーズの間にコミットすることを約束している参加リソースは、第 2 フェーズでコミットします。しかし、ある異常な環境 (たとえば、応答のないネットワークまたはノード障害) においては、2 番目のフェーズが終了しない可能性があり、ヒューリスティックな結果が発生する場合があります。
TX_COMMIT_COMPLETED
tx_commit() が返ることを示しています。この設定により、tx_commit() の呼び出し側は、トランザクションにヒューリスティックな結果が発生したか、または発生した可能性があるかを示す戻り値を調べることができます。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tx_set_commit_return() の呼び出しを発行できません。
正常終了の場合、tx_set_commit_return() は、負でない戻り値 TX_OK を返します。
次の条件の場合、commit_return は、commit_return 特性の設定を変更することなく、次の 3 つの負の値のうちの 1 つを返します。
TX_EINVAL]
TX_PROTOCOL_ERROR]
TX_FAIL]
tx_commit(3c)、tx_info(3c)、tx_open(3c)
X/Open TX インタフェースと X-Window システムは、いずれも型 XID を定義します。同一のファイルで X-Window コールと TX コールの両方を使用することはできません。
tx_set_transaction_control() - transaction_control 特性を設定する
#include <tx.h>
int tx_set_transaction_control(TRANSACTION_CONTROL control)
tx_set_transaction_control() は、control で指定されている値に transaction_control 特性を設定します。この特性は、tx_commit() および tx_rollback() のどちらかが、これらの呼び出し側に返る前に、新しいトランザクションを開始するかどうかを決めます。tx_set_transaction_control() は、アプリケーション プログラムがトランザクション モードかどうかにかかわらず呼び出すことができます。この設定は、引き続き後に呼び出される tx_set_transaction_control() で変更されるまで有効です。
TX_UNCHAINED
tx_commit() および tx_rollback() が、これらの呼び出し側に返る前に新しいトランザクションを開始してはならないことを示しています。呼び出し側は新しいトランザクションを開始するために tx_begin() を出さなければなりません。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tx_set_transaction_control() の呼び出しを発行できません。
正常終了の場合、tx_set_transaction_control() は、負でない戻り値 TX_OK を返します。
次の条件の場合、tx_set_transaction_control() は、transaction_control 特性の設定を変更することなく、次に示す 3 つの負の値のうちの 1 つを返します。
TX_EINVAL]
TX_PROTOCOL_ERROR]
TX_FAIL]
tx_begin(3c)、tx_commit(3c)、tx_info(3c)、tx_open(3c)、tx_rollback(3c)
X/Open TX インタフェースと X-Window システムは、いずれも型 XID を定義します。同一のファイルで X-Window コールと TX コールの両方を使用することはできません。
tx_set_transaction_timeout() - transaction_timeout 特性を設定する
#include <tx.h>
int tx_set_transaction_timeout(TRANSACTION_TIMEOUT timeout)
tx_set_transaction_timeout() は、timeout で指定されている値に transaction_timeout 特性を設定します。この値は、トランザクションが、トランザクション タイムアウトになる前に終了しなければならない時間間隔、すなわちアプリケーションが、tx_begin() を呼び出してから tx_commit() または tx_rollback() を呼び出すまでの時間間隔を指定します。tx_set_transaction_timeout() は、呼び出し側がトランザクション モードかどうかにかかわらず呼び出すことができます。tx_set_transaction_timeout() が、トランザクション モードで呼び出される場合、新しいタイムアウト値は、次のトランザクションが開始されないと有効になりません。
transaction_timeout の初期値は 0 (タイムアウトなし) です。
timeout は、トランザクションが、トランザクション タイムアウトを受けないでいられる秒数を指定します。この値は、最大値、すなわちシステムによって定義されている long までの任意の値に設定されます。timeout 値が 0 の場合、タイムアウト機能は働きません。
マルチスレッドのアプリケーションの場合、TPINVALIDCONTEXT 状態のスレッドは tx_set_transaction_timeout() の呼び出しを発行できません。
正常終了の場合、tx_set_transaction_timeout() は、負でない戻り値 TX_OK を返します。
次の条件の場合、tx_set_transaction_timeout() は、transaction_timeout 特性の設定を変更することなく、次に示す 3 つの負の値のうちの 1 つを返します。
TX_EINVAL]
TX_PROTOCOL_ERROR]
TX_FAIL]
tx_begin(3c)、tx_commit(3c)、tx_info(3c)、tx_open(3c)、tx_rollback(3c)
X/Open TX インタフェースと X-Window システムは、いずれも型 XID を定義します。同一のファイルで X-Window コールと TX コールの両方を使用することはできません。
userlog() - Oracle Tuxedo ATMI システムの中央イベント ログへのメッセージの書き込み
#include “userlog.h”
extern char *proc_name;
int userlog (format [ ,arg] . . .)
char *format;
userlog() は、printf(3S) スタイルのフォーマット指定を受け付け、固定出力ファイル (Oracle Tuxedo ATMI システムの中央イベント ログ) を使用します。
中央のイベント ログは通常の UNIX システム ファイルで、そのパス名は次のように構成されています。シェル変数 ULOGPFX が設定されている場合、その値がファイル名の接頭辞として使用されます。ULOGPFX が設定されていない場合は、ULOG が使用されます。この接頭辞は最初に userlog() が呼び出されたときに判別されます。userlog() が呼び出されるたびに、日付が判別され、月、日、年が mmddyy の形式で接頭辞に連結されてファイルの名前が設定されます。プロセスが初めてユーザ ログに書き込む場合、対応する Oracle Tuxedo ATMI システムのバージョンを示す追加のメッセージを書き込みます。
このあと、メッセージがそのファイルに追加されます。この方法の場合、それ以降の日に userlog() をプロセスが呼び出すと、メッセージは別のファイルに書き込まれます。
メッセージは、呼び出しプロセスの時刻 (hhmmss)、システム名、プロセス名、呼び出しプロセスのプロセス ID、スレッド ID、コンテキスト ID からなるタグと一緒にログ ファイルに書き込まれます。このタグの末尾にはコロン (:) が付けられます。プロセスの名前は、外部変数 proc_name のパス名から取られます。proc_name の値が NULL であると、得られる名前は ?proc に設定されます。
Oracle Tuxedo ATMI システムがログ ファイルに出すエラー メッセージの先頭には、ユニークな識別用文字列が次の形式で付けられます。
<catalog>:number>:
この文字列は、メッセージ文字列を収めている国際版カタログの名前にメッセージ番号を加えたものです。規則によれば、Oracle Tuxedo ATMI システムのエラー メッセージは一個所でのみ使用されるようになっているため、この文字列はソース コード内の位置をユニークに特定します。
format 指定の最後の文字が改行文字でない場合、userlog() は改行文字を 1 つ追加します。
シェル変数 ULOGDEBUG の先頭文字が 1 または y であると、userlog() に送られるメッセージは fprintf(3S) 関数により呼び出しプロセスの標準エラー出力にも書き出されます。
userlog() は、Oracle Tuxedo ATMI システムが各種のイベントを記録するために使用します。
この userlog の機構は、Oracle Tuxedo ATMI システムのトランザクション記録機構とは完全に独立しています。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても userlog() の呼び出しを発行できます。
ULOGMILLISEC
ULOGMILLISEC がオンの場合、サーバは再起動します。ULOGMILLISEC=Y
ULOGRTNSIZE
ULOGRTNSIZE がオンの場合、サーバは再起動します。ULOGRTNSIZE=1000000 (ファイル サイズが 1MB の場合)
ULOG.083103.1、ULOG.083103.2 ... ULOG.083103.10 など
| 注意 : | ULOGRTNSIZE を指定しなかった場合、ファイルのローテーションは行われません。 |
userlog() インタフェースは、UNIX システムおよび MS-DOS オペレーティング システムで利用できます。ログ メッセージの一部として生成されるシステム名は、MS-DOS システムでは利用できません。このため、MS-DOS システムのシステム名としては、値 PC を使用します。
変数 ULOGPFX が /application/logs/log に設定されている場合、および userlog() の最初の呼び出しが 1990 年 9 月 7 日に行われた場合、作成されるログ ファイルには /application/logs/log.090790 という名前が付けられます。たとえば、
userlog(“UNKNOWN USER '%s' (UID=%d)”, usrname, UID);
上記のような呼び出しが、プロセス ID が 23431 であるプログラム sec により UNIX システムが指定した m1 上で 4:22:14pm に出され、変数 usrname に文字列 "sxx" が含まれ、かつ変数 UID に整数 123 が指定されている場合、ログ ファイルには次のような行が書き込まれます。
162214.m1!sec.23431: UNKNOWN USER 'sxx' (UID=123)
プロセスがトランザクション モードのときにメッセージが中央イベント ログに送られた場合、ユーザ ログ エントリのタグに追加の要素が加わります。これらの要素は、リテラル gtrid と、それに続く 3 桁の long 型の 16 進整数で構成されます。これらの整数はグローバル トランザクションをユニークに識別し、グローバル トランザクション識別子と呼ばれます。この識別子は主に管理上の目的で使用されますが、中央イベント ログでメッセージの先頭に付けられるタグの中に付けられます。前述のメッセージがトランザクション モードで中央イベント ログに書き出される場合、結果として得られるログ エントリは次のようになります。
162214.logsys!security.23431: gtrid x2 x24e1b803 x239: UNKNOWN USER 'sxx' (UID=123)
シェル変数 ULOGDEBUG の値が y であると、ログ メッセージはプログラム security の標準エラー出力にも書き出されます。
userlog() は、送信されるメッセージが stdio.h で定義されている BUFSIZ より大きい場合にハングします。
userlog() は、出力された文字数を返します。出力エラーがあった場合には、負の値を返します。出力エラーには、現在のログ ファイルのオープンや書き込みができないといったエラーがあります。ULOGDEBUG が設定されている場合、標準エラー出力への書き込みができない場合は、エラーとは見なされません。
アプリケーションで userlog() メッセージを使用する場合には、アプリケーション エラーをデバッグするのに有用なものだけを使用するようにします。ログが情報であふれてしまうと、本来のエラーを検出するのが難しくなります。
printf(3S)
Usignal() - Oracle Tuxedo ATMI システム環境でのシグナル処理
#include “Usignal.h”
UDEFERSIGS()
UENSURESIGS()
UGDEFERLEVEL()
URESUMESIGS()
USDEFERLEVEL(level)
int (*Usignal(sig,func)()
int sig;
int (*func)();
void Usiginit()
Oracle Tuxedo ATMI システム ソフトウェアが提供する多くの機能は、共有メモリ内のデータ構造に並行アクセスする必要があります。共有データ構造にアクセスするプログラムはユーザ モードで走るため、シグナルを使用して中断することができます。共有データ構造の一貫性を維持するためには、それらの構造にアクセスする類の操作が、UNIX システムのシグナルを受け取っても中断されないことが重要です。ここで説明する関数は、ほとんどの一般的なシグナルに対する保護機構を提供するもので、Oracle Tuxedo ATMI システムのコードの多くがその内部で使用します。また、これらの関数は、アプリケーション側で使用して、不用意にシグナルを受け取らないようにします。
この Oracle Tuxedo ATMI システムのシグナル処理パッケージは、重要なコード部ではシグナルの発行を遅らせる、という発想から生まれたものです。このため、シグナルは、それが受信されてもすぐには処理されません。Oracle Tuxedo ATMI システムのルーチンはまず最初に送信されたシグナルを捕捉します。そのシグナルを処理しても安全であれば、そのシグナルに指定された処理が実行されます。シグナルが安全でないということが判明した場合には、そのシグナルの到着が通知されるだけで、重要なコード部が終了したことをユーザが示すまでは、そのシグナルの処理は行われません。
マルチスレッド プログラムでシグナルを使用することは可能ですが、使用しないことをお勧めします。ただし、シグナルを使用した場合には、マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても Usignal() の呼び出しを発行できます。
rmopen() または tpinit() を使用するユーザ コードは、Usignal() 関数を使用してシグナルを捕捉するようにします。Usignal() は UNIX の signal() システム コールのように機能しますが、例外として Usignal() では最初に、内部ルーチンがシグナルを捕捉してから、ユーザ ルーチンをディスパッチするように調整します。
ここで説明する呼び出しは、アプリケーション コードでシグナルを後回しにする必要がある場合にのみ使用します。一般に、これらのルーチンは、不適切な場面でシグナルが到着しないようにするために Oracle Tuxedo ATMI システムのルーチンが自動的に呼び出します。
シグナルを遅延またはリストアする前に、メカニズムを初期化する必要があります。初期化は、Oracle Tuxedo ATMI システム クライアントが tpinit() を呼び出したときに、Oracle Tuxedo ATMI システムのクライアントとサーバのために自動的に行われます。また、初期化は、アプリケーションがはじめに Usignal() 呼び出すときに行われます。初期化は、Usiginit() を呼び出すことで明示的に行うことができます。
UDEFERSIGS() マクロは、重要なコード部分に入るときに使用してください。UDEFERSIGS() が呼び出された後、シグナルは保留状態になります。また、URESUMESIGS() マクロは、その重要な部分が終わる時点で呼び出すようにします。シグナル遅延スタックに注意してください。このスタックは、最初にゼロに設定されるカウンタを通して実現されます。UDEFERSIGS() への呼び出しによってシグナルが遅延されると、カウンタの値が 1 大きくなります。URESUMESIGS() の呼び出しによりシグナルが再開されると、カウンタの値は 1 小さくなります。カウンタがゼロ以外の値のときにシグナルが到着すると、そのシグナルの処理は後回しになります。シグナルが到着したときにカウンタがゼロであれば、そのシグナルはただちに処理されます。シグナルの再開により、カウンタがゼロになると (すなわち、再開の前のカウンタ値が 1 のとき)、その据置期間に到着したシグナルが処理されます。一般に、UDEFERSIGS() の呼び出しは、URESUMESIGS() の呼び出しと対で使用するようにします。
UDEFERSIGS 遅延カウンタの値をインクリメントしますが、返す値はそのインクリメント前の値です。マクロ UENSURESIGS() は、遅延カウンタを明示的にゼロに設定する (そして、据え置かれたシグナルを強制的に処理させる) ときに使用できます。この場合、ユーザは UDEFERSIGS() と URESUMESIGS() の不一致が生じないようにする必要があります。
関数 UGDEFERLEVEL() は遅延カウンタの現在の設定値を返します。マクロ USDEFERLEVEL(level) を使用すると、特定の遅延レベルを設定することができます。UGDEFERLEVEL() と USDEFERLEVEL() は、setjmp/longjmp の状況で適切にカウンタを設定するときに便利です。この場合、遅延/再開の組み合わせは迂回されます。つまり、setjmp() が呼び出されたときに、UGDEFERLEVEl() の呼び出しによってカウンタの値を保存し、longjmp() が実行されたときに USDEFERLEVEL() の呼び出しによりカウンタ値をリストアする、という考え方です。
Usignal は、SIGHUP、SIGINT、SIGQUIT、SIGALRM、SIGTERM、SIGUSR1、および SIGUSR2 の各シグナルについて遅延処理を行います。その他すべてのシグナル番号に対する処理要求は、Usignal() により直接 signal() 関数に渡されます。シグナルは非常に長い期間その処理が据え置かれることがあります。このため、シグナル遅延の間、シグナルの到着がすべてカウントされます。何回も到着する可能性のあるシグナルの処理が安全な場合、そのシグナルの処理ルーチンが繰り返し呼び出され、シグナルが到着した各シグナルが処理されます。各呼び出しの前には、シグナルのデフォルトの処理がなされます。つまり、安全なコードで連続して処理が行われる場合と同様に、据え置かれたシグナルが処理されるようにする、という考え方です。
一般に、ユーザは signal() と Usignal() の呼び出しを同じシグナルに対して組み合わせて使用するべきではありません。できれば、Usignal() を使用する方法をとることが推奨されます。これによって、常にシグナルの状態を知ることができるからです。Usignal は、アプリケーションが Oracle Tuxedo ATMI システム サービスでアラームを使用したい場合などには必要です。こうすることにより、Usiginit() は、シグナルの遅延メカニズムを初期化するために呼び出されなければなりません。次に、signal() を呼び出し、意図するシグナル用に、メカニズムを変更します。シグナルの遅延メカニズムをリストアするために、Usignal() を SIG_IGN で呼び出してから、再び、意図するシグナル処理関数で呼び出す必要があります。
シェル変数 UIMMEDSIGS を使用すれば、シグナルの据置を変更することができます。この変数の値が次のように英字 y で始まる場合、
UIMMEDSIGS=y
シグナルは Usignal() コードでインタセプトされません (したがって、据え置かれません)。このような場合、Usignal() の呼び出しはただちに signal() に渡されます。
また、Usignal は DOS オペレーティング システムの配下では役に立ちません。
UNIX システムのリファレンス マニュアルの signal(2)
Uunix_err() - UNIX システム コール エラーの出力
#include Uunix.h
void Uunix_err(s)
char *s;
Oracle Tuxedo ATMI システムの関数が UNIX システム コールを呼び出したときに、そのシステム コールがエラーを検出すると、エラーが返されます。外部整数 Uunixerr() が、そのエラーを返したシステム コールを示す値 (Uunix.h に定義されています) に設定されます。さらに、このシステム コールは、errno() を失敗した理由を示す値 (errno.h に定義されています) に設定します。
Uunix_err() 関数は、Oracle Tuxedo ATMI システムの関数の呼び出し中に最後に検出したシステム コールを示すメッセージを標準エラー出力に書き出します。この関数は引数 (文字列) を 1 つとります。この関数はこの引数文字列に続いて、コロンと空白、失敗したシステム コールの名前、失敗の理由、そして改行文字を書き出します。さまざまな利用形態を考慮して、この引数文字列には、エラーを起こしたプログラム名を入れます。システム コールのエラー番号は外部変数 Uunixerr() からとられ、そのエラーの理由は errno() から取り込まれます。どちらの変数も、エラーが発生した時点で設定されます。これらの変数はエラーのない呼び出しが行われたときにクリアされます。
メッセージの多彩な形式を単純化するため、次のようなメッセージ文字列の配列
extern char *Uunixmsg[];
が提供されます。Uunixerr() は、このテーブルへのインデックスとして使用し、失敗したシステム コールの名前を (改行文字なしで) 取り込むことができます。
マルチスレッドのアプリケーション中のスレッドは、TPINVALIDCONTEXT を含め、どのコンテキスト状態で実行していても、Uunix_err() の呼び出しを発行できます。
#include Uunix.h
extern int Uunixerr, errno;
..........
if((fd=open(“myfile”, 3, 0660)) == -1)
{
Uunixerr = UOPEN;
Uunix_err(“myprog”);
exit(1);
}
|