$JOB MARK EXAMPLES 1200 $! $! ON ERROR CONTINUE $! $! $! THIS BATCH JOB DEMONSTRATES THE USE OF SOME TCS MACROS VIA $! A FORTRAN INTERFACE. THE EXAMPLES ARE COMPLETELY ARTIFICIAL, $! THEIR ONLY GOAL BEING TO SHOW AS MANY MACROS AS POSSIBLE IN AS $! SHORT SPACE AS POSSIBLE. THE JOB HAS TWO SEPARATE EXAMPLES: $! 1. SUBTASKING $! 2. CHAINING AND SENDING/RECEIVING. $! $! THIS BATCH STREAM WAS ALLOCATED USING: $! SCI> ALLOCATE TERMINAL/RUN/BATCH/MAX:3 BA0 PDS $! $! USER 'MARK' HAS A UPF ENTRY CONTAINING (INTER ALIA): $! TP1 = 6 $! TP2 = 177777 $! MTS = 3 $! $! FIRST ASSEMBLE SUBTASK $MACRO/OBJ:LB:[1,1]SUBTASK SUBTASK $! $! S U B T A S K I N G $! - - - - - - - - - - $! $! IN THIS EXAMPLE, 'EXAMPLE1' INITIATES A SUBTASK CALLED $! 'SUBTASK1', WHICH FIRST SUSPENDS ITSELF THEN WAITS FOR $! EVENT FLAG #1 THEN EXITS. 'EXAMPLE1' DETECTS THE SUSPENSION, $! RESUMES 'SUBTASK1' AND SETS ITS EVENT FLAG #1. IT THEN WAITS $! FOR THE EXIT FLAG. $! $! FIRST COMPILE AND BUILD THE TASKS $! $CREATE EXAMPLE1.FTN C E X A M P L E 1 C - - - - - - - - BYTE BUFF(10) DATA BUFF/1H ,1HS,1HU,1HB,1HT,1HA,1HS,1HK,1H1,0/ C DEFINE AND DECALRE TDB NTDB=1 CALL DECTDB(NTDB) C INITIATE SUBTASK AND WAIT FOR SUBTASK EVENT WRITE(5,50) CALL RUNTS(BUFF,NTDB,1,,WAIT) C GET THE EVENT... CALL RDEVTS(ISTAT,NTDB) C SUSPENDED? IF (.NOT.ISTAT.AND.8) GOTO 1000 WRITE(5,100) C RESUME THE SUBTASK CALL RSUMTS(NTDB) C SET ITS EVENT FLAG #1 CALL STEVTS(1,NTDB) C WAIT FOR SUBTASK EVENT CALL CHKEVW(NTDB) C REA THE EVENT CALL RDEVTS(ISTAT,NTDB) IF (.NOT.ISTAT.AND.1)GOTO 1000 WRITE(5,200) CALL EXIT 1000 WRITE(5,300) CALL EXIT 50 FORMAT(' STARTING SUBTASK') 100 FORMAT(' SUBTASK SUSPENDED') 200 FORMAT(' SUBTASK TERMINATED') 300 FORMAT(' ERROR') END $CREATE SUBTASK1.FTN C S U B T A S K 1 C - - - - - - - - C C ENSURE EVENT FLAG IS CLEAR CALL CLREF(1) C SUSPEND WRITE(5,50) CALL SUSPND WRITE(5,100) C WAIT UNTIL FLAG IS SET CALL WAITFR(1) CALL EXIT 50 FORMAT(' SUBTASK1 STARTED') 100 FORMAT(' SUBTASK1 RESUMED') END $FORTRAN/LIST EXAMPLE1 $FORTRAN/LIST SUBTASK1 $LINK EXAMPLE1 LB:[1,1]SUBTASK $LINK SUBTASK1 $! $! $! NOW RUN EXAMPLE1 $! $RUN EXAMPLE1 $! $! $! $! C H A I N I N G & S E N D I N G / R E C E I V I N G $! - - - - - - - - - - - - - - - - - - - - - - - - - - - - $! $! IN THIS EXAMPLE, 'EXAMPLE2' INITIATES A SUBTASK CALLED $! 'SUBTASK2' AND DECLARES A CHAIN TASK CALLED 'CHAIN'. $! 'EXAMPLE2' SENS MESSAGES TO BOTH OTHER TASKS. 'SUBTASK2' $! SENDS THE MESSAGE BACK. $! $! $! FIRST COMPILE AND BUILD THE TASKS $! $CREATE EXAMPLE2.FTN C E X A M P L E 2 C - - - - - - - - C BYTE MESS1(6), MESS2(8), BUFF(8) INTEGER FLAG, ISNT, COUNT1, COUNT2, COUNT3, WAIT EQUIVALENCE (MESS1(1),COUNT1), (MESS2(1),COUNT2), (BUFF(1),COUNT3) DATA MESS1/4,0,1HF,1HG,1HH,1HI/ DATA ISNT/O40/ DATA MESS2/5,0,1HA,1HB,1HC,1HD,1HE,0/ DATA WAIT/0/ WRITE(5,7) CALL SENTS(MESS1,0) CALL CHAIN(' CHAIN',1) WRITE(5,5) NTDB=1 CALL DECTDB(NTDB) CALL TDPRIV(ALL,NTDB) CALL RUNTS(' SUBTASK2',NTDB,1,MESS2,WAIT) CALL CHKEV(ISTAT,NTDB) CALL RDEVTS(ISTAT,NTDB) IF (ISTAT.AND.ISNT.EQ.0)GOTO 200 LENGTH=8 CALL RECV(BUFF,LENGTH,ISNDER) FLAG=.TRUE. DO 30 J=2,7 30 IF (MESS2(J).NE.BUFF(J))FLAG=.FALSE. IF (.NOT.FLAG) GOTO 300 IF (ISNDER.LT.0)GOTO 400 WRITE(5,3)(BUFF(J),J=3,7) 500 CALL EXIT 200 WRITE(5,201) GOTO 500 300 WRITE(5,301) GOTO 500 400 WRITE(5,401) GOTO 500 7 FORMAT(' SENDING "FGHI" TO CHAIN TASK') 5 FORMAT(' RUNNING SUBTASK -- SENDING "ABCDE"') 3 FORMAT(' MESSAGE RECEIVED FROM SUBTASK ="',5A1,'"') 201 FORMAT(' STATUS OF SENT EXPECTED, BUT NOT FOUND') 301 FORMAT(' MESSAGE RECEIVED NOT EQUAL TO MESSAGE SENT') 401 FORMAT(' WRONG SENDER') END $CREATE SUBTASK2.FTN C S U B T A S K 2 C - - - - - - - - BYTE BUFF(40) INTEGER COUNT EQUIVALENCE (BUFF(1),COUNT) LENGTH=40 CALL RECV(BUFF,LENGTH,ISNDER) IF (ISNDER.NE.-1)GOTO 200 CALL SENTS(BUFF,-1) 100 CALL EXIT 200 WRITE(5,201) 201 FORMAT(' SUBTASK ERROR') GOTO 100 END $CREATE CHAIN.FTN C C H A I N C - - - - - BYTE BUFF(80) INTEGER COUNT EQUIVALENCE(BUFF(1),COUNT) LENGTH=80 CALL RECV(BUFF,LENGTH,ISNDER) WRITE(5,1)(BUFF(J),J=3,COUNT+2),ISNDER CALL EXIT 1 FORMAT(' CHAIN MESSAGE RECEIVED ="',50A,'" FROM :',I6) END $FOR/LIST EXAMPLE2 $FOR/LIST SUBTASK2 $FOR/LIST CHAIN $LINK EXAMPLE2 LB:[1,1]SUBTASK $LINK SUBTASK2 LB:[1,1]SUBTASK $LINK CHAIN LB:[1,1]SUBTASK $! $! $! NOW RUN EXAMPLE2 $! $RUN EXAMPLE2 $! $! $EOJ