Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 クライアント使用の手引 TP1/Client/W,TP1/Client/P編


5.4.2 マルチスレッド対応のユーザアプリケーションプログラムの作成

マルチスレッドで動作するUAPをCOBOL言語で作成する方法について,説明します。

〈この項の構成〉

(1) 翻訳

COBOL言語で作成したUAPのソースプログラムの翻訳について,説明します。このUAPのソースプログラムには,スレッド起動プログラム,CUPの主プログラムなどが必要です。

スレッド起動プログラムはC言語で記述し,Cコンパイラで翻訳してオブジェクトファイルを作成します。また,CUPの主プログラムはCOBOL言語で作成し,COBOLコンパイラで翻訳してオブジェクトファイルを作成します。

それぞれのプログラムを翻訳するときのコマンド入力例を次に示します。なお,COBOLコンパイラには,COBOL2002を使用した場合の例を示します。

〈例〉

C言語で作成したスレッド起動プログラム

  • thdcup_main.c

COBOL言語で作成したCUPの主プログラム

  • sample.cbl

この場合,それぞれのソースプログラムは次のように翻訳します。

cc -c -I/usr/include -ansi thdcup_main.c
ccbl2002 -MultiThread -Compile,NoLink sample.cbl

翻訳環境のロケールがUTF-8の場合,ccbl2002のオプションに-UniObjGenも追加してください。

上記のccコマンドおよびccbl2002コマンドを実行すると,次のオブジェクトファイルが作成されます。

  • thdcup_main.o(スレッド起動プログラムのオブジェクトファイル)

  • sample.o(CUPの主プログラムのオブジェクトファイル)

(2) 結合

COBOL言語で作成したUAPの実行形式ファイルの作成には,ccbl2002コマンドまたはccコマンドを使用する方法があります。それぞれの場合の結合方法について,説明します。

(a) ccbl2002コマンドを使用する場合

ccbl2002コマンドを使用してUAPの実行形式ファイルを作成する場合,次に示すファイルを結合させて作成します。

  • スレッド起動プログラムのオブジェクトファイル

  • CUPの主プログラムのオブジェクトファイル

  • TP1/Client/Wのライブラリ

  • COBOL2002のライブラリ

  • POSIXスレッドのライブラリ

ccbl2002コマンドを使用して,上記のファイルを結合するときのコマンドの入力例を次に示します。

〈例〉

COBOL CUP実行形式ファイル「example」を作成する場合

  • スレッド起動プログラムのオブジェクトファイル名…thdcup_main.o

  • CUPの主プログラムのオブジェクトファイル名…sample.o

次のようにファイルを結合させます。

ccbl2002 sample.o thdcup_main.o -L/usr/lib -lclt -lpthread -L/opt/HILNGcbl2k/lib -lcbl2kml -lcbl2kmp -OutputFile example

(b) ccコマンドを使用する場合

ccコマンドを使用してUAPの実行形式ファイルを作成する場合,次に示すファイルを結合させて作成します。

  • スレッド起動プログラムのオブジェクトファイル

  • CUPの主プログラムのオブジェクトファイル

  • TP1/Client/Wのライブラリ

  • COBOL2002のライブラリ

  • POSIXスレッドのライブラリ

ccコマンドを使用して,上記のファイルを結合するときのコマンドの入力例を次に示します。

〈例〉

COBOL CUP実行形式ファイル「example」を作成する場合

  • スレッド起動プログラムのオブジェクトファイル名…thdcup_main.o

  • CUPの主プログラムのオブジェクトファイル名…sample.o

次のようにファイルを結合させます。

cc -o example thdcup_main.o sample.o -L/usr/lib -lclt -lpthread -L/opt/HILNGcbl2k/lib -lcbl2k -lcbl2kml -lcbl2kmp

(3) スレッド起動プログラムおよびCUPの主プログラムのコーディング例

COBOL言語で作成したUAPのスレッド起動プログラム(C言語),およびCUPの主プログラム(COBOL言語)のコーディング例を示します。

(a) スレッド起動プログラム(C言語)のコーディング例

