CICS Transaction Server for z/OS BigCommareas: How to bypass the 32k Commarea restriction in CICS Transaction Server Robert Harris, CICS Technical Strategy, IBM Hursley. Issued: 01 March 2003 Revision Date: 01 March 2003 Previous Revision Date: 01 March 2003 Review Date: As Required Take Note! Before using this document be sure to read the general information under "Notices". First Edition, March 2003. © Copyright International Business Machines Corporation 2002. All rights reserved. Note to US Government Users -- Documentation related to restricted rights -- Use, duplication or disclosure is subject to restrictions set forth in GSA ADP Schedule contract with IBM Corp. Page ii Notices: The following paragraph does not apply in any country where such provisions are inconsistent with local law. INTERNATIONAL BUSINESS MACHINES CORPORATION PROVIDES THIS PUBLICATION "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Some states do not allow disclaimer of express or implied warranties in certain transactions, therefore this statement may not apply to you. References in this publication to IBM products, programs, or services do not imply that IBM intends to make these available in all countries in which IBM operates. Any reference to an IBM licensed program or other IBM product in this publication is not intended to state or imply that only IBM's program or other product may be used. Any functionally equivalent program that does not infringe any of the intellectual property rights may be used instead of the IBM product. Evaluation and verification of operation in conjunction with other products, except those expressly designated by IBM, is the user's responsibility. IBM may have patents or pending patent applications covering subject matter in this document. The furnishing of this document does not give you any license to these patents. You can send license inquiries, in writing, to the IBM Director of Licensing, IBM Corporation, 500 Columbus Avenue, Thornwood, New York 10594, USA. The information contained in this document has not be submitted to any formal IBM test and is distributed AS-IS. The use of the information or the implementation of any of these techniques is a customer responsibility and depends on the customer's ability to evaluate and integrate them into the customer's operational environment. While each item has been reviewed by IBM for accuracy in a specific situation, there is no guarantee that the same or similar results will be obtained elsewhere. Customers attempting to adapt these techniques to their own environments do so at their own risk. Page iii Trademarks: The following are Trademarks of International Business Machines Corporation in the United States, in other countries, or both: 3090 AFP Application System/400 AT C/370 CBPDO CICS/6000 CICS OS/2 CICS/VSE COBOL/370 CUA DFSMS DFSMSdss DXT Enterprise Systems Architecture/390 ESA/390 GDDM InfoWindow IMS MQ MVS/DFP MVS/SP NetView OS/390 Parallel Sysplex RACF RISC System/6000 S/370 SQL/DS System/38 System/390 VisualAge WebExplorer ACF/VTAM AIX APPN BookManager C/MVS CICS CICS/ESA CICS TS CICSPlex COBOL/2 DATABASE 2 DFSMS/MVS DFSMShsm eNetwork ES/3090 ES/9000 HiperBatch IBM IMS/ESA MQSeries MVS/ESA MVS/XA OpenEdition OS/400 PR/SM Resource Measurement Facility RMF S/390 SP System/360 SystemView VSE/ESA z/OS AD/Cycle AnyNet AS/400 C Set++ CBIPO CICS/400 CICS/MVS CICS/VM CICSPlex SM Common User Access DB2 DFSMSdfp DFSORT Enterprise Systems Architecture/370 ESA/370 ESCON Hiperspace IBMLink Language Environment MVS MVS Parallel Sysplex Multiprise OS/2 Processor Resource/Systems Manager Presentation Manager RETAIN RT SAA System/36 System/370 Systems Application Architecture VTAM UNIX is a registered Trademark in the United States and other countries licensed exclusively through X/Open Company Limited Java and all Java-based trademarks and logos are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. INTEL is a registered trademark of Intel Corporation, in the United States, or other countries, or both. Microsoft, Windows, and Windows NT are trademarks of Microsoft Corporation in the United States, or other countries, or both. Other company, product, and service names may be trademarks or service marks of others. Page iv Summary of amendments Date Of Change Change made to document 01/03/2003 Creation Reference Material and Bibliography: This document uses a short reference to the following documentation: Short reference Book Title CICS RDO Book CICS Resource Definition Guide SC34-5722 CICS SDG CICS System Definition Guide SC34-5725 CICS CG CICS Customization Guide SC34-5706 CICS EXT CICS External Interfaces Guide SC33-1944 CICS JAVA Java™ Applications in CICS SC34-6000-0 CICS APR CICS Application Programming Reference SC34-5702 CICS SPR CICS System Programming Reference SC34-5726 CICS RG CICS Transaction Server for z/OS Release Guide GC34-5983 CICS BTS CICS Business Transaction Services SC34-5268 CICS MG CICS Transaction Server for z/OS Migration Guide GC34-5984 JVM Book New IBM Technology featuring Persistent Reusable Java Virtual Machines SC34-5881 LDAP Red Book Understanding LDAP SG24-4986 Relevant SupportPacs: CA1J A MVS BatchPipes stage interface to CICS using EXCI Information for Batch deletion of BigCommareas CA1L A WLM-enabled large request handler for CICS BTS in a CICSPlex environment Page v Preface: This document is aimed at CICS Application Programmers who need to use Commareas bigger than the maximum 32k size supported by CICS Transaction Server for OS/390 version 1.3 or CICS Transaction Server for z/OS version 2.2. It describes a programming technique using CICS’ Business Transaction Services’ Containers to manipulate and handle data bigger than 32k bytes. This technique is referred to as BigCommarea processing. You do not need a detailed knowledge of CICS configuration to get the best out of this document, but are probably a CICS Systems Programmer, an Application Programmer or a Designer of CICS Applications. This document is structured in a less formal fashion than the CICS Transaction Server product documentation. You should always consider the latest official CICS TS publications as being correct in the cases where this document implies a mismatch. The information and code in this document is only applicable to CICS Transaction Server for OS/390 version 1.3 and CICS Transaction Server for z/OS version 2.2. It is not applicable to earlier CICS releases. This document uses Colour to highlight items of interest, so access to the PDF as well as the hard copy in the absence of a colour print is desirable. To save space, the abbreviation of XC means EXEC CICS when describing CICS API and SPI commands. Page vi Table of Contents How to use BigCommareas in CICS Transaction Server .....................................................1 Introduction .........................................................................................................................1 Some BTS Concepts ...........................................................................................................2 Units Of Work ..................................................................................................................2 Process ..............................................................................................................................2 Containers .........................................................................................................................2 Process and Container Scope ...........................................................................................2 System Definitions ................................................................................................................3 DFHLRQ ............................................................................................................................3 VSAM Repository Files .....................................................................................................4 Sharing BigCommarea Repository files with a CICSPlex ...............................................5 Sharing BigCommarea Repository file with general BTS access ....................................5 Clearing Repository Files .................................................................................................5 RDO ....................................................................................................................................6 VSAM Repository Files ...................................................................................................6 BTS PROCESSTYPEs .....................................................................................................8 The BigCommarea design .....................................................................................................9 General Overview ...............................................................................................................9 Creating the BigCommarea ................................................................................................9 Process Naming Conventions .........................................................................................10 Container Naming Conventions .....................................................................................10 Accessing the BigCommarea ............................................................................................11 Length Considerations ......................................................................................................12 Writing to the BigCommarea ............................................................................................13 Reading the BigCommarea ...............................................................................................14 Reading and Writing the BigCommarea ...........................................................................15 Releasing the BigCommarea ............................................................................................15 Deleting the BigCommarea ..............................................................................................16 Deleting the Container ...................................................................................................16 Deleting the Process and the Container ..........................................................................16 Passing a BigCommarea around .........................................................................................17 Just like a Commarea? ......................................................................................................17 Acting like a Commarea ...................................................................................................18 Passing the BigCommarea down to the next program ...................................................18 Global Storage ..................................................................................................................20 Storage between a sequence of Transactions ....................................................................20 Items aimed at specific programs .....................................................................................20 Automated Cleanup of Dead BTS Processes ....................................................................21 Scheduling a specific deletion ........................................................................................21 Scheduling a Global Cleanup .........................................................................................22 Using BTS facilities to delete the BTS Process .............................................................23 Investigating the VSAM Repository Files ..........................................................................24 The CBAM Transaction ...................................................................................................24 Running DFHBARUP ......................................................................................................26 Removing Dead Processes from the VSAM Repository file ..............................................29 Getting a list of BTS Processes with AMS and Pipes ......................................................30 Page vii Selecting the Dead Processes ............................................................................................31 Deleting via EXCI ............................................................................................................32 Sample Assembler program for BigCommarea processing ................................................33 Usage ................................................................................................................................33 Usage examples ..............................................................................................................34 The Code ...........................................................................................................................37 Page viii List of Figures DFHLRQ definition .........................................................................................................................3 Repository definition .......................................................................................................................4 RDO Definition for an unique VSAM Repository file....................................................................6 RDO Definition for a shared VSAM Repository file ......................................................................7 PROCESSTYPE RDO definition ....................................................................................................8 Avoiding Length exceptions when reading a BigCommarea ........................................................12 BigCommarea as a flowing Commarea with distinct UnitOfWorks .............................................18 BigCommarea as a flowing Commarea with a single UnitOfWork ..............................................19 Deleting hanging BigCommareas by scheduled Transaction ........................................................21 Deleting hanging BigCommareas via Browsing ...........................................................................22 DFHBARUP JCL to print a BTS Repository file..........................................................................26 DFHBARUP output for an Activity ..............................................................................................27 DFHBARUP output for a Process .................................................................................................28 Getting the Processes from the BTS Repository VSAM file.........................................................30 Deletion of BigCommarea Processes via EXCI and MVS Pipes ..................................................32 Sample Program: Creating the Process and BigCommarea...........................................................45 Sample Program: Reading the BigCommarea ...............................................................................47 Sample Program: Writing the BigCommarea ................................................................................48 Sample Program: Reading and Writing the BigCommarea...........................................................49 Sample Program: BigCommarea Usage via a Link .......................................................................52 Sample Program: BigCommarea Deletion via EXCI ....................................................................54 Sample Program: BigCommarea behavour on a failure ................................................................55 Sample Program: BigCommarea Exit processing .........................................................................56 Page ix How to use BigCommareas in CICS Transaction Server Introduction This document describes how to bypass the 32k Commarea size limit in CICS Transaction Server for OS/390 version 1.3 and CICS Transaction Server for z/OS version 2.2. I call this technique BigCommarea processing. This approach uses the Container facilities of the Business Transaction Services (BTS) component of CICS. The documentation for this is in the CICS BTS manual: you will need to have SC34-5268: CICS Business Transaction Services to hand whilst reading this document. I am assuming that you, my reader, are a CICS Application Programmer or a CICS Application Designer and are familiar with RDO. Instead of using a Commarea to pass data around, this BigCommarea design uses a BTS Container. This mechanism also engenders some interesting designs which remove the program-program association used by Commareas. I have also included some information about the CICS-supplied tools that manipulate BTS facilities. Some sample code is included in this document illustrating the BigCommarea technique. You can use these code fragments as the basis for your own code. How to use BigCommareas in CICS Transaction Server Page 1 of 63 Some BTS Concepts You need to read the BTS Book - but do not take too much notice of the sections dealing with Activities and Events as these are not used by this BigCommarea design. Units Of Work A basic concept for BTS: it is uses a VSAM file (called the Repository). This means that BTS operations are not hardened until the next UnitOfWork boundary (set explicitly by the next EXEC CICS SYNCPOINT command) or EndOfTask. This means that BTS applications have to consider the effect of additional EXEC CICS SYNCPOINT commands upon other accessed Recoverable Resources. Process BTS functionality is associated with a Process. In general CICS use, a Process' execution proceeds through Activities which are triggered by Events. When a Process is created, it is inactive, awaiting running of the Initial Activity (formally: the activation of the Root Activity). When a Process is used for BigCommarea processing, this Initial Activity is never run and so the Process is dormant throughout its lifetime. Containers BTS refers to items called Data Containers, but I'm just going to call them Containers. Data Containers can be associated with Activities (which are irrelevant to this design) or Processes (which are crucially used in this BigCommarea design). Whenever I use the term Container, I really mean 'Data Container at the Process level'. Containers are hardened by writing their contents to a VSAM File when an EXEC CICS SYNCPOINT command (or implicit equivalent) is executed. In this BigCommarea design, the owning Process is just used as an anchor point for Containers containing more than 32k of data. Process and Container Scope The scope of the Process and associated Containers are governed by the availability of the VSAM Repository file. If this is defined to a single CICS region, the Process will only exist in that specific region. If the VSAM file is known in many CICS regions, the Process is visible in all those CICS regions. So a Process can start executing in one CICS region and continue in another, with information passed around in Containers. How to use BigCommareas in CICS Transaction Server Page 2 of 63 System Definitions DFHLRQ You may already have a DFHLRQ file defined for your CICS region. BTS requests get logged in this file. You should increase its size to cope with the quantity of BigCommarea processing. If DFHLRQ does not exist, define it along the lines of Figure 1 and add to the CICS JCL. //LRQ EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //AMSDUMP DD SYSOUT=* //SYSIN DD * DEFINE CLUSTER ( NAME ( RHARRI1.IYCKRAH6.LRQ ) CYL(15 15) VOLUME(SYSDAV) CONTROLINTERVALSIZE( 8192 ) BUFFERSPACE ( 11468 ) SHAREOPTIONS( 2 3 ) REUSE LOG(UNDO) ) DATA ( NAME( RHARRI1.IYCKRAH6.LRQ.DATA ) KEYS (40 0 ) RECORDSIZE( 400 2048 ) CONTROLINTERVALSIZE( 8192 ) ) INDEX ( NAME ( RHARRI1.IYCKRAH6.LRQ.INDEX ) CONTROLINTERVALSIZE( 4096 ) IMBED REPLICATE ) /* - - Figure 1: DFHLRQ definition You need one of these DFHLRQ files per CICS region that will be using the BigCommarea design (or BTS in general). This file is not shared between CICS regions. System Definitions Page 3 of 63 VSAM Repository Files The BTS Repository files are merely VSAM files which are defined to CICS in the normal way. They should be created with variable length spanned records (BTS will split things up into manageable chunks). The JCL should look something like Figure 2 . //BIGCOMM EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //AMSDUMP DD SYSOUT=* //SYSIN DD * DEFINE CLUSTER ( NAME ( RHARRI1.IYCKRAH6.BIGCOMM ) CYL( 25 25 ) VOLUME( SYSDAV ) KEYS ( 50 0 ) RECORDSIZE( 8192 16384 ) CONTROLINTERVALSIZE( 8192 ) FREESPACE( 5 5 ) SHAREOPTIONS( 2 3 ) REUSE SPANNED INDEXED LOG(UNDO) ) DATA ( NAME( RHARRI1.IYCKRAH6.BIGCOMM.DATA ) CONTROLINTERVALSIZE( 8192 ) ) INDEX ( NAME ( RHARRI1.IYCKRAH6.BIGCOMM.INDEX ) IMBED REPLICATE ) /* Figure 2: Repository definition You should define one of these files per CICS region that will be using BigCommareas - these files should not be shared between CICS regions. You may want to define another distinct file that is shared between CICS regions (see “Sharing BigCommarea Repository files with a CICSPlex” on page 5). It is important that these files are created with sufficient space for the BigCommareas. Size the file according to the maximum number of BigCommareas concurrently active and their maximum expected length. It will be an unpleasant experience to take them offline and increase the space whilst being used by CICS! System Definitions Page 4 of 63 Sharing BigCommarea Repository files with a CICSPlex If your Application (which wants to use BigCommareas) will be executing across many CICS regions, the VSAM Respository file must be shared between all these regions. I suggest that you create another VSAM file specifically for sharing between CICS regions. Thus, your JCL will contain an unique VSAM file to contain BigCommareas that are specific to that Region and another VSAM file that is shared between all CICS regions. Sharing BigCommarea Repository file with general BTS access I recommend that you only use a given VSAM Repository file for BigCommarea usage. If you additionally put 'proper' BTS operational data in this VSAM file, you will have problems clearing it as you do not know whether or not the BTS activity has become stuck or is still active. Clearing Repository Files A Respository file that is unique to a CICS region should be cleared on a Cold Start. You could delete and recreate the file or use an utility to empty the file. A Shared Repository File is more difficult to manage. You can only empty it when all CICS regions are not using it. Ensure these Respository Files are created with sufficient space. The last thing you want to happen is that they fill up and have to be extended whilst CICS is using them. You can use operations described in “Deleting via EXCI” on page 32 to assist in the retirement of dangling processes. System Definitions Page 5 of 63 RDO Before you can use BTS for BigCommarea operations, you have to define the VSAM Repository files to RDO and create some PROCESSTYPE definitions which map these VSAM files to a BTS function. VSAM Repository Files VSAM Repository files that are unique to a specific CICS region should be RDO defined as a variable length VSAM file in the usual fashion as shown in Figure 3 . CEDA View File( BIGCOMM ) File : BIGCOMM Group : RAHBTS DEScription : BTS REPOSITORY FOR VSAM PARAMETERS DSNAme : BIGCOMM Password : RLsaccess : No LSrpoolid : 1 READInteg : Uncommitted DSNSharing : Allreqs STRings : 010 Nsrgroup : REMOTE ATTRIBUTES REMOTESystem : REMOTEName : REMOTE AND CFDATATABLE PARAMETERS RECORDSize : Keylength : INITIAL STATUS STAtus : Enabled Opentime : Startup DIsposition : Share BUFFERS DAtabuffers : 00011 Indexbuffers : 00010 DATATABLE PARAMETERS TABLE : No Maxnumrecs : Nolimit CFDATATABLE PARAMETERS Cfdtpool : TABLEName : UPDATEModel : Locking LOad : No DATA FORMAT RECORDFormat : V OPERATIONS Add : Yes BRowse : Yes DELete : Yes READ : Yes UPDATE : Yes AUTO JOURNALLING JOurnal : No JNLRead : None JNLSYNCRead : No JNLUpdate : No JNLAdd : None JNLSYNCWrite : Yes RECOVERY PARAMETERS RECOVery : None Fwdrecovlog : No BAckuptype : Static SECURITY RESsecnum : 00 BIG COMMAREAS PASSWORD NOT SPECIFIED Yes | No 1-8 | None Uncommitted | Consistent | Repeatable Allreqs | Modifyreqs 1-255 1-32767 1-255 (1-16 For CF Datatable) Enabled | Disabled | Unenabled Firstref | Startup Share | Old 2-32767 1-32767 No | CIcs | User | CF Nolimit | 1-99999999 Contention | Locking No | Yes V | F No | Yes No | Yes No | Yes Yes | No No | Yes No | 1-99 None | Updateonly | Readonly | All No | Yes No | Yes None | Before | AFter | ALl Yes | No None | Backoutonly | All No | 1-99 Static | Dynamic 0-24 | Public Figure 3: RDO Definition for an unique VSAM Repository file System Definitions Page 6 of 63 VSAM Repository files that are shared betwen CICS regions (the BigCommarea will be used within a CICSPlex environment) should be RDO defined as a variable length VSAM RLS file as shown in Figure 4 . CEDA View File( BIGCOMMS ) File : BIGCOMMS Group : RAHBTS DEScription : BTS REPOSITORY FOR VSAM PARAMETERS DSNAme : BIGCOMMS Password : RLsaccess : Yes LSrpoolid : 1 READInteg : Uncommitted DSNSharing : Allreqs STRings : 010 Nsrgroup : REMOTE ATTRIBUTES REMOTESystem : REMOTEName : REMOTE AND CFDATATABLE PARAMETERS RECORDSize : Keylength : INITIAL STATUS STAtus : Enabled Opentime : Startup DIsposition : Share BUFFERS DAtabuffers : 00011 Indexbuffers : 00010 DATATABLE PARAMETERS TABLE : No Maxnumrecs : Nolimit CFDATATABLE PARAMETERS Cfdtpool : TABLEName : UPDATEModel : Locking LOad : No DATA FORMAT RECORDFormat : V OPERATIONS Add : Yes BRowse : Yes DELete : Yes READ : Yes UPDATE : Yes AUTO JOURNALLING JOurnal : No JNLRead : None JNLSYNCRead : No JNLUpdate : No JNLAdd : None JNLSYNCWrite : Yes RECOVERY PARAMETERS RECOVery : None Fwdrecovlog : No BAckuptype : Static SECURITY RESsecnum : 00 BIG COMMAREAS SHARED PASSWORD NOT SPECIFIED Yes | No 1-8 | None Uncommitted | Consistent | Repeatable Allreqs | Modifyreqs 1-255 1-32767 1-255 (1-16 For CF Datatable) Enabled | Disabled | Unenabled Firstref | Startup Share | Old 2-32767 1-32767 No | CIcs | User | CF Nolimit | 1-99999999 Contention | Locking No | Yes V | F No | Yes No | Yes No | Yes Yes | No No | Yes No | 1-99 None | Updateonly | Readonly | All No | Yes No | Yes None | Before | AFter | ALl Yes | No None | Backoutonly | All No | 1-99 Static | Dynamic 0-24 | Public Figure 4: RDO Definition for a shared VSAM Repository file In both cases, I have assumed that 10 Transactions will be accessing the BTS VSAM repository file concurrently. Thus I have set STRINGS & INDEXBUFFERS to 10 and DATABUFFERS to 11. You can use all the usual actions to improve performance for these BTS VSAM repository files. System Definitions Page 7 of 63 BTS PROCESSTYPEs The PROCESSTYPE RDO definition links the BTS VSAM Repository file to a BTS ProcessType. It also controls auditing options, but these should be ignored in the BigCommarea design. A given VSAM Repository file can be accessible through more than one ProcessType. Figure 5 shows a definition linking up to the BIGCOMM file (where I have decided that the VSAM Repository file name is to be the same as the ProcessType). CEDA View PROCesstype( BIGCOMM ) PROCesstype : BIGCOMM Group : RAHBTS Description : RAH BTS DEFINITION FOR BIG COMMAREAS INITIAL STATUS Status : Enabled Enabled | Disabled DATA SET PARAMETERS File : BIGCOMM AUDIT TRAIL AUDITLOg : AUDITLEvel : Off Off | Process | Activity | Full Figure 5: PROCESSTYPE RDO definition You have define a PROCESSTYPE for each ProcessType that you use with the XC BTS API. In the BigCommarea sample program in this document, I use a fixed name of BIGCOMM for the ProcessType parameter. I expect that you will usually use fixed names: one definition for BigCommareas that will only ever be accessed from within the specific CICS region and another definition for BigCommareas that will be accessed throughout the CICSPlex. System Definitions Page 8 of 63 The BigCommarea design General Overview The general idea of this BigCommarea design is to permit Commarea-equivalents to cope with more than 32k of data. A BTS Container provides this function. One creates the named Container at the start of a Transaction and then passes the name of it (along with the ProcessName and ProcessType) in a Commarea to where-ever it is required. The Container is subsequently read and written as required throughout the lifetime of both the current Transaction and any other Transactions (that know the aforementioned three-part identification). The Container exists until it is physically deleted (there is no automatic deletion by CICS). As BTS services rely on the VSAM Repository file, BTS operations are not hardened until the next UnitOfWork boundary. This is why the BigCommarea design uses lots of EXEC CICS SYNCPOINT commands. Creating the BigCommarea The BigCommarea will usually be created in the first transaction of a sequence. This involves: O Creating a BTS Process EXEC CICS DEFINE PROCESS O Creating a BTS Container EXEC CICS PUT CONTAINER O Ending the UnitOfWork EXEC CICS SYNCPOINT as shown in the code fragment on page 45. The name of the BTS Process consists of a variable ProcessName and a fixed ProcessType. This ProcessType has to be RDO defined (see “BTS PROCESSTYPEs” on page 8) and implies the scope of the Process. This scope will either be local to the current CICS region or visible to all CICS regions in a CICSPlex (more specifically, those regions which have that ProcessType RDO defined and associated with a shared VSAM BTS Repository file). To complete the Process and Container creation, you have to commit the current CICS UnitOfWork with an EXEC CICS SYNCPOINT command. The BigCommarea design Page 9 of 63 Process Naming Conventions The ProcessName must be unique (within the scope of the associated VSAM file) and is 36 bytes long. I would suggest using a combination of SYSID, TRANSID, Task Number (converted to numbers) and some sort of Data/Time stamp. The sample program in this document uses a STCK value (converted into characters) as this data/time stamp. You may want to use a YYMMDDHHMMSS format as this could be used to easily select redundant Processes for deletion (see “Automated Cleanup of Dead BTS Processes” on page 21 and “Removing Dead Processes from the VSAM Repository file” on page 29). The ProcessType will be fixed, and should either be the region specific name or the shared name (see “BTS PROCESSTYPEs” on page 8). Container Naming Conventions If you are only going to use this BigCommarea design in a strict Commarea-type of fashion, then you will probably want to use a fixed name for the single BTS Container that you are going to use. If you are sharing the BTS VSAM file with real BTS operations (which I do not recommend, see “Sharing BigCommarea Repository file with general BTS access” on page 5), then you want a name that can easily show that you are using the Container (and so the associated Process) as a BigCommarea. Why not call it 'BIGCOMM'? Other design techniques are possible - see “Passing a BigCommarea around” on page 17. The BigCommarea design Page 10 of 63 Accessing the BigCommarea Before you can access the BigCommarea you have to know the name of the BTS Process that owns the BTS Container. You can only access a BTS Container once you have gained control of the BTS Process that owns the Container. Consequently, before the BigCommarea can be accessed, the BTS Process that owns the Container has to be associated with the current CICS UnitOfWork. I mean UnitOfWork not Transaction - so if the Transaction issues an EXEC CICS SYNCPOINT command, the Process will again have to be associated with the (new) UnitOfWork. This association, and so access to the BigCommarea, lasts until the next EXEC CICS SYNCPOINT command (or Transaction Abend). Only one UnitOfWork can have control (use) of the Process - double access is not allowed by CICS. The Process and, hence, the BigCommarea, exists until some action is taken to delete it. The BigCommarea, therefore, will survive over a Transaction boundary. The command sequence is: O Associating the BTS Process EXEC CICS ACQUIRE PROCESS O Accessing the BTS Container EXEC CICS GET/PUT CONTAINER O Ending the UnitOfWork EXEC CICS SYNCPOINT as shown in the code fragments on page 47 and page 48. Access to the BigCommarea is via move-mode (a chunk of storage is copied to/from the BigCommarea) not locate-mode (access via a Pointer). The initial EXEC CICS ACQUIRE PROCESS and the final EXEC CICS SYNCPOINT can be in different modules. The BigCommarea design Page 11 of 63 Length Considerations The EXEC CICS GET CONTAINER command will return a Length error if the area that is to contain the obtained information is not exactly the same size as the BigCommarea (too big as well as the normal too small). You may know the size by design or do not care about the Length Exception. However, in general, you will want to determine the length of the BigCommarea to avoid this Length exception. The way to do this is to issue an EXEC CICS GET CONTAINER(name) ACQPROCESS INTO(s) FLENGTH(v) NOHANDLE with the length variable v set to zero. This will not cause data to be read from the BigCommarea, but will return its length in v (you will also get the Length exception which is why the NOHANDLE is present to ignore this expected error). Once you have got the length of the BigCommarea you can then get a correctly sized area via EXEC CICS GETMAIN SET(p) FLENGTH(v) command and then issue the EXEC CICS GET CONTAINER(name) ACQPROCESS INTO(area pointed to by p) FLENGTH(v) to read the BigCommarea. Therefore, if you want to access a BigCommarea in a generic fashion you should use a design like Figure 6 : declare l fixed bin(31) ; declare p pointer(31) ; declare 1 bc 3 bcdata char(...) , ; l = 0 ; XC GET CONTAINER() ACQPROCESS INTO(l) FLENGTH(l) NOHANDLE ; XC GETMAIN SET(p) FLENGTH(l) ; XC GET CONTAINER() ACQPROCESS INTO(p->bc) FLENGTH(l) ; Figure 6: Avoiding Length exceptions when reading a BigCommarea The BigCommarea design Page 12 of 63 Writing to the BigCommarea Before the BigCommarea can be accessed, the BTS Process that owns the Container has to be associated with the current CICS UnitOfWork. After this association, the Container acting as the BigCommarea can be simply written. An area is merely copied into the Container. The size of the Container (diminished or increased) is adjusted to the size of the data. To harden the data in the Container, an EXEC CICS SYNCPOINT is issued. If the Transaction abends (or an EXEC CICS SYNCPOINT ROLLBACK issued), the (new) information will be lost from the Container - and any data that was there before the Container was written to will still be present. The command sequence is: O Associating the BTS Process EXEC CICS ACQUIRE PROCESS O Writing to the BigCommarea EXEC CICS PUT CONTAINER O Ending the UnitOfWork EXEC CICS SYNCPOINT as shown in the code fragment on page 48. The initial EXEC CICS ACQUIRE PROCESS and the final EXEC CICS SYNCPOINT can be in different modules. The BigCommarea design Page 13 of 63 Reading the BigCommarea Before the BigCommarea can be accessed, the BTS Process that owns the Container has to be associated with the current CICS UnitOfWork. After this association, the Container acting as the BigCommarea can be simply read. The contents of the BigCommarea Container are simply copied to an area related to the Transaction. Reading the BigCommarea Container does not delete the information in it this is still available. It is advisable to inquire upon the length of data held in the BigCommarea before reading it, as Length Exceptions can be generated if there is a mismatch between the area length and the Container data length (oddly, if the area length is bigger than the Container data length as well as the more usual Container_ data_will_not_fit_into_the_area error). See “Length Considerations” on page 12 for code to obtain the length of the BigCommarea. You would probably want to do this length inquiry anyway in order to get the data length to be passed into an EXEC CICS GETMAIN FLENGTH() command to obtain an area for the Containers data. The command sequence is: O Associating the BTS Process EXEC CICS ACQUIRE PROCESS O Getting the length of BTS Container EXEC CICS GET CONTAINER (with zero length supplied) O Getting the data area EXEC CICS GETMAIN FLENGTH() O Reading the BigCommarea EXEC CICS GET CONTAINER O Ending the UnitOfWork EXEC CICS SYNCPOINT as shown in the code fragment on page 47. The EXEC CICS GETMAIN FLENGTH() is omitted from this fragment for clarity. The initial EXEC CICS ACQUIRE PROCESS and the final EXEC CICS SYNCPOINT can be in different modules. The BigCommarea design Page 14 of 63 Reading and Writing the BigCommarea As long as you have associated the Process with the current CICS UnitOfWork, you can read and write the Container without any problems. However, if you Abend (or issue an EXEC CICS SYNCPOINT ROLLBACK command), the contents of the BigCommarea Container will be that when the association is made. Any updates will be lost (all of them, not just the last one). The command sequence is: O Associating the BTS Process EXEC CICS ACQUIRE PROCESS O Getting the length of BTS Container EXEC CICS GET CONTAINER (with zero length supplied) O Getting the data area EXEC CICS GETMAIN FLENGTH() O Reading the BigCommarea EXEC CICS GET CONTAINER O Writing the BigCommarea EXEC CICS PUT CONTAINER O Ending the UnitOfWork EXEC CICS SYNCPOINT as shown in the code fragment on page 49. The EXEC CICS GETMAIN FLENGTH() is omitted from this fragment for clarity. The initial EXEC CICS ACQUIRE PROCESS and the final EXEC CICS SYNCPOINT can be in different modules. Refer to “Length Considerations” BigCommareas in a generic fashion. on page 12 for accessing Releasing the BigCommarea This happens as a side effect on the EXEC CICS SYNCPOINT command. There is no explicit command to loose access to the BTS Container or the BTS Process. The BigCommarea design Page 15 of 63 Deleting the BigCommarea Deleting the Container This BigCommarea design does not consider that a deletion of a BTS Container acting as a BigCommarea is necessary. However, the extended designs (see “Passing a BigCommarea around” on page 17) could use this technique. However, in general, if you do want to release resource associated with a BigCommarea, the most efficient thing to do is just set its length to zero. Deleting the Process and the Container The BTS Process which is used as the anchor for the BTS Container acting as a BigCommarea will never be automatically deleted by CICS. It will stay around until the relevant BTS Command is issued. Consequently, you must ensure that somewhere in the application the BTS Process is deleted. All Abend handling routines should contain this deletion (create some if they are absent!). See “Scheduling a specific deletion” on page 21 for information about CICS-related processing to avoid an hanging BigCommarea. If a BigCommarea (and the associated BTS Process) is left around, the relevant BTS Repository file (see “Clearing Repository Files” on page 5) will fill up. You will have to manually clean up the BTS Repository file (see “Deleting via EXCI” on page 32). The command sequence is: O Associating the BTS Process EXEC CICS ACQUIRE PROCESS O Deleting the Process and Container EXEC CICS CANCEL ACQPROCESS O Ending the UnitOfWork EXEC CICS SYNCPOINT as shown in the code fragment on page 56. The BigCommarea design Page 16 of 63 Passing a BigCommarea around Just like a Commarea? The BigCommarea, being based on the contents of the VSAM BTS Repository file, does not have the same operational characteristics as a Commarea. In particular, one is not restricted to: Q creating in a program at level n Q reading and writing in the next program at level n+1 Q reading the updates back at level n As a Commarea is in local transaction-related storage for a program, it is automatically deleted when control returns to the invoking level. None of these considerations apply to a BigCommarea: Q A BigCommarea can be accessed outside of the current transaction Q A BigCommarea can be accessed at any level in the program stack Q A BigCommarea is never automatically deleted by CICS Do not restrict your use of the BigCommarea design to Commarea characteristics. When you create your design, remember that a BigCommarea is not accessed via locate-mode operations (Pointers), but by move-mode operations (via API into/outof the BTS Container). Recall that the BigCommarea is associated with an owning BTS Process (see “Containers” on page 2) and that this can have many associated BTS Containers (see “General Overview” on page 9). Consequently, you can have many BigCommareas available and accessible at any time. However, when constructing your design, the most crucial point is the association of BigCommarea activity with the current CICS UnitOfWork. This will affect your treatment of CICS Recoverable Resources. Recall that a UnitOfWork can last over a program boundary (the same UnitOfWork exists in program A and the XC LINKed to program B). Passing a BigCommarea around Page 17 of 63 Acting like a Commarea A BigCommarea can be accessed in a Commarea-equivalent fashion. Passing the BigCommarea down to the next program You know the name of the program in which the BigCommarea is to be accessed (which you must know to do the EXEC CICS LINK). Thus, name the BigCommarea to be that of the program within which it is to be read (at the next level down the stack). When you update the BigCommarea and return to the invoking module, this higher-level module must similarly know its name (as it created it). In the most specialised case, each program looks after its own UnitOfWork, so a calling sequence will be akin to Figure 7 . Prog1 XC XC XC XC DEFINE PROCESS(P) PUT CONTAINER(PROG2) SYNCPOINT LINK PROGRAM(PROG2) XC XC XC XC XC ACQUIRE PROCESS(P) GET CONTAINER() FLENGTH(zerovar) GET CONTAINER(PROG2) CANCEL ACQPROCESS SYNCPOINT Prog2 XC ACQUIRE PROCESS(P) XC GET CONTAINER() FLENGTH(zerovar) XC GET CONTAINER(PROG2) .... XC PUT CONTAINER(PROG2) XC SYNCPOINT XC RETURN Figure 7: BigCommarea as a flowing Commarea with distinct UnitOfWorks Be aware that, according to “Length Considerations” on page 12, zerovar is set to zero before issuing the EXEC CICS GET CONTAINER FLENGTH(zerovar) command to obtain the length of the BigCommarea. Passing a BigCommarea around Page 18 of 63 A more common case is where the UnitOfWork covers more than one program. Figure 8 shows the code required. Prog2 Prog1 declare L fixed bin(31) declare P pointer declare 1 bc 3 bcdat char(n) declare Somedata char(n) declare L fixed bin(31) declare P pointer declare 1 bc 3 bcdat char(n) declare Otherdata char(m) ; ; , ; ; ; ; , ; ; XC PUT CONTAINER('PROG2') FROM(Somedata) FLENGTH(Length(Somedata)) ; L = 0 ; XC GET CONTAINER('PROG2') INTO(L) FLENGTH(L) NOHANDLE XC LINK PROGRAM('PROG2') ; XC GETMAIN SET(P) FLENGTH(L) ; XC DEFINE PROCESS('P') ; L = 0 ; XC GET CONTAINER('PROG2') INTO(L) FLENGTH(L) NOHANDLE ; XC GETMAIN SET(P) FLENGTH(L) ; XC GET CONTAINER('PROG2') INTO(P->bc) FLENGTH(L) ; XC GET CONTAINER('PROG2') INTO(P->bc) FLENGTH(L) ; .... XC PUT CONTAINER('PROG2') FROM(Otherdata) FLENGTH(Length(Otherdata)) ; XC RETURN ; ; XC CANCEL ACQPROCESS ; XC SYNCPOINT ; Figure 8: BigCommarea as a flowing Commarea with a single UnitOfWork This example shows that the BigCommarea does not exist outside of the UnitOfWork that created it. This will be a common arrangement for your code. Don’t forget to include the EXEC CICS CANCEL ACQPROCESS command in the Abend Handling routine to ensure that things are tidied up on an Abend. When using EXEC CICS XCTL you are not returning a BigCommarea to the higher level (as there is no higher level), so you have the possibility of immediately deleting the Process (EXEC CICS CANCEL ACQPROCESS) if it it not subsequently needed. Passing a BigCommarea around Page 19 of 63 Global Storage You can use a BigCommarea to hold Global information between CICS Transactions (things like a last-used stamp or a last-accessed record key). As the BigCommarea can only be used by a single Transaction (or more precisely, a single UnitOfWork) you do not have to worry about double access (the classic double update problem cannot occur). You do not need to use facilities like Temporary Storage Queues, specific records in files or a chunk of Global User Exit anchored storage (all of which have to be protected against double access) to hold persistent information - just use a fixed name BigCommarea. Storage between a sequence of Transactions A BigCommarea can be used to save information between Transaction Instances. Here, the design challenge is to ensure that the name of the BigCommarea is known and not improperly used. All the usual techniques are available to pass the name around (such as hidden fields in BMS maps). Items aimed at specific programs Access to a BigCommarea is not restricted to the next program level. Consequently, a program at, say, level 5 can construct a BigCommarea for use by a named program somewhen else in the access stack. You do not have to continually copy bits out of a Commarea into a new one. Name the BigCommarea to be the program it is to be accessed within. Take care in deciding where the BigCommarea is to be emptied (if necessary) if it is not clear where the owning BTS Process is deleted. Passing a BigCommarea around Page 20 of 63 Automated Cleanup of Dead BTS Processes A BTS Process, and thus any associated Containers, is never automatically deleted by CICS. This means that a BigCommarea can be left hanging in the Repository VSAM file. Consequently, this VSAM file will fill up or get fragmented to inhibit performance (or actual activity!). “Removing Dead Processes from the VSAM Repository file” on page 29 shows how the VSAM file is cleaned up through Batch processing. However, there are some techniques that you can use within CICS to do the deletion automatically. These techniques come at a risk of removing information that is still active. Scheduling a specific deletion You can specifically schedule a cleanup transaction whenever you create the BTS Process (at XC DEFINE PROCESS time). Just pass in the ProcessName and the ProcessType as the Startdata for an XC STARTed transaction. This transaction is very simple, as shown in Figure 9 : XC XC XC XC XC RETRIEVE INTO(ProcessName and ProcessType) ACQUIRE PROCESS(ProcessName) PROCESSTYPE(ProcessType) CANCEL ACQPROCESS SYNCPOINT RETURN Figure 9: Deleting hanging BigCommareas by scheduled Transaction The skill is in deciding how long the BigCommarea is to exist before it is deamed to be hanging. Consequently, you may want to schedule this transaction to occur at a specific quiet time as an alternative to scheduling it after a longish delay. Passing a BigCommarea around Page 21 of 63 Scheduling a Global Cleanup You can schedule a CICS Transaction (to run at Startup, Shutdown or some suitable quiet time) which can scan a given BTS Repository file for BigCommareas and delete those which are deamed to be left hanging. How you make the decision as to whether or not a given item is deleteable is upto you. This criteria will undoubtably have an impact of your structuring of the unique BTS Process names (see “Process Naming Conventions” on page 10). You must know the ProcessType being used for the BigCommarea processing, and the tidyup code will look something like Figure 10 : loop: k = 0 XC STARTBROWSE PROCESS PROCESSTYPE(<<name>>) BROWSETOKEN(k) XC GETNEXT PROCESS(p) BROWSETOKEN(k) RESP(rc) XC ENDBROWSE PROCESS BROWSETOKEN(k) if ( rc <> 0 ) then endloop if ( ( p is has a BigCommarea naming Convention ) & ( p should be deleted ) ) then do XC ACQUIRE PROCESS(p) PROCESSTYPE(<<name>>) ; XC CANCEL ACQPROCESS ; XC SYNCPOINT ; XC DELAY FOR SECONDS(1) ; end end ; ; ; ; Figure 10: Deleting hanging BigCommareas via Browsing This code will, undoubtably, look strange to you (it did to me when I finalised it!). Here are the reasons why: O O O O You have to Acquire a Process in order to delete it You cannot Acquire a Process that is currently being Browsed A given UnitOfWork can only be associated with a single Process Some asynchronous work occurs on Process deletion, so you have to allow a pause for this to complete before obtaining the next Process Change to the BTS code within CICS may result in a more-standard browse situation; however, this way works now! Passing a BigCommarea around Page 22 of 63 Using BTS facilities to delete the BTS Process Deletion using BTS facilities is much more complex than the previous ways of deleting an hanging BigCommarea. You have to be very familar with BTS Processing (and understand all of the CICS BTS book). Consequently, I am not going to describe how you can use BTS facilities to schedule an automatic deletion, because using this functionality takes you firmly into the full scope of BTS functionality, and so is outside of the scope of this document. But briefly: X X X the BTS Process has to become active and contain real code you must construct a Timer event and an associated activity when the Timer event fires, the associated activity should delete the Process. Passing a BigCommarea around Page 23 of 63 Investigating the VSAM Repository Files The CBAM Transaction CBAM can be used to display the contents of a VSAM Repository file. The example displays shown in this section relate to the function of the UTPROGC sample program. CBAM initially shows which VSAM files are being used as BTS Repositories: Pressing Enter on this Line shows what is in the selected VSAM Repository File: The Completion Status should always be Incomplete and the Mode Initial for BTS Processes being used as BigCommareas (because there are no Activities associated with the Process which never runs). Investigating the VSAM Repository Files Page 24 of 63 Tabbing over to the Conts field and pressing Enter, displays the Containers associated with the Process (this is where BigCommarea Containers are indicated): You can see that my sample program has created the required Container with its rather obvious name. If, on the previous panel, one hits Enter on the Process field, you would get a display showing the BTS Activities associated with the Process: You should always see that a BigCommarea Process is Incomplete, awaiting the Initial event to fire (which never happens). You can examine the Activity by pressing Enter on it: You can use this display to see what BTS components are associated with the Activity, but there are none for BigCommarea processing (the Containers are associated with the Process). Investigating the VSAM Repository Files Page 25 of 63 Running DFHBARUP You can print the contents of a BTS VSAM Repository file using the DFHBARUP utility. The JCL should be something like Figure 11 : //PRTBTS EXEC PGM=DFHBARUP,REGION=0M //STEPLIB DD DSN=<<CICS>>.SDFHLOAD,DISP=SHR //BIGCOMM DD DSN=RHARRI1.IYCKRAH6.BIGCOMM,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSABEND DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSIN DD * REPOSITORY(BIGCOMM) /* Figure 11: DFHBARUP JCL to print a BTS Repository file The listing will interpret items in VSAM key order. Consequently, you should first see all Activities that are associated with BigCommarea processing. All these will be Incomplete and not own Containers or Events (see Figure 12, ‘DFHBARUP output for an Activity,’ on page 27). Next, all Processes being used as Anchor Points for the BTS Containers used as BigCommareas will appear (see Figure 13, ‘DFHBARUP output for a Process,’ on page 28). It is at this point that the BigCommareas will appear as BTS Containers. If the BTS VSAM Repository file being processed is only used for BigCommarea processing, then you are really only interested in the Process part of the Listing. Investigating the VSAM Repository Files Page 26 of 63 Figure 12: DFHBARUP output for an Activity Investigating the VSAM Repository Files Page 27 of 63 000000 C1401A11 C7C2C9C2 D4C9E8C1 4BC9E8C3 E6E3C3F0 F8C51399 CCB00C00 000020 D9D6D6E3 40404040 40404040 40400000 00000000 00004000 000001CC 000040 6EC4C6C8 C2C1C1C3 E3C9E5C9 00000000 00000000 01500001 00000000 000060 C7C3D6D4 D440D9C1 C8F64BD9 C1C8C34B F0F0F0F0 F0F0F5F4 4BC2F8C3 000080 F9F7C3F7 C6C6F4C3 F34B0000 00000000 00000000 00000000 00000000 0000A0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0000C0 1A11C7C2 C9C2D4C9 E8C14BC9 E8C3E6E3 C3F0F8C5 1399CCB0 0C000101 0000E0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000100 00000001 00000000 00000000 00000000 00000000 00000000 00000000 000120 00000000 13D617F0 13D617F0 00000000 00000000 13D61800 13D61800 000140 D6C7C340 00000000 00000000 D9C1C8C3 C3C9C3E2 E4E2C5D9 40404040 000160 40404040 40404040 01404040 40404040 40404040 40004040 40404040 000180 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0001A0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0001C0 00000000 00000000 00000000 Related BTS Objects Process Type : BIGCOMM Name : RAH6.RAHC.00000054.B8C513997C7FF4C3. No Parent No Children Containers No Containers 01C4C6C8 01500000 D740C2C9 F5F1F3F9 00000000 00000000 00000000 00000000 00000000 E4E3D7D9 40404040 40400000 00000000 00000000 *A ..GBIBMIYA.IYCWTC08E.r.....DFH* *ROOT ........ ......&..* *>DFHBAACTIVI.........&......P BI* *GCOMM RAH6.RAHC.00000054.B8C5139* *97C7FF4C3.......................* *................................* *..GBIBMIYA.IYCWTC08E.r..........* *................................* *................................* *.....O.0.O.0.........O...O..UTPR* *OGC ........RAHCCICSUSER * * . . ..* *................................* *................................* *............ * Activity Name : DFHROOT Process : RAH6.RAHC.00000054.B8C513997C7FF4C3. Process Type : BIGCOMM Activity Id : ..GBIBMIYA.IYCWTC08E.r.....DFHROOT Generation : 0000001 11CCCCDCEC4CECEECFFC19CB000CCCDDDE4444444444 A172924981B98363308539C0C0146896630000000000 Definitional Attributes Program : UTPROGC Transid : RAHC Userid : CICSUSER Comp Event : Current State Mode : Initial (Initial, Active, Dormant, Cancelling, Complete) Suspended : No (Yes, No) Generation : 0000001 Child Count : 0000000 Completion Status Completion Response : Incomplete Figure 13: DFHBARUP output for a Process Investigating the VSAM Repository Files Page 28 of 63 000000 F1F1F1F1 F1F1F1F1 Process : RAH6.RAHC.00000054.B8C513997C7FF4C3. Process Type : BIGCOMM Root Id : ..GBIBMIYA.IYCWTC08E.r.....DFHROOT 11CCCCDCEC4CECEECFFC19CB000CCCDDDE4444444444 A172924981B98363308539C0C0146896630000000000 Audit Level : Off (Off, Pro, Act, Full) Audit Log : 000000 D740C2C9 C7C3D6D4 D440D9C1 C8F64BD9 C1C8C34B F0F0F0F0 F0F0F5F4 000020 F5F1F3F9 F9F7C3F7 C6C6F4C3 F34B0000 00000000 00004000 00000144 000040 6EC4C6C8 C2C1D7D9 D6C3C5E2 000100A0 00000000 00000000 00000000 000060 C7C2C9C2 D4C9E8C1 4BC9E8C3 E6E3C3F0 F8C51399 CCB00C00 01C4C6C8 000080 40404040 40404040 40400000 00000000 13D61710 00000001 00000038 0000A0 00000000 00000000 00000000 00000000 00000000 13D616B0 13D616B0 0000C0 00000000 13D61910 13D61910 00404040 40404040 40000000 00000000 0000E0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000100 00000001 Containers Container Name : COMMAREA Container Length : x'00000008' 4BC2F8C3 00A00000 C1401A11 D9D6D6E3 00000000 00000000 00000000 00000000 *11111111 * *P BIGCOMM RAH6.RAHC.00000054.B8C* *513997C7FF4C3......... .........* *>DFHBAPROCES................A ..* *GBIBMIYA.IYCWTC08E.r.....DFHROOT* * .......O..............* *.....................O...O......* *.....O...O... ...........* *................................* *.... * Removing Dead Processes from the VSAM Repository file If a Transaction Abends whilst processing BigCommareas, and an Abend Handling routine has not issued the appropriate EXEC CICS CANCEL ACQPROCESS command, the BigCommarea will be held in the associated VSAM Repository file for ever. This will eventually cause the VSAM file to get fragmented or fill up. Both of which are bad news. The techniques described in “Automated Cleanup of Dead BTS Processes” on page 21 may not be sufficient to clean things up, so some Batch Processing may be required. You will need to do some manual operations in order to get rid of the dead processes. Write a little utility program that Acquires the redundant Process and then Cancels it. A suitable code fragment exists on page 54. Removing Dead Processes from the VSAM Repository file Page 29 of 63 Getting a list of BTS Processes with AMS and Pipes Those of you who are familiar the authors SupportPacs or User Group Presentations will know that he likes doing things with Rexx or MVS Pipes. You will not be disappointed as he continues with some suggestions for using these tools! You can read the BTS Repository file and extract the names of the Processes - these are records whose key starts with 'P ' (the letter P followed by a space). After this comes the ProcessType (8 bytes) and the ProcessName (36 bytes) which is followed by other (irrelevant) information. The easiest way to get the Record Keys from the BTS VSAM repository file is to use AMS to print the records. Next, use a MVS Pipe to reformat the relevant lines so that the ProcessName appears before the ProcessType. Figure 14 shows the code required. //DOBTS EXEC PGM=IDCAMS,REGION=0M //BIGCOMM DD DSN=RHARRI1.IYCKRAH6.BIGCOMM,DISP=SHR //SYSPRINT DD DSN=&&TEMP,DISP=(MOD,PASS), // UNIT=SYSDA, // SPACE=(CYL,(15,15)) //SYSIN DD * PRINT IFILE(BIGCOMM) CHARACTER /* //RUN1 EXEC PGM=PIPE, // PARM='(SEP ; end ? ) < dd=PIPEIN ; join * ; // runpipe ; > dd=PIPEPOUT coerce' //BARUP DD DSN=&&TEMP,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //PIPEPOUT DD SYSOUT=*,DCB=(RECFM=F,LRECL=132,BLKSIZE=132) //PIPEOUT DD SYSOUT=*,DCB=(RECFM=F,LRECL=132,BLKSIZE=132) //SYSTSPRX DD SYSOUT=* //SYSTSPRT DD SYSOUT=*,DCB=(RECFM=F,LRECL=132,BLKSIZE=132) //PIPEIN DD * (SEP ; end ?) <mvs ddname=BARUP ; strfind /0KEY OF RECORD - P / ; specs 20-* 1 ; specs 1-44 1 ; specs 9-44 1 1-8 38 ; pad 45 ; sort unique ; > dd=PIPEOUT coerce /* Figure 14: Getting the Processes from the BTS Repository VSAM file Removing Dead Processes from the VSAM Repository file Page 30 of 63 You get output showing the BTS ProcessName and ProcessType in columns 1-36 (word1) and 38-45 (word2): ....-....1....-....2....-....3....-....4....RAH6.RAHC.00000211.B8CA15B181A5690A. BIGCOMM RAH6.RAHC.00000214.B8CA15B9B098A5C7. BIGCOMM RAH6.RAHC.00000215.B8CA15BBD3EB6445. BIGCOMM RAH6.RAHC.00000216.B8CA15BDB6B585C1. BIGCOMM RAH6.RAHC.00000217.B8CA15BFF5FF7E80. BIGCOMM Observe the space padding: you should access fields using column notation. Selecting the Dead Processes Once you have this list of BTS Processes being used as BigCommareas, you will have to decide which you want to delete. This will be dependant upon how you are structuring the ProcessNames for BigCommarea processing. You might just want to cut-and-paste selected names into your deletion utility. Removing Dead Processes from the VSAM Repository file Page 31 of 63 Deleting via EXCI The authors CA1J SupportPac (available on the CICS Web site at http://www.ibm.com/software/ts/cics/txppacs/ca1j.html) can be used to drive a CICS program through EXCI facilities from a MVS Pipe. Consequently, after selection, you can automatically delete the relevant BTS Processes using the program included in this document (see page 54) being driven through CA1J. The JCL and Pipe is shown in Figure 15 : /DOBTS EXEC PGM=IDCAMS,REGION=0M //BIGCOMM DD DSN=RHARRI1.IYCKRAH6.BIGCOMM,DISP=SHR //SYSPRINT DD DSN=&&TEMP,DISP=(MOD,PASS), // UNIT=SYSDA, // SPACE=(CYL,(15,15)) //SYSIN DD * PRINT IFILE(BIGCOMM) CHARACTER /* //RUN2 EXEC PGM=PIPE, // PARM='(SEP ; end ? ) < dd=PIPEIN ; join * ; // runpipe ; > dd=PIPEPOUT coerce' //BARUP DD DSN=&&TEMP,DISP=SHR //STEPLIB DD DSN=UTL.RHARRI1.LOAD,DISP=SHR,DCB=BLKSIZE=3276 // DD DSN=RHARRI1.CA1ILOAD,DISP=SHR // DD DSN=<<CICS>>.SDFHEXCI,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //PIPEPOUT DD SYSOUT=*,DCB=(RECFM=F,LRECL=132,BLKSIZE=132) //PIPEOUT DD SYSOUT=*,DCB=(RECFM=F,LRECL=132,BLKSIZE=132) //SYSTSPRX DD SYSOUT=* //SYSTSPRT DD SYSOUT=*,DCB=(RECFM=F,LRECL=132,BLKSIZE=132) //PIPEIN DD * (SEP ; end ?) <mvs ddname=BARUP ; strfind /0KEY OF RECORD - P / ; specs 20-* 1 ; specs 1-44 1 ; specs 9-44 1 1-8 38 ; pad 45 ; sort unique ; specs 1-36 1 38-45 37 ; specs X000000070000 1 1-* next ; ss: RXDPLP (W2) (C1) * * / notrace retain abend/; specs /1->/ 1 1-* next ; > dd=PIPEOUT coerce ? literal utprogc iyckrah6 ; ss: ; specs /2->/ 1 1-* next ; > dd=PIPEOUT coerce ? ss: ; specs /3->/ 1 1-* next ; > dd=PIPEOUT coerce /* Figure 15: Deletion of BigCommarea Processes via EXCI and MVS Pipes The literal stage controls the flow: UTPROGC is the sample program included in this document and IYCKRAH6 is the Applid of the authors CICS region (which has been configured to accept EXCI activity). Removing Dead Processes from the VSAM Repository file Page 32 of 63 Sample Assembler program for BigCommarea processing Usage To use this sample program, assemble & RDO define it, and associate a CICS TransId with the program. The usage is ttttFnnnnnnnnnnnnnnnnn where: tttt is the four Character CICS TransId for the program F is the function code nnnnnnnnn I -> Initialise, create the BTS Process and Container acting as the BigCommarea page 45 1 -> Read the BigCommarea page 47 2 -> Write to the BigCommarea page 48 3 -> Read and Write the BigCommarea page 49 4 -> Access BigCommmarea via a LINK page 52 A -> Write BigCommarea and Abend page 55 E -> Delete BigCommarea and Exit page 56 is the ProcessName (which should be cut and pasted from the I operation) There is also a code fragment showing BigCommarea deletion via EXCI (page 54) from a Batch job. You must create and RDO define a BTS Repository file (see “VSAM Repository Files” on page 6) and associate it to a RDO PROCESSTYPE of BIGCOMM (see “BTS PROCESSTYPEs” on page 8) before running this program. Sample Assembler program for BigCommarea processing Page 33 of 63 Usage examples These panels show output from the sample program code fragments: The BigCommarea is created by first creating the owning BTS Process and then creating the BTS Process-level Container (page 45) The BigCommarea is read (page 47) The BigCommarea is written to, and the change committed (page 48) Sample Assembler program for BigCommarea processing Page 34 of 63 This shows normal access - the BigCommarea is read and then written, with the new contents hardened (page 49) The BigCommarea is accessed from another level (page 52).... ...and this updating from another level has actually happened Sample Assembler program for BigCommarea processing Page 35 of 63 The BigCommarea contents are lost if the UnitOfWork does not complete (page 55)... ...and this proves it The BigCommarea is deleted at the end of the logical transaction (page 56)... ...so it cannot be accessed any more Sample Assembler program for BigCommarea processing Page 36 of 63 The Code This section contains source of a program which demonstrates usage of this BigCommarea design. You can use the code fragments as a basis for your own processing. It is not supported in any way by IBM. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * TITLE 'UTPROGC - Big Commareas' space 2 =================================================================== = = = UTPROGC - Show how BTS can be used for Big Commareas = = ===================================================== = = = = = = This program contains examples of CICS BTS functions = = that can be used to support usage of Big Commareas. = = = = It is very crude, and should only be used as a = = conceptual example of function required. = = = = By Big Commareas I mean areas that can be passed between = = CICS Application programs (within a CICSPlex) that are = = bigger than 32k. = = = = This function is based on BTS Containers, and these = = last over a UnitOfWork or Transaction boundary. = = = = You will need to configure BTS and understand its API = = and operational characteristics as defined in : = = = = SC24-5268: CICS Business Transaction Services = = = = = = The basic idea is that one: = = = = * Creates a BTS process (without any Events or) = = (activities ) = = = = * Uses this Process to provide an anchor point = = for Containers = = = = * Deletes the Process at the relevant point = = = = = = Initially one creates the process via = = = = = = * XC CREATE PROCESS = = * XC SYNCPOINT = = = = = = The Big Commarea (Container) is created via = = = = * XC ACQUIRE PROCESS = = * XC PUT CONTAINER = = * XC SYNCPOINT = = = = = = The Big Commarea (Container) is accessed via = = = = * XC ACQUIRE PROCESS = = * XC INQUIRE CONTAINER = = * XC GET CONTAINER = = * XC SYNCPOINT = = = = = = Finally, one deletes the process via = = = = * XC CANCEL PROCESS = = * XC SYNCPOINT = = = Sample Assembler program for BigCommarea processing Page 37 of 63 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * = = = = = Register usage = = -------------= = = = R0 -> = = R1 -> = = R2 -> Commarea = = R3 -> = = R4 -> = = R5 -> Routine Linkage = = R6 -> = = R7 -> Data 1 = = R8 -> Base 1 = = R9 -> Base 2 = = R9 -> Base 2 = = R10 -> Parm area = = R11 -> LIFO area = = R12 -> (if needed) TCA = = R13 -> (if needed) CSA = = R14 -> (Main only) Exit address = = R15 -> (Main only) Base, then RC = = = = = = Copyright and Support = = ===================== = = = = This program is not supported by any way by IBM. It is = = distributed only to show techniques for CICS usage. It may = = be freely modified and adapted by your installation. = = = = = = Author: Robert Harris, = = CICS Technical Strategy, = = IBM Hursley Park, = = England. = = = = (C) Copyright IBM UK Limited, 2003. = = = = Licensed Materials - Property of IBM = = US Government Users Restricted Rights - Use, duplication or = = disclosure restricted by GSA ADP Schedule Contract with IBM = = Corp. = = = =================================================================== space 2 eject space 2 * =================================================================== * = = * = Registers = * = = * =================================================================== space 2 R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 space 2 eject Sample Assembler program for BigCommarea processing Page 38 of 63 * * * * * * * * * * space 2 =================================================================== = = = Standard CICS Areas = = = =================================================================== space 2 space 2 eject space 2 =================================================================== = = = Includes = = = =================================================================== space 2 space 2 eject space 2 Sample Assembler program for BigCommarea processing Page 39 of 63 * * * * * =================================================================== = = = Map the LIFO = = = =================================================================== space 2 DFHEISTG DSECT space 2 RESP DS F General Return Code RESP2 DS F Reason ACOMM DS AL4 Address of Commarea LCOMM DS F Length of Commarea STARTBY DS CL2 How Program got going STARTPR DS CL8 Program that called me CURPROG DS CL8 Current Program name space 2 DS 0F INAREAL DS H Area for input processing INAREAF DS F INAREA DS CL80 INPROC DS CL36 Passed in BTS Process Name INPROCT DS CL8 Passed in BTS Process Type space 2 DS 0D TIMED DS D STCK Value space 2 DS 0F PN DS CL36 BTS Process Name ORG PN PN1 DS CL4 Sysid PN2 DS CL1 PN3 DS CL4 Transid PN4 DS CL1 PN5 DS CL8 Task Number PN6 DS CL1 PN7 DS CL16 STCK PN8 DS CL1 ORG space 2 DS 0F INCONL DS F Container Length INCON DS CL200 Data space 2 DS 0F COMM DS XL100 ORG COMM Commarea access COMM1 DS F Action COMM2 DS H Line Count COMM3 DS CL36 Process Name COMM4 DS CL8 Process Type ORG space 2 DS 0F PLINEP DS H Print Lines - Screen Pos PLINEL DS H Length PLINE DS CL80 Data DS 0F Save area SAYSAVE DS F space 2 PH2 DS XL2 Conversion areas DS 0F VALU2TO4 DS XL4 WORK2TO4 DS CL8 PACK2TO4 DS CL16 OUTP2TO4 DS CL4 PH4 DS XL4 DS 0F VALU4TO8 DS XL4 WORK4TO8 DS CL8 PACK4TO8 DS CL16 OUTP4TO8 DS CL8 DS 0F VALU4PO8 DS XL4 WORK4PO8 DS CL8 PACK4PO8 DS CL16 OUTP4PO8 DS CL8 space 1 DS 0D WTOSAVE DS XL64 SAVE1 DS XL64 Save Areas space 1 eject Sample Assembler program for BigCommarea processing Page 40 of 63 space 2 =================================================================== = = = Start of Program CSECT = = = =================================================================== space 2 UTPROGC DFHEIENT CODEREG=(R8,R9),DATAREG=(R7) UTPROGC AMODE 31 space 2 START DS 0H space 2 MVC PLINEP,=H'1' 2nd Line on the Screen MVC INAREA,=CL80' ' Clear Input area MVC INPROC,=CL36' ' No BTS Process name XC INAREAL,INAREAL Clear input lengths XC INAREAF,INAREAF space 2 eject space 2 * * * * * Sample Assembler program for BigCommarea processing Page 41 of 63 * * * * * * * * * * * * * * * * * * * * * * * * ==================================================================== = = = Initial actions = = = = = = Determine whether or not this module was invoked by = = Terminal activity or via a Link. = = = = If it is a terminal transaction, continue by getting = = the input after the TransId and analysing it. = = = = For an XC LINK invocation, look at the 1st word of the = = Commarea to determine the action required: = = = = 5 -> Internal reusage to show function working = = as part of a linked program = = = = 7 -> Use externally via EXCI to delete a given = = Process (which is assumed to have been = = left around and needs to be got rid of) = = = ==================================================================== INIT space DS space EXEC space EXEC space ST LH ST space C BE * INIT0 INIT1 space MVC space CLC BE CLC BE space EXEC space DS space EXEC space LH ST space CLC BL MVC space DS space MVC MVC MVC space BAL space 2 0H 2 CICS ASSIGN STARTCODE(STARTBY) INVOKINGPROG(STARTPR) > PROGRAM(CURPROG) 1 CICS ADDRESS COMMAREA(R2) 1 R2,ACOMM Save Commarea address R15,EIBCALEN Get Commarea Length R15,LCOMM 2 R15,=F'0' Done by a link? INIT0 No - Do Terminal started Yes - determine action 1 COMM,0(R2) and copy it 1 COMM1,=F'5' Internal Link action DOBTS5 COMM1,=F'7' EXCI deletion DOBTS7 1 CICS RETURN 2 0H 2 CICS RECEIVE INTO(INAREA) LENGTH(INAREAL) > MAXLENGTH(80) 1 R14,INAREAL Save Input length R14,INAREAF 1 INAREAF,=F'6' Is there a PN? INIT1 no - skip INPROC,INAREAF+9 yes - save it 1 0H 1 PLINE,=CL80' ' PLINE,=CL80'Input PN XXXXXXXX ****/' PLINE+9(L'INPROC),INPROC 1 R5,SAYNORM 2 Sample Assembler program for BigCommarea processing Page 42 of 63 * * * * * * * * * * * * * * * * * * * * * * * * * * ==================================================================== = = = Check what action is required = = ----------------------------= = = = The Process Name (which is generated by the I function) = = must be passed in after the action code = = = = So, the input is: = = = = tranI Generate PN & set init container = = tran1<<PN>> Read the Container = = tran2<<PN>> Set contents of the Container = = tran3<<PN>> Read & Write the Container = = tran4<<PN>> Read & Write Container via a LINK = = tranA<<PN>> Write Container and Abend = = tranX<<PN>> Delete the Process (inc container) = = = = = = First of all do the I function and then use the screen copy = = facility to Copy the PN. Use Paste to insert this into = = all subsequent usages. = = = ==================================================================== space LA L C BL space CLC BE CLC BE CLC BE CLC BE CLC BE CLC BE CLC BE CLC BE space B space eject space 2 R14,INAREA R15,INAREAF R15,=F'5' EXIT 1 4(1,R14),=CL1'I' DOBTSI 4(1,R14),=CL1'1' DOBTS1 4(1,R14),=CL1'2' DOBTS2 4(1,R14),=CL1'3' DOBTS3 4(1,R14),=CL1'4' DOBTS4 4(1,R14),=CL1'A' DOBTSA 4(1,R14),=CL1'E' DOBTSE 4(1,R14),=CL1'X' DOBTSE 1 EXIT 2 Ensure a request is around after the 4byte TransId Select on Function 2 Sample Assembler program for BigCommarea processing Page 43 of 63 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ==================================================================== = = = Init : Create the Process and setup Container = = ---= = = = One first has to create the BTS Process to which the = = Container is associated. You do not have to bother with = = any of the BTS Event or Activity function as this Process = = will never get run. Consequently, just use the current = = Transaction Name. = = = = The Process Name has to be unique across the SysPlex = = (more properly, the scope of the VSAM file used through = = the ProcessType definition). I have used = = = = SYSID.TransId.TaskNumber.STCK. = = = = for this name which should be unique enough whilst = = providing sufficient info for offline tidying up. = = You might want to change the code to use a readable date. = = The main thing is to ensure that this generated name = = is unique over the scope of the VSAM file. = = = = The ProcessType is the name of the RDO entry (which = = basically indirects to the VSAM file used to hold the = = Container data). This will usually be fixed, so you will = = need to modify the PROCTYPE setting at the bottom of this = = program. = = = = In this program, a fixed BTS Container name is used. You = = can change this, if required, by altering the CONNAME = = field. = = = = After the Process has been defined, the Container = = is generated via a PUT operation. ACQPROCESS is used to = = associate the Container with the current Process (which = = is that which was just defined). = = = = The Container acts as the Big Commarea - I am only using = = a small area to illustrate concepts. The size of the = = Container is not fixed at 1st usage, and is not limited = = by the RECSZ of the associated VSAM file. = = = = Note the SYNCPOINT - BTS depends on this comand to = = commit all its You should not regard the Process as defined = = or the Container around (or hardened) until this is = = done. In a real program, you will have to consider = = where this is done in relation to updates to Recoverable = = CICS resources. = = = ==================================================================== space 2 Sample Assembler program for BigCommarea processing Page 44 of 63 DOBTSI * => * => * => * => * => DS 0H space 2 MVC PLINE,=CL80'Doing Act I (Init)' BAL R5,SAYNORM space 2 Generate an unique process name based on current transid space 2 MVC PN,=CL36' ' STCK TIMED Get Unique Timestamp EXEC CICS ASSIGN SYSID(PN1) Space 1 MVC PN2,=CL1'.' sysid. MVC PN3,EIBTRNID MVC PN4,=CL1'.' tranid. LA R14,EIBTASKN LA R15,PN5 BAL R5,CONV4PO8 taskno. MVC PN6,=CL1'.' LA R14,TIMED LA R15,PN7 BAL R5,CONV4TO8 LA R14,TIMED+4 LA R15,PN7+8 BAL R5,CONV4TO8 time. MVC PN8,=CL1'.' space 1 MVC PLINE,=CL80'PN *******************/' MVC PLINE+3(L'PN),PN BAL R5,SAYNORM MVC PLINE,=CL80'PT ' MVC PLINE+3(L'PROCTYPE),PROCTYPE BAL R5,SAYNORM space 2 Define the BTS Process to use - fixed Processtype space 2 EXEC CICS DEFINE PROCESS(PN) PROCESSTYPE(PROCTYPE) TRANSID(EIBTRNID) RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'DP ' BAL R5,SAYRESP space 2 Put some data into a fixed named container space 2 MVC PLINE,=CL80'Putting into Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 EXEC CICS PUT CONTAINER(CONNAME) ACQPROCESS FROM(DATA1) FLENGTH(=AL4(L'DATA1)) RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'PC ' BAL R5,SAYRESP space 2 Syncpoint to tidy up BTS space 2 MVC PLINE,=CL80'Syncpointing ' BAL R5,SAYNORM space 1 EXEC CICS SYNCPOINT RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'SP ' BAL R5,SAYRESP space 2 Exit Initial function space 2 B EXIT space 2 eject space 2 > > > > > > * Figure 16: Sample Program: Creating the Process and BigCommarea Sample Assembler program for BigCommarea processing Page 45 of 63 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ==================================================================== = = = BTS - 1 : Read the Container = = --------= = = = This action shows what is to be done to read the contents = = of a BTS Container when it is being used to convay Big = = Commarea information. = = = = Reading the Container does not delete it, and so the = = contents can be reread elsewhere. = = = = In order to read the Container, it is best to inquire = = about the length of data before reading it. This is to = = avoid an incorrect length exception (which occurs both = = if the area is too small for the Container and also, = = rather annoyingly, if the area is too big). = = = = This is done via XC GET CONTAINER ACQPROCESS FLENGTH(v) = = with v initially set to zero. On return, you get a Length = = Exception and the real length of the Container set in v. = = = = You should get an area for the received BigCommarea data = = using this length (via XC GETMAIN FLENGTH() ), but this = = has been omitted for clarity. = = = = The Container is associated with a Process (and = = ProcessType) and this has to be associated with the = = current transaction before the Container is accessed. = = This is done with the XC ACQUIRE PROCESS command. = = = = Once the Process has been acquired by the Transaction, = = it (and all its associated Containers) are locked and = = so unavailable for use in another CICS Transaction. = = = = There is no equivalent XC RELEASE PROCESS and so = = this lock lasts until the next XC SYNCPOINT command. = = = = If you wanted to use the Container after the next XC = = SYNCPOINT, you have have to re-acquire it, but that = = could fail if another task intervened and grabbed it. = = = = Consequently, do not design an application which = = falls into this trap. = = = = = ==================================================================== space 2 Sample Assembler program for BigCommarea processing Page 46 of 63 DOBTS1 DS space MVC BAL space MVC MVC BAL MVC MVC BAL space * => Reacquire space EXEC * => * => * => * => 0H 2 PLINE,=CL80'Doing Act 1 (Get)' R5,SAYNORM 1 PLINE,=CL80'PN ****************************************' PLINE+3(L'INPROC),INPROC R5,SAYNORM PLINE,=CL80'PT ' PLINE+3(L'PROCTYPE),PROCTYPE R5,SAYNORM 2 the BTS Process being used 2 CICS ACQUIRE PROCESS(INPROC) > PROCESSTYPE(PROCTYPE) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'AP ' BAL R5,SAYRESP space 2 Get the Container Length space 2 MVC PLINE,=CL80'Getting Leng Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 MVC INCONL,=F'0' XC INCON,INCON space 1 EXEC CICS GET CONTAINER(CONNAME) ACQPROCESS > INTO(INCON) FLENGTH(INCONL) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'GL ' BAL R5,SAYRESP space 2 MVC PLINE,=CL80'LEN ' LA R14,INCONL LA R15,PLINE+5 BAL R5,CONV4TO8 BAL R5,SAYNORM space 2 Get some data from a fixed named container space 2 MVC PLINE,=CL80'Getting from Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 XC INCON,INCON space 1 EXEC CICS GET CONTAINER(CONNAME) ACQPROCESS > INTO(INCON) FLENGTH(INCONL) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'GC ' BAL R5,SAYRESP space 2 MVC PLINE,=CL80'DAT ' MVC PLINE+5(50),INCON BAL R5,SAYNORM space 2 Syncpoint to tidy up BTS space 2 MVC PLINE,=CL80'Syncpointing ' BAL R5,SAYNORM space 1 EXEC CICS SYNCPOINT > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'SP ' BAL R5,SAYRESP space 2 Exit function space 2 B EXIT space 2 eject space 2 Figure 17: Sample Program: Reading the BigCommarea Sample Assembler program for BigCommarea processing Page 47 of 63 * * * * * * * * * * * * * * * * * * * * * * * * * * * * ==================================================================== = = = BTS - 2 : Update Container = = --------= = = = This routine shows how the Container (Big Commarea) is = = updated with new data. = = = = Again, as the Container is associated with a Process = = (and ProcessType), the relevant Process has to be = = Acquired before any further action. = = = = Then, the Container is simply updated (or created) = = by the XC PUT CONTAINER command. The ACQPROCESS option = = is used to say that the Container belongs to the = = currently acquired BTS process. = = = = As before, the data will not actually be hardened into = = the Container until the next XC SYNCPOINT command. = = = = Consequently, use of the XC SYNCPOINT command is vital = = when using BTS Processing to handle Big Commareas - you = = have to be aware of the BTS implications as well as the = = Recoverable resource processing. = = = = = ==================================================================== space DS space MVC BAL space MVC MVC BAL MVC MVC BAL space * => Reacquire space EXEC 2 0H 2 PLINE,=CL80'Doing Act 2 (Put)' R5,SAYNORM 2 PLINE,=CL80'PN ****************************************' PLINE+3(L'INPROC),INPROC R5,SAYNORM PLINE,=CL80'PT ' PLINE+3(L'PROCTYPE),PROCTYPE R5,SAYNORM 2 the BTS Process being used 2 CICS ACQUIRE PROCESS(INPROC) > PROCESSTYPE(PROCTYPE) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'AP ' BAL R5,SAYRESP space 2 * => Put some data into a fixed named container space 2 MVC PLINE,=CL80'Putting into Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 EXEC CICS PUT CONTAINER(CONNAME) ACQPROCESS > FROM(DATA2) FLENGTH(=AL4(L'DATA2)) > RESP(RESP) RESP2(RESP2) DOBTS2 space 1 MVC BAL space * => Syncpoint space MVC BAL space EXEC PLINE,=CL80'PC R5,SAYRESP 2 to tidy up BTS 2 PLINE,=CL80'Syncpointing ' R5,SAYNORM 1 CICS SYNCPOINT RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'SP BAL R5,SAYRESP space 2 * => Exit function space 2 B EXIT space 2 eject space 2 ' > ' Figure 18: Sample Program: Writing the BigCommarea Sample Assembler program for BigCommarea processing Page 48 of 63 * * * * * * * * * * * ==================================================================== = = = BTS - 3 : Get & Put Container in a single go = = --------= = = = This action merely shows that the Container can be = = Read and Written to in the same chunk of function. = = = = = ==================================================================== space DS space MVC BAL space MVC MVC BAL MVC MVC BAL space * => Reacquire space EXEC 2 0H 2 PLINE,=CL80'Doing Act 3 (Get and Put)' R5,SAYNORM 2 PLINE,=CL80'PN ****************************************' PLINE+3(L'INPROC),INPROC R5,SAYNORM PLINE,=CL80'PT ' PLINE+3(L'PROCTYPE),PROCTYPE R5,SAYNORM 2 the BTS Process being used 2 CICS ACQUIRE PROCESS(INPROC) > PROCESSTYPE(PROCTYPE) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'AP ' BAL R5,SAYRESP space 2 * => Get the Container Length space 2 MVC PLINE,=CL80'Getting Leng Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 MVC INCONL,=F'0' XC INCON,INCON space 1 EXEC CICS GET CONTAINER(CONNAME) ACQPROCESS > INTO(INCON) FLENGTH(INCONL) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'GL ' BAL R5,SAYRESP space 2 MVC PLINE,=CL80'LEN ' LA R14,INCONL LA R15,PLINE+5 BAL R5,CONV4TO8 BAL R5,SAYNORM space 2 * => Get some data from a fixed named container space 2 MVC PLINE,=CL80'Getting from Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 XC INCON,INCON space 1 EXEC CICS GET CONTAINER(CONNAME) ACQPROCESS > INTO(INCON) FLENGTH(INCONL) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'GC ' BAL R5,SAYRESP space 2 MVC PLINE,=CL80'DAT ' MVC PLINE+5(50),INCON BAL R5,SAYNORM DOBTS3 Figure 19: Sample Program: Reading and Writing the BigCommarea Sample Assembler program for BigCommarea processing Page 49 of 63 space 2 * => Put some data into a fixed named container space 2 MVC PLINE,=CL80'Putting into Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 EXEC CICS PUT CONTAINER(CONNAME) ACQPROCESS FROM(DATA3) FLENGTH(=AL4(L'DATA3)) RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'PC ' BAL R5,SAYRESP space 2 * => Syncpoint to tidy up BTS space 2 MVC PLINE,=CL80'Syncpointing ' BAL R5,SAYNORM space 1 EXEC CICS SYNCPOINT RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'SP ' BAL R5,SAYRESP space 2 * => Exit function space 2 B EXIT space 2 eject space 2 * > > > Sample Assembler program for BigCommarea processing Page 50 of 63 * * * * * * * * * * * * * * * * * ==================================================================== = = = BTS - 4 : Get & Put Container via a link = = --------= = = = BTS activity for Big Commarea processing will usually = = proceed via an XC LINK to anoher program. This action = = merely shows that this is supported. = = = = = = The only thing to note is that the Process is Acquired = = in this (higher level) code, so the details of it do = = not need to be passed in the Commarea (as the same Unit = = Of Work is active). = = = ==================================================================== space DS space MVC BAL space MVC MVC BAL MVC MVC BAL space * => Reacquire space EXEC 2 0H 2 PLINE,=CL80'Doing Act 4 (Create Link)' R5,SAYNORM 2 PLINE,=CL80'PN ****************************************' PLINE+3(L'INPROC),INPROC R5,SAYNORM PLINE,=CL80'PT ' PLINE+3(L'PROCTYPE),PROCTYPE R5,SAYNORM 2 the BTS Process being used 2 CICS ACQUIRE PROCESS(INPROC) > PROCESSTYPE(PROCTYPE) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'AP ' BAL R5,SAYRESP space 2 MVC COMM1,=F'5' Set New Function MVC COMM2,PLINEP Set Line Position MVC COMM3,INPROC Set Process Name space 1 EXEC CICS LINK PROGRAM(CURPROG) > COMMAREA(COMM) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINEP,COMM2 Update Line Number space 1 MVC PLINE,=CL80'LK ' BAL R5,SAYRESP space 2 * => Exit function space 2 B EXIT space 2 eject space 2 DOBTS4 Sample Assembler program for BigCommarea processing Page 51 of 63 * * * * * * * * * * * * * * * * ==================================================================== = = = BTS - 5 : Link function for updating a container = = --------= = = = This action merely shows how the BTS Big Commarea = = function works for an XC LINKed program. = = = = As an earlier function/module/transaction will have = = created the Process (or have Acquired it) you do not = = need details of the Process to be passed into this code = = through the Commarea (but I have done it anyway!). = = = ==================================================================== space 2 DS 0H space 2 MVC PLINEP,COMM2 Zap Line Number MVC INPROC,COMM3 Get PN from Commarea space 2 MVC PLINE,=CL80'Doing Act 5 (do link)' BAL R5,SAYNORM space 2 space 2 MVC PLINE,=CL80'PN ****************************************' MVC PLINE+3(L'INPROC),INPROC BAL R5,SAYNORM MVC PLINE,=CL80'PT ' MVC PLINE+3(L'PROCTYPE),PROCTYPE BAL R5,SAYNORM space 2 * => Process already acive for the UnitOfWork space 2 space 2 * => Get the Container Length space 2 MVC PLINE,=CL80'Getting Leng Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 MVC INCONL,=F'0' XC INCON,INCON space 1 EXEC CICS GET CONTAINER(CONNAME) ACQPROCESS > INTO(INCON) FLENGTH(INCONL) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'GL ' BAL R5,SAYRESP space 2 MVC PLINE,=CL80'LEN ' LA R14,INCONL LA R15,PLINE+5 BAL R5,CONV4TO8 BAL R5,SAYNORM space 2 DOBTS5 Figure 20: Sample Program: BigCommarea Usage via a Link Sample Assembler program for BigCommarea processing Page 52 of 63 * => Get some data from a fixed named container space 2 MVC PLINE,=CL80'Getting from Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 XC INCON,INCON space 1 EXEC CICS GET CONTAINER(CONNAME) ACQPROCESS INTO(INCON) FLENGTH(INCONL) RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'GC ' BAL R5,SAYRESP space 2 MVC PLINE,=CL80'DAT ' MVC PLINE+5(50),INCON BAL R5,SAYNORM space 2 * => Put some data into a fixed named container space 2 MVC PLINE,=CL80'Putting into Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 EXEC CICS PUT CONTAINER(CONNAME) ACQPROCESS FROM(DATA5) FLENGTH(=AL4(L'DATA5)) RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'PC ' BAL R5,SAYRESP space 2 * => Syncpoint to tidy up BTS space 2 MVC PLINE,=CL80'Syncpointing ' BAL R5,SAYNORM space 1 EXEC CICS SYNCPOINT RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'SP ' BAL R5,SAYRESP space 2 * => Exit function space 2 MVC PLINE,=CL80'End of Linking ' BAL R5,SAYNORM space 1 L R2,ACOMM Address the Commarea MVC COMM1,=F'4' Update Function MVC COMM2,PLINEP Update Line Number MVC 0(L'COMM,R2),COMM Update the Commarea space 2 EXEC CICS RETURN space 2 B EXIT space 2 eject space 2 > > > > > Sample Assembler program for BigCommarea processing Page 53 of 63 * * * * * * * * * * * * * * * * * ==================================================================== = = = BTS - 7 : EXCI Deletion = = --------= = = = This routine shows what is needed to be done to remove = = from the BTS VSAM Repository file a BigCommarea process = = that has been left hanging (as a result of an Abend = = not properly cleaning things up). = = = = The relevant ProcessType (fixed in the rest of this = = example) and ProcessName are taken from the Commarea, the = = dangling Process Reacquired and then Cancelled. = = = ==================================================================== space DS space MVC MVC space * => Reacquire space EXEC 2 0H 2 INPROC,COMM3 Get PN from Commarea INPROCT,COMM4 Get PT from Commarea 2 the BTS Process being used 2 CICS ACQUIRE PROCESS(INPROC) PROCESSTYPE(INPROCT) RESP(RESP) RESP2(RESP2) space 2 * => Cancel this current process space 2 EXEC CICS CANCEL ACQPROCESS RESP(RESP) RESP2(RESP2) space 2 * => Syncpoint to tidy up BTS space 2 EXEC CICS SYNCPOINT RESP(RESP) RESP2(RESP2) space 2 * => Exit function space 2 EXEC CICS RETURN space 2 eject space 2 DOBTS7 > > > > Figure 21: Sample Program: BigCommarea Deletion via EXCI Sample Assembler program for BigCommarea processing Page 54 of 63 * * * * * * * * * * * * * * ==================================================================== = = = BTS - A : Update Container and Rollback = = --------= = = = This routine updates the Container (Big Commarea) and then = = does an XC SYNCPOINT ROLLBACK to show that this update is = = lost when the UnitOfWork fails (as occurs on an Abend). = = = = Use Action 1 to confirm that the update has not happened! = = = ==================================================================== space DS space MVC BAL space MVC MVC BAL MVC MVC BAL space * => Reacquire space EXEC 2 0H 2 PLINE,=CL80'Doing Act A (Put and Rollback)' R5,SAYNORM 2 PLINE,=CL80'PN ****************************************' PLINE+3(L'INPROC),INPROC R5,SAYNORM PLINE,=CL80'PT ' PLINE+3(L'PROCTYPE),PROCTYPE R5,SAYNORM 2 the BTS Process being used 2 CICS ACQUIRE PROCESS(INPROC) > PROCESSTYPE(PROCTYPE) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'AP ' BAL R5,SAYRESP space 2 * => Put some data into a fixed named container space 2 MVC PLINE,=CL80'Putting into Container *' MVC PLINE+23(L'CONNAME),CONNAME BAL R5,SAYNORM space 1 EXEC CICS PUT CONTAINER(CONNAME) ACQPROCESS > FROM(DATAA) FLENGTH(=AL4(L'DATAA)) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'PC ' BAL R5,SAYRESP space 2 * => Rollback to leave the Container unaltered space 2 MVC PLINE,=CL80'Rolling Back ' BAL R5,SAYNORM space 1 EXEC CICS SYNCPOINT ROLLBACK > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'RB ' BAL R5,SAYRESP space 2 * => Exit function space 2 B EXIT space 2 eject space 2 DOBTSA Figure 22: Sample Program: BigCommarea behavour on a failure Sample Assembler program for BigCommarea processing Page 55 of 63 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ==================================================================== = = = BTS - E : Exit = = --------= = = = End of function = = = = This routine shows what is needed to remove the = = Process and assocaited Containers. If this XC CANCEL = = PROCESS is not executed, then the Process and = = any relevant Containers will be left in the VSAM file = = forever. = = = = So, ensure that you include Abend Handlers in production = = code to tidy things up. = = = = Orphaned processes will eventually cause the VSAM file = = to be filled up. Which means that some manual operation = = will have to be done to remove these records. The key = = used for the Process Name will help in this operation = = (which is why I have used the SYSID and a Timestamp = = as the Process Name). = = = = If the VSAM file for the Process is not shared between = = CICS regions, then you can merely delete everything = = in it (or delete and recreate) as part of COLD = = startup processing. = = = = A Shared VSAM file (for Big Commarea being used to = = pass information betweenm CICS regions) will be more of = = a problem to offline tidyup, as the file will have to be = = unused in all regions. = = = ==================================================================== space 2 DOBTSE DS 0H space 2 MVC PLINE,=CL80'Doing Act E (Exit)' BAL R5,SAYNORM space 2 MVC PLINE,=CL80'PN ****************************************' MVC PLINE+3(L'INPROC),INPROC BAL R5,SAYNORM MVC PLINE,=CL80'PT ' MVC PLINE+3(L'PROCTYPE),PROCTYPE BAL R5,SAYNORM space 2 * => Reacquire the BTS Process being used space 2 EXEC CICS ACQUIRE PROCESS(INPROC) > PROCESSTYPE(PROCTYPE) > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'AP ' BAL R5,SAYRESP space 2 * => Cancel this current process space 2 MVC PLINE,=CL80'Cancelling the process *' BAL R5,SAYNORM space 1 EXEC CICS CANCEL ACQPROCESS > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'CP ' BAL R5,SAYRESP space 2 * => Syncpoint to tidy up BTS space 2 MVC PLINE,=CL80'Syncpointing ' BAL R5,SAYNORM space 1 EXEC CICS SYNCPOINT > RESP(RESP) RESP2(RESP2) space 1 MVC PLINE,=CL80'SP ' BAL R5,SAYRESP space 2 * => Exit function space 2 B EXIT Figure 23: Sample Program: BigCommarea Exit processing Sample Assembler program for BigCommarea processing Page 56 of 63 space 2 eject space 2 * =================================================================== * = = * = End of program = * = = * =================================================================== space 2 space 2 EXIT DS 0H space 2 MVC PLINEL,=H'80' MVC PLINE,=CL80' ' MVC PLINE,=CL80'*** Exit *** ' BAL R5,SAYNORM space 2 EXEC CICS SEND PAGE space 2 EXEC CICS RETURN space 2 eject space 2 * Sample Assembler program for BigCommarea processing Page 57 of 63 * * * * * * * * * ==================================================================== = = = Build a WTO for an ordinary text line = = ------------------------------------= = = = Linked on R5 = = = ==================================================================== SAYNORM * SN1 * * * * * * * * * * space DS space ST space LH LA STH space STM WTO EXEC LM space CLC BNH EXEC space MVC space DS space L BR space 2 0H 1 R5,SAYSAVE 1 R15,PLINEP R15,1(,R15) R15,PLINEP 1 R0,R15,WTOSAVE TEXT=PLINEL CICS SEND TEXT ACCUM JUSTIFY(PLINEP) FROM(PLINE) LENGTH(79) R0,R15,WTOSAVE 2 PLINEP,=H'24' SN1 CICS SEND PAGE 1 PLINEP,=H'1' 1 0H 2 R5,SAYSAVE R5 2 > ==================================================================== = = = Build a WTO for Reason & Response Codes = = --------------------------------------= = = = Linked on R5 = = = ==================================================================== SAYRESP * SR1 space DS space ST space LH LA STH space LA LA BAL space LA LA BAL space STM WTO EXEC CLC BNH EXEC space MVC space DS space LM space L BR space 2 0H 1 R5,SAYSAVE 1 R15,PLINEP R15,1(,R15) R15,PLINEP 1 R14,RESP R15,PLINE+5 R5,CONV4TO8 1 R14,RESP2 R15,PLINE+20 R5,CONV4TO8 2 R0,R15,WTOSAVE TEXT=PLINEL CICS SEND TEXT ACCUM JUSTIFY(PLINEP) FROM(PLINE) LENGTH(79) PLINEP,=H'24' SR1 CICS SEND PAGE 1 PLINEP,=H'1' 1 0H 2 R0,R15,WTOSAVE 2 R5,SAYSAVE R5 2 > Page 58 of 63 * * * * * * * * * * * * * * * * * ==================================================================== = = = Conversion Subroutines = = ---------------------= = = = These are general conversion routines. They are all linked = = on R5 and use SAVE1 as their savearea = = = = R14-> Input R15->Output = = = = CONV1TO2 = XL1 -> CL2 = = CONV2TO4 = XL2 -> CL4 = = CONV4TO8 = XL4 -> CL8 = = CONV4PO8 = PL4 -> CL8 = = = ==================================================================== space 2 * * =====> Convert XL1->CL2 (R14->XL1, R15->CL2) * space 2 CONV1TO2 DS 0H space 2 STM R0,R15,SAVE1 Save regs space 1 XC VALU2TO4,VALU2TO4 Clear XL4 MVC VALU2TO4+3(1),0(R14) Get Input XL2 space 1 MVC OUTP2TO4,=CL4'00000000' Clear return area space 1 XR R14,R14 Clear Work Reg IC R14,VALU2TO4+3 Load Source Byte N R14,=XL4'000000F0' Set the Nibble SRA R14,4 000000x0 -> 0000000x LA R15,=CL16'0123456789ABCDEF' Address Pattern AR R15,R14 Point to Printable char MVC OUTP2TO4+0(1),0(R15) Save the Printable char space 1 XR R14,R14 IC R14,VALU2TO4+3 ..x. N R14,=XL4'0000000F' .x LA R15,=CL16'0123456789ABCDEF' AR R15,R14 MVC OUTP2TO4+1(1),0(R15) x... space 1 LM R0,R15,SAVE1 Restore regs MVC 0(2,R15),OUTP2TO4 Copy Converted CL4 space 1 BR R5 Return space 2 Sample Assembler program for BigCommarea processing Page 59 of 63 * * =====> Convert XL2->CL4 (R14->XL2, R15->CL4) * space 2 CONV2TO4 DS 0H space 2 STM R0,R15,SAVE1 Save regs space 1 XC VALU2TO4,VALU2TO4 Clear XL4 MVC VALU2TO4+2(2),0(R14) Get Input XL2 space 1 MVC OUTP2TO4,=CL4'00000000' Clear return area space 1 XR R14,R14 Clear Work Reg IC R14,VALU2TO4+2 Load Source Byte N R14,=XL4'000000F0' Set the Nibble SRA R14,4 000000x0 -> 0000000x LA R15,=CL16'0123456789ABCDEF' Address Pattern AR R15,R14 Point to Printable char MVC OUTP2TO4+0(1),0(R15) Save the Printable char space 1 XR R14,R14 IC R14,VALU2TO4+2 ..x. N R14,=XL4'0000000F' .x LA R15,=CL16'0123456789ABCDEF' AR R15,R14 MVC OUTP2TO4+1(1),0(R15) x... space 1 XR R14,R14 IC R14,VALU2TO4+3 N R14,=XL4'000000F0' ..x. SRA R14,4 000000x0 -> 0000000x LA R15,=CL16'0123456789ABCDEF' x. AR R15,R14 MVC OUTP2TO4+2(1),0(R15) ..x. space 1 XR R14,R14 IC R14,VALU2TO4+3 ...x N R14,=XL4'0000000F' .x LA R15,=CL16'0123456789ABCDEF' AR R15,R14 MVC OUTP2TO4+3(1),0(R15) ...x space 1 LM R0,R15,SAVE1 Restore regs MVC 0(4,R15),OUTP2TO4 Copy Converted CL4 space 1 BR R5 Return space 2 Sample Assembler program for BigCommarea processing Page 60 of 63 * * =====> Convert XL4->CL8 (R14->XL4, R15->CL8) * space 2 CONV4TO8 DS 0H space 2 STM R0,R15,SAVE1 Save regs space 1 MVC VALU4TO8,0(R14) Get Input XL4 space 1 MVC OUTP4TO8,=CL8'00000000' Clear return area space 1 XR R14,R14 Clear Work Reg IC R14,VALU4TO8+0 Load Source Byte N R14,=XL4'000000F0' Set the Nibble SRA R14,4 000000x0 -> 0000000x LA R15,=CL16'0123456789ABCDEF' Address Pattern AR R15,R14 Point to Printable char MVC OUTP4TO8+0(1),0(R15) Save the Printable char space 1 XR R14,R14 IC R14,VALU4TO8+0 x... N R14,=XL4'0000000F' .x LA R15,=CL16'0123456789ABCDEF' AR R15,R14 MVC OUTP4TO8+1(1),0(R15) .x...... space 1 XR R14,R14 IC R14,VALU4TO8+1 N R14,=XL4'000000F0' .x.. SRA R14,4 000000x0 -> 0000000x LA R15,=CL16'0123456789ABCDEF' x. AR R15,R14 MVC OUTP4TO8+2(1),0(R15) ..x..... space 1 XR R14,R14 IC R14,VALU4TO8+1 .x.. N R14,=XL4'0000000F' .x LA R15,=CL16'0123456789ABCDEF' AR R15,R14 MVC OUTP4TO8+3(1),0(R15) ...x.... space 1 XR R14,R14 IC R14,VALU4TO8+2 N R14,=XL4'000000F0' ..x. SRA R14,4 000000x0 -> 0000000x LA R15,=CL16'0123456789ABCDEF' x. AR R15,R14 MVC OUTP4TO8+4(1),0(R15) ....x... space 1 XR R14,R14 IC R14,VALU4TO8+2 ..x. N R14,=XL4'0000000F' .x LA R15,=CL16'0123456789ABCDEF' AR R15,R14 MVC OUTP4TO8+5(1),0(R15) .....x.. space 1 XR R14,R14 IC R14,VALU4TO8+3 N R14,=XL4'000000F0' ...x SRA R14,4 000000x0 -> 0000000x LA R15,=CL16'0123456789ABCDEF' x. AR R15,R14 MVC OUTP4TO8+6(1),0(R15) ......x. space 1 XR R14,R14 IC R14,VALU4TO8+3 ...x N R14,=XL4'0000000F' .x LA R15,=CL16'0123456789ABCDEF' AR R15,R14 MVC OUTP4TO8+7(1),0(R15) .......x space 1 LM R0,R15,SAVE1 Restore regs MVC 0(8,R15),OUTP4TO8 Copy Converted CL8 BR R5 Return space 2 eject Sample Assembler program for BigCommarea processing Page 61 of 63 * * =====> Convert PL4->CL8 (R14->PL4, R15->CL8) * space 2 CONV4PO8 DS 0H space 2 STM R0,R15,SAVE1 Save regs space 1 MVC VALU4PO8,0(R14) Get Input PL4 space 1 MVC OUTP4PO8,=CL8'00000000' Clear return area space 1 ZAP WORK4PO8,VALU4PO8 Save as PL8 UNPK PACK4PO8,WORK4PO8 Put into Character format OC PACK4PO8,=CL16'0000000000000000' Make Readable MVC OUTP4PO8,PACK4PO8+8 Set Return Value space 1 LM R0,R15,SAVE1 Restore regs MVC 0(8,R15),OUTP4PO8 Copy Converted CL8 BR R5 Return space 2 eject space 2 * =================================================================== * = = * = Constants and Literals = * = = * = PROCTYPE is the name of the BTS RDO entry (which basically = * = indirects to a VSAM file name used to hold the = * = Container data) = * = = * = Change this definition as required. = * = = * = CONNAME is the Container name used by this program: this = * = does not have any external dependencies. = * = = * = = * = = * =================================================================== space 2 PROCTYPE DC CL8'BIGCOMM ' BTS Process Type CONNAME DC CL16'COMMAREA ' BTS Fixed Container Name space 2 DATA1 DC CL8'11111111' Data for Action 1 DATA2 DC CL8'22222222' Data for Action 2 DATA3 DC CL8'33333333' Data for Action 3 DATA4 DC CL8'44444444' Data for Action 4 DATA5 DC CL8'55555555' Data for Action 5 DATAA DC CL8'AAAAAAAA' Data for Action A space 2 LTORG space 2 * =================================================================== * = = * = End of processing = * = = * =================================================================== space 2 eject space 2 * =================================================================== * = = * = End of UTPROGC program = * = = * =================================================================== space 2 END space 2 Sample Assembler program for BigCommarea processing Page 62 of 63 >>>>>>>>>>>>>>>END of document<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Page 63 of 63
© Copyright 2024