//MARKASM JOB (0),'MDWAIT',CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1) //ASM EXEC PGM=IFOX00, // PARM='DECK,LOAD,TERM,TEST,SYSPARM((NOSP,NODEBUG)),XREF(SHORT)', // REGION=4096K,COND=(0,NE) //SYSLIB DD DISP=SHR,DSN=SYS1.MACLIB // DD DISP=SHR,DSN=SYS1.AMODGEN //SYSUT1 DD SPACE=(CYL,(25,5)),UNIT=3350 //SYSUT2 DD SPACE=(CYL,(25,5)),UNIT=3350 //SYSUT3 DD SPACE=(CYL,(25,5)),UNIT=3350 //SYSTERM DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSIN DD DATA,DLM=ZZ * ------------------------------------------------------------------- * * MDWAIT: * * Purpose: to wait until a job has finished running, then exit. * It will check every 60 seconds to see if the job it is * waiting on has completed. * This is for my batch processing where I have some backup * jobs that are automatically generated and submitted to * the INTRDR, the job submitting them would then release a * dataset compress job; sometimes the compress would start * first (which is bad). * Now when jobs are submitted in the background the next * batch job my scheduled jobs release is a job to wait for * the background job to complete (using this), and my * nicely ordered batch stream runs in order again. * * Useage: * //STEPA EXEC PGM=MDWAIT,PARM='JOBNAME' * The PARM= should contain the name of the batch job or * STC you want to wait on until the job completes. * * ------------------------------------------------------------------- MDWAIT CSECT STM R14,R12,12(13) BALR R12,R0 USING *,R12 LA R15,SAVEAREA ST R15,8(R13) ST R13,4(R15) LR R13,R15 * * ---- ENSURE WE HAVE A PARM, SAVE PARMLEN AS THE JOBNAME L R1,0(,R1) POINT TO PARM LH R0,0(,R1) GET LENGTH OF PARM LTR R0,R0 IF ZERO THEN NO PARM BNZ SAVEPARM WTO 'MID0081E NO JOBNAME TO WAIT ON PROVIDED, ABEND U0100' ABEND 100 * SAVEPARM LA R1,2(,R1) ADDRESS PARM DATA LR R7,R0 MOVE LEN TO R7 (R0 TRASHED IN EX) EX R7,SAVEJNAM SAVE FOR LEN R0 (NOW PARMLEN IN R7) * SEEMS TO ADD A TRAILING NULL ?, TEST AND CLEAR IF SO LA R7,JOBNAME AR R7,R0 NOTE: MAY TRASH EX IF JNAME WAS * EIGHT BYTES, OK AS DONE WITH IT * SHOULDNT AS EX WILL NOT BE NULL CLI 0(R7),0 BNE SKIPNUL MVI 0(R7),C' ' SKIPNUL CNOP 0,4 BAL R4,GETJOBID * * RECORD WHAT WE ARE WAITING ON MVC WTO1+17(8),MYJNAME MVC WTO1+42(8),JOBNAME WTO1 WTO 'MID0082I JJJJJJJJ: WAITING ON JOB ________ (CHECK INTVLX =1MIN)' STIMER WAIT,,DINTVL=SECS60 * * WE SLEEP 60 SECS (ABOVE), CHECK FOR THE JOB (BELOW), AND IF IT IS * STILL RUNNING WE LOOP BACK TO THE WTO AND WAIT AGAIN. * IF THE JOB WE ARE WAITING ON IS NO LONGER RUNNING WE EXIT. LA R3,0 USING PSA,R3 PSA--->CVT L R4,FLCCVT USING CVTMAP,R4 CVT--->ASVT L R7,CVTASVT USING ASVT,R7 ASVT--->ASCB XR R8,R8 ZERO NEXTASID DS 0H L R5,ASVTENTY(R8) AN ASID USING ASCB,R5 CLM R5,B'1000',=X'80' IS HIGH BIT ON ? BNE INUSE NO, VALID CLM R5,B'0111',=XL3'0' END OF TABLE ? BE ENDASVT ALL OVER RENTR DS 0H LA R8,4(R8) INCREMENT ASVTENTY ENTRY B NEXTASID INUSE DS 0H L R6,ASCBJBNI JOBNAME IF INITIATOR LTR R6,R6 BNZ TESTIT L R6,ASCBJBNS JOBNAME IF STC, ETC * THE CONTROL BLOCK ENTRY IS TRAILINg SPACE PADDED SO WE CAN * COMPARE FOR A FULL 8 BYTES (TO AVOID POSSIBLE FALSE MATCHES * ON SHORT JOB NAMES) TESTIT CLC JOBNAME(8),0(R6) IS THIS THE JOB ? BE WTO1 YES, GO BACK AND WAIT B RENTR NO, KEEP LOOKING, GET NEXT * * END OF ASVT TABLE, THE TASK IS NOT RUNNING, WE CAN EXIT ENDASVT B EXIT * * NORMAL EXIT BLOCK EXIT CNOP 0,4 MVC WTO2+17(8),MYJNAME MVC WTO2+48(8),JOBNAME WTO2 WTO 'MID0083I JJJJJJJJ: WAIT COMPLETE ON JOB ________' L R13,4(R13) LM R14,R12,12(R13) SLR R15,R15 BR R14 EJECT DS 0F * GET THE JOBNAME OF THIS BATCH JOB, USE IN WTO MESSAGES GETJOBID LA R5,16 ADDR OF CVT POINTER L R6,0(R5) ADDR OF CVT L R5,0(R6) ADDR OF TCBS L R6,4(R5) ADDR OF 2ND TCB L R5,180(R6) ADDR OF JSCB L R6,260(R5) ADDR OF JCT PREFIX LA R6,24(R6) ADDR OF JOBNAME IN JCT MVC MYJNAME(8),0(R6) STORE THE JOBNAME BR R4 EJECT SAVEAREA DS 18F SAVEAREA FOR MAIN PROGRAM JOBNAME DC CL8' ' THE JOBNAME WE WILL WAIT FOR MYJNAME DC CL8' ' THE JOBNAME WE WILL WAIT FOR SAVEJNAM MVC JOBNAME(0),0(R1) EX COMMAND TO SAVE JOBNAME PARM SECS60 DC CL8'00006000' SIXTY SECONDS, FOR STIMER LTORG IHAPSA CVT DSECT=YES IHAASVT * ASVT MAP IHAASCB * * REGISTER EQUATES 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 END ZZ //SYSPUNCH DD SYSOUT=* //SYSGO DD DISP=(MOD,PASS,DELETE),UNIT=SYSDA, // DSN=&&OBJLIB,SPACE=(TRK,(2,2)) //LKED1 EXEC PGM=IEWL, // PARM='XREF,LIST,LET,TEST,AC=0', // REGION=1024K,COND=(0,NE) //SYSLMOD DD DSN=SYS9.LINKLIB(MDWAIT), // DISP=SHR //SYSLIN DD DSN=&&OBJLIB,DISP=(OLD,PASS,DELETE) //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(8,1)) //SYSPRINT DD SYSOUT=* //LKED2 EXEC PGM=IEWL, // PARM='XREF,LIST,LET,TEST,AC=0', // REGION=1024K,COND=(0,NE) //SYSLMOD DD DSN=SYS9.LINKLIB,DISP=SHR //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(8,1)) //SYSPRINT DD SYSOUT=* //SYSLIN DD * INCLUDE SYSLMOD(MDWAIT) ENTRY MDWAIT NAME MDWAIT(R) /* //