000010 #include <stdio.h>
000020 #include <pthread.h>
000030 #include <sys/errno.h>
000040
000050 #define THDMAX  5
000060
000070 extern void *CUP_THREAD();
000080
000090 main()
000100 {
000110     int        i;
000120     int        rc;
000130     int        *exit_value;
000140     pthread_t  threads[THDMAX];
000150
000160     /*--- スレッドを生成する ---*/
000170     for (i = 1; i < THDMAX; i++) {
000180         fflush(stdout);
000190         rc = pthread_create((pthread_t *)&threads[i],
000200                             NULL,
000210                             CUP_THREAD,
000220                             (void *)&i);
000230         if (rc < 0) {
000240             printf("cup0: pthread_create に失敗しました。CODE=%d\n", errno);
000250         }
000260     }
000270
000280     /*--- スレッドの終了を待ち合わせる ---*/
000290     for (i = 1; i < THDMAX; i++) {
000300         rc = pthread_join(threads[i], (void **)&exit_value);
000310         if (rc < 0) {
000320             printf("cup0: pthread_join に失敗しました。CODE=%d\n", errno);
000330         }
000340     }
000350
000360 }
000370

(b) CUPの主プログラム(COBOL言語)のコーディング例

000010    *
000020    **************************************************
000030    *  CUPサンプルプログラム                                *
000040    **************************************************
000050    *
000060     IDENTIFICATION DIVISION.
000070     PROGRAM-ID. CUP_THREAD.
000080    *
000090    **************************************************
000100    *  データ領域の設定                                     *
000110    **************************************************
000120    *
000130     DATA DIVISION.
000140     WORKING-STORAGE SECTION.
000150     01  DCCLS-CLTIN-ARG.
000160         02  DCCLS-CLTIN-REQUEST        PIC  X(8) VALUE 'CLTIN   '.
000170         02  DCCLS-CLTIN-STATUS-CODE    PIC  X(5).
000180         02  FILLER                     PIC  X(3).
000190         02  DCCLS-CLTIN-FLAGS          PIC S9(9) COMP VALUE ZERO.
000200         02  DCCLS-CLTIN-T-HOST         PIC  X(64).
000210         02  DCCLS-CLTIN-LOGNAME        PIC  X(16).
000220         02  DCCLS-CLTIN-PASSWD         PIC  X(16).
000230         02  DCCLS-CLTIN-S-HOST         PIC  X(64).
000240         02  DCCLS-CLTIN-HWND           PIC  9(4) COMP.
000250         02  FILLER                     PIC  X(2).
000260         02  DCCLS-CLTIN-CLTID          PIC  9(18) COMP.
000270         02  DCCLS-CLTIN-DEFPATH        PIC  X(256).
000280    *
000290     01  DCCLS-CLTOUT-ARG.
000300         02  DCCLS-CLTOUT-REQUEST       PIC  X(8) VALUE 'CLTOUT  '.
000310         02  DCCLS-CLTOUT-STATUS-CODE   PIC  X(5).
000320         02  FILLER                     PIC  X(3).
000330         02  DCCLS-CLTOUT-FLAGS         PIC S9(9) COMP VALUE ZERO.
000340         02  FILLER                     PIC  X(4).
000350         02  DCCLS-CLTOUT-CLTID         PIC  9(18) COMP.
000360    *
000370     01  DCRPS-OPEN-ARG1.
000380         02  DCRPS-OPEN-REQUEST         PIC  X(8) VALUE 'OPEN    '.
000390         02  DCRPS-OPEN-STATUS-CODE     PIC  X(5).
000400         02  FILLER                     PIC  X(3).
000410         02  DCRPS-OPEN-FLAGS           PIC S9(9) COMP VALUE ZERO.
000420         02  FILLER                     PIC  X(4).
000430         02  DCRPS-OPEN-CLTID           PIC  9(18) COMP.
000440    *
000450     01  DCRPS-OPEN-ARG2.
000460         02  FILLER                     PIC  X(1).
000470    *
000480     01  DCRPS-OPEN-ARG3.
000490         02  FILLER                     PIC  X(1).
000500    *
000510     01  DCRPS-CALL-ARG1.
000520         02  DCRPS-CALL-REQUEST         PIC  X(8) VALUE 'CALL    '.
000530         02  DCRPS-CALL-STATUS-CODE     PIC  X(5).
000540         02  FILLER                     PIC  X(3).
000550         02  DCRPS-CALL-FLAGS           PIC S9(9) COMP VALUE ZERO.
000560         02  DCRPS-CALL-DESCRIPTER      PIC S9(9) COMP.
000570         02  DCRPS-CALL-SVGROUP         PIC  X(32).
000580         02  DCRPS-CALL-SVNAME          PIC  X(32).
000590         02  DCRPS-CALL-CLTID           PIC  9(18) COMP.
000600    *
000610     01  DCRPS-CALL-ARG2.
000620         02  DCRPS-CALL-INDATALEN       PIC S9(9) COMP.
000630         02  DCRPS-CALL-INDATA          PIC  X(512).
000640    *
000650     01  DCRPS-CALL-ARG3.
000660         02  DCRPS-CALL-OUTDATALEN      PIC S9(9) COMP.
000670         02  DCRPS-CALL-OUTDATA         PIC  X(512).
000680    *
000690     01  DCRPS-CLOSE-ARG1.
000700         02  DCRPS-CLOSE-REQUEST        PIC  X(8) VALUE 'CLOSE   '.
000710         02  DCRPS-CLOSE-STATUS-CODE    PIC  X(5).
000720         02  FILLER                     PIC  X(3).
000730         02  DCRPS-CLOSE-FLAGS          PIC S9(9) COMP VALUE ZERO.
000740         02  FILLER                     PIC  X(4).
000750         02  DCRPS-CLOSE-CLTID          PIC  9(18) COMP.
000760    *
000770     01  DCRPS-CLOSE-ARG2.
000780         02  FILLER                     PIC  X(1).
000790    *
000800     01  DCRPS-CLOSE-ARG3.
000810         02  FILLER                     PIC  X(1).     
000820    *
000830    **************************************************
000840    *  CUPの開始                                     *
000850    **************************************************
000860     PROCEDURE DIVISION.
000870     MAIN SECTION.
000880     PROG-START.
000890    *
000900    **************************************************
000910    *  クライアントユーザの認証要求                  *
000920    **************************************************
000930         MOVE 'CLTIN   '     TO DCCLS-CLTIN-REQUEST IN DCCLS-CLTIN-ARG.
000940         MOVE ZERO           TO DCCLS-CLTIN-FLAGS   IN DCCLS-CLTIN-ARG.
000950         MOVE 'host01:10000' TO DCCLS-CLTIN-T-HOST  
000960                       IN DCCLS-CLTIN-ARG.
000970         MOVE 'user01'       TO DCCLS-CLTIN-LOGNAME IN DCCLS-CLTIN-ARG.
000980         MOVE 'puser01'      TO DCCLS-CLTIN-PASSWD  IN DCCLS-CLTIN-ARG.
000990         MOVE ZERO           TO DCCLS-CLTIN-HWND    IN DCCLS-CLTIN-ARG.
001000         MOVE SPACE          TO DCCLS-CLTIN-DEFPATH IN DCCLS-CLTIN-ARG.
001010    *
001020    *    *******************************
001030         CALL 'CBLDCCLS' USING DCCLS-CLTIN-ARG.
001040    *    *******************************
001050         IF DCCLS-CLTIN-STATUS-CODE IN DCCLS-CLTIN-ARG NOT = '00000'
001060         THEN
001070           DISPLAY 'CUP01: CBLDCCLS(CLTIN)に失敗しました。CODE='
001080                    DCCLS-CLTIN-STATUS-CODE IN DCCLS-CLTIN-ARG
001090           GO TO PROG-EXIT
001100         END-IF.
001110    *
001120    **************************************************
001130    *  RPC-OPEN(RPC環境の初期設定)                   *
001140    **************************************************
001150         MOVE 'OPEN    '         TO
001160              DCRPS-OPEN-REQUEST IN DCRPS-OPEN-ARG1.
001170         MOVE ZERO               TO DCRPS-OPEN-FLAGS
001180              IN DCRPS-OPEN-ARG1.
001190         MOVE DCCLS-CLTIN-CLTID  IN DCCLS-CLTIN-ARG TO
001200              DCRPS-OPEN-CLTID   IN DCRPS-OPEN-ARG1.
001210    *
001220    *    *******************************
001230         CALL 'CBLDCRPS' USING DCRPS-OPEN-ARG1 DCRPS-OPEN-ARG2
001240                                            DCRPS-OPEN-ARG3.
001250    *    *******************************
001260         IF DCRPS-OPEN-STATUS-CODE IN DCRPS-OPEN-ARG1 NOT = '00000'
001270         THEN
001280           DISPLAY 'CUP01: CBLDCRPS(OPEN)に失敗しました。CODE='
001290                    DCRPS-OPEN-STATUS-CODE IN DCRPS-OPEN-ARG1
001300           GO TO PROG-END
001310         END-IF.
001320    *
001330    *    *********************************************
001340    *    * RPC-CALL(RPCの実行)                       *
001350    *    *********************************************
001360         MOVE 'CALL    '      TO
001370              DCRPS-CALL-REQUEST IN DCRPS-CALL-ARG1.
001380         MOVE ZERO            TO
001390              DCRPS-CALL-FLAGS IN DCRPS-CALL-ARG1.
001400         MOVE 'spp01'       TO
001410              DCRPS-CALL-SVGROUP IN DCRPS-CALL-ARG1.
001420         MOVE 'svr01'     TO
001430              DCRPS-CALL-SVNAME     IN DCRPS-CALL-ARG1.
001440         MOVE DCCLS-CLTIN-CLTID  IN DCCLS-CLTIN-ARG TO
001450              DCRPS-CALL-CLTID   IN DCRPS-CALL-ARG1.
001460         MOVE 'HELLO SPP !! ' TO
001470              DCRPS-CALL-INDATA     IN DCRPS-CALL-ARG2.
001480         MOVE 512             TO
001490              DCRPS-CALL-INDATALEN  IN DCRPS-CALL-ARG2.
001500         MOVE SPACE           TO
001510              DCRPS-CALL-OUTDATA    IN DCRPS-CALL-ARG3.
001520         MOVE 512             TO
001530              DCRPS-CALL-OUTDATALEN IN DCRPS-CALL-ARG3.
001540    *
001550    *    **************************************************
001560         CALL 'CBLDCRPS' USING DCRPS-CALL-ARG1 DCRPS-CALL-ARG2
001570                               DCRPS-CALL-ARG3
001580    *    **************************************************
001590         IF DCRPS-CALL-STATUS-CODE IN DCRPS-CALL-ARG1 NOT = '00000'
001600         THEN
001610           DISPLAY 'CUP01: CBLDCRPS(CALL)に失敗しました。'
001620                   'CODE=' DCRPS-CALL-STATUS-CODE IN DCRPS-CALL-ARG1
001630           GO TO PROG-END
001640         END-IF.
001650     PROG-END.
001660    *
001670    **************************************************
001680    *  RPC-CLOSE(RPC環境の解除)                      *
001690    **************************************************
001700         MOVE 'CLOSE   ' TO DCRPS-CLOSE-REQUEST IN DCRPS-CLOSE-ARG1.
001710         MOVE ZERO       TO DCRPS-CLOSE-FLAGS   IN DCRPS-CLOSE-ARG1.
001720         MOVE DCCLS-CLTIN-CLTID  IN DCCLS-CLTIN-ARG TO
001730              DCRPS-CLOSE-CLTID  IN DCRPS-CLOSE-ARG1.
001740    *
001750    *    *******************************
001760         CALL 'CBLDCRPS' USING DCRPS-CLOSE-ARG1 DCRPS-CLOSE-ARG2
001770                                           DCRPS-CLOSE-ARG3.
001780    *    *******************************
001790     PROG-EXIT.
001800         MOVE 'CLTOUT  '  TO DCCLS-CLTOUT-REQUEST IN DCCLS-CLTOUT-ARG.
001810         MOVE ZERO        TO DCCLS-CLTOUT-FLAGS   IN DCCLS-CLTOUT-ARG.
001820         MOVE DCCLS-CLTIN-CLTID  IN DCCLS-CLTIN-ARG TO
001830              DCCLS-CLTOUT-CLTID IN DCCLS-CLTOUT-ARG.
001840    *
001850    *    *******************************
001860         CALL 'CBLDCCLS' USING DCCLS-CLTOUT-ARG.
001870    *    *******************************
001880         STOP RUN.
001890    *