Great information Frank. Excellent, thanks. On Sat, Oct 13, 2012 at 11:11 AM, Frank Swarbrick <frank.swarbr...@yahoo.com> wrote: > What is CTRCOBMOD? > > If you do a COBOL static call, or even a COBOL dynamic call, you are for the > most part not using CICS services to invoke your routine. For static I don't > think CICS knows or cares at all. For a dynamic call I think a CICS service > is invoked by the COBOL/LE runtime to load the module, but from there its > basically COBOL. > > If you have no CICS commands inside the called module you don't have to do > anything special with the called module. You compile it just as a "batch" > COBOL program. (You still don't want to use things that directly invoke MVS > services, though, such as COBOL I/O, etc.) > > If you have CICS commands you have a couple options. Others will probably > tell you about the way that I do not prefer. What I prefer is the following: > > Place the following at the top of the called modules source code: > PROCESS CICS('NOLINKAGE') > (This assumes you're using the COBOL/CICS integrated preprocessor; if you > still use the CICS translator then specify the NOLINKAGE translator option in > the appropriate manner.) > > By doing this, the CICS translator/preprocessor will not add the implicit > DFHEIBLK and DFHCOMMAREA fields to the COBOL LINKAGE SECTION and PROCEDURE > DIVISION USING. This allows you to do a COBOL CALL to the routine just like > you would in a batch program, i.e.: > > CALL 'MYSUBR' USING PARM-1, PARM-2, PARM-3. > > In your example below you could just do: > CALL 'PROGRAM1' USING WS-COMMAREA > > Your called routine, if executing a CICS command, still needs to have the > DFHEIBLK area; you just have to add it explicitly. Add the following to your > LINKAGE SECTION: > > COPY DFHEIBLC. > > Then add the following to the beginning of your PROCEDURE DIVISION: > exec cics address > eib (address of dfheiblk) > end-exec > > You now have DFHEIBLK addressability without requiring it to be passed as a > parameter from your calling program. > > For the most part your called program can stay the same. You must eliminate > any "EXEC CICS RETURN" statements, though, and replace them with a COBOL > GOBACK. If you do EXEC CICS RETURN it behaves as if the calling program > executed it, and most likely will not be what you want (which is to go back > to the caller, not to return to CICS). This is because to CICS your calling > program and your called program ARE THE SAME PROGRAM. With EXEC CICS LINK > you go "up a level", and a RETURN goes back down. With COBOL CALL you do not > go up a level, so if you do RETURN you still go back a level, which is > probably back to CICS (unless your caller was LINKed to...) > > Anyway, once you get a few things straight there's not much to it. > I'm sure that a static call gives the best performance. > I believe a dynamic call is still "better" than a LINK because when you do a > LINK you enter and initialize a new LE enclave each time. > > Which brings up another caveat. If you do a CALL to the same program from > the same program multiple times within a task it behaves exactly as how this > behaves in batch. That is, your WORKING STORAGE section is initialized only > upon the first call. This is different than CICS LINK where you get "fresh" > working-storage each time. This can actually be quite an advantage, but you > have to make sure that your program that your currently LINKing to doesn't > depend on it. If it does, there are a couple of things you can do: > - Use the AS INITIAL clause of the COBOL PROGRAM-ID statement. > - Do a COBOL CANCEL after each COBOL CALL (I don't recommend this, and I > don't think it even works if you do a static call). > - Place any variables that you need initialized each time your program is > called in LOCAL-STORAGE SECTION rather than WORKING-STORAGE SECTION. (You > could just put all of your variables in LOCAL STORAGE, but I imagine this > would have unwanted overhead.) > - Leave everything in WORKING-STORAGE and add PROCEDURE DIVISION statements > to explicitly initialize any fields that require it. > > I would guess that options 3 (LOCAL STORAGE) or 4 (explicit initialization) > would give you the best performance. > > Have I forgotten anything? Possibly. > > Have fun! > > Frank > > > > > >>________________________________ >> From: John Weber <j...@fiteq.com> >>To: IBM-MAIN@LISTSERV.UA.EDU >>Sent: Friday, October 12, 2012 5:21 PM >>Subject: COBOL Compiler Question >> >>We have a COBOL CICS module being called using the LINK command. >> >>Here is the interface call: >> >>EXEC CICS >> LINK PROGRAM('PROGRAM1') >> RESP(WS-RESP) >> COMMAREA(WS-COMMAREA) >>END-EXEC >> >>However, it has been brought up that creating a bound module instead of >>using LINK can speed up response time. >> >>Is this binding compiler in question CTRCOBMOD? If so, is this worth >>pursuing? >> >>Thanks a lot... >> >>John >> >>---------------------------------------------------------------------- >>For IBM-MAIN subscribe / signoff / archive access instructions, >>send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN >> >> >> > > ---------------------------------------------------------------------- > For IBM-MAIN subscribe / signoff / archive access instructions, > send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN
-- Wayne V. Bickerdike ---------------------------------------------------------------------- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN