SUBROUTINE SUSPND C Jim Walker, Aug 1987 for VAX/VMS. Put parent process to sleep C and CALL RESUME to wake it up again. C Sept 1987. Add call sys$setpri to raise priority. IMPLICIT NONE INTEGER*4 LIB$GETJPI, SYS$SUSPND, LIB$DISABLE_CTRL INTEGER*4 PID, SAVECTRL, ISTAT, PIDME CHARACTER STATE*4,MODE*11 COMMON /SPNDXX/ PID, SAVECTRL INCLUDE '($JPIDEF)' INCLUDE '($LIBCLIDEF)' C C If this is a detached process then forget about suspending and C ^Y proofing. ISTAT = LIB$GETJPI( JPI$_MODE, , , , MODE, ) IF (.NOT. ISTAT) CALL LIB$SIGNAL ( %VAL(ISTAT) ) IF(MODE.NE.'INTERACTIVE') THEN PID = 0 GOTO 9000 ENDIF C C Find out the PID of the parent process ISTAT = LIB$GETJPI( JPI$_OWNER, , , PID, , ) IF (.NOT. ISTAT) CALL LIB$SIGNAL ( %VAL(ISTAT) ) C C Find out the PID of this process ISTAT = LIB$GETJPI(JPI$_PID , , , PIDME, , ) IF (.NOT. ISTAT) CALL LIB$SIGNAL ( %VAL(ISTAT) ) C C If they are equal, then never mind. IF(PID.EQ.PIDME .OR. PID.EQ.0) THEN PID = 0 GOTO 9999 ENDIF C C Find out the state of the parent process ISTAT = LIB$GETJPI( JPI$_STATE, PID, , , STATE, ) IF (.NOT. ISTAT) CALL LIB$SIGNAL ( %VAL(ISTAT) ) C C If its already asleep then never mind. IF( STATE.EQ.'SUSP') RETURN C C Set up the ^Y PROOF C ISTAT = LIB$DISABLE_CTRL(LIB$M_CLI_CTRLY, SAVECTRL) IF (.NOT. ISTAT) CALL LIB$SIGNAL ( %VAL(ISTAT) ) C C Put the parent process to sleep. ISTAT = SYS$SUSPND( PID, ) IF (.NOT. ISTAT) CALL LIB$SIGNAL ( %VAL(ISTAT) ) C C Raise the priority of the data-collection process to 5. 9000 CALL SYS$SETPRI( , , %VAL(5), ) C 9999 RETURN END SUBROUTINE RESUME IMPLICIT NONE INTEGER*4 SYS$RESUME, LIB$ENABLE_CTRL, LIB$GETJPI INTEGER*4 PID, SAVECTRL, ISTAT CHARACTER*4 STATE COMMON /SPNDXX/ PID, SAVECTRL INCLUDE '($JPIDEF)' INCLUDE '($LIBCLIDEF)' C C Find out the state of the parent process ISTAT = LIB$GETJPI( JPI$_STATE, PID, , , STATE, ) IF (.NOT. ISTAT) CALL LIB$SIGNAL ( %VAL(ISTAT) ) C C If its already awake then never mind. IF( STATE.NE.'SUSP') RETURN C C Wake up the parent process. ISTAT = SYS$RESUME( PID, ) IF (.NOT. ISTAT) CALL LIB$SIGNAL ( %VAL(ISTAT) ) C C Turn ^Y back on. CC ISTAT = LIB$ENABLE_CTRL(SAVECTRL, ) CC IF (.NOT. ISTAT) CALL LIB$SIGNAL ( %VAL(ISTAT) ) RETURN D END D PROGRAM TEST D CALL SUSPND D PAUSE D CALL RESUME END