	LOGICAL*1 FUNCTION CHECK_SUBPROCESSES(MASTER_PID,SUBCOUNT)
	IMPLICIT NONE
C
C   Module:	CHECK SUBPROCESS 
C
C   Original:	George H. Walrod III
C
C   Purpose:	Checks Subprocesses with the Same Master PID Number
C		for CPU and Buffer I/O
C
C   Arguments:
C		MASTER_PID	: Master Pid Number
C		SUBCOUNT	: Number of Sub Processes Spawned
C
C   Corrected Modification:
C		None
C   Notes:
C		None
C
C
	INCLUDE	'WATCHITMLST.INC'		! Item List Description
	INCLUDE	'WATCHARRAY.INC'		! User Information
	INCLUDE	'WATCHPROC.INC'			! Process Information
	INCLUDE	'WATCHTERM.INC'			! Terminal Information
C
	PARAMETER
     +		JPI_WILDCARD	= -1,		! Get Job Process Info Wildcard
     +		CPU_50MS	= 5		! 50 MS Resolution

	CHARACTER
     +		TTYNAM*(MAX_TERMINAL_LEN),	! Terminal Name
     +		PRCNAM*(MAX_PROCESS_LEN)	! Process Name

	INTEGER*2
     +		TTYNAM_L,			! TTY Name Length
     +		PRCNAM_L,			! Process Name Length
     +		SEQ_NUMBER(2)			! Sequence Number PID

	INTEGER*4
     +		SEEN_NO_PROCESSES,		! Number Processes Seen
     +		SEEDPID,			! Seed Pid for GETJPI
     +		CUR_PID,			! Current Pid
     +		SS_STATUS,			! Sys Service Status
     +		SYS$GETJPIW,			! SS Get Job Process Info
     +		EPID,				! Process Identifacation No.
     +		PID,				! Process Identifacation No.
     +		SUB_MASTER_PID,			! Subprocess Master Pid
     +		CHKNETDEV,			! Check for Network Device
     +		MASTER_PID,			! Process Master Pid
     +		NEWCPU,				! New Cpu Time
     +		NEWIOC,				! New Buffer I/O Count
     +		STATE,				! Process State
     +		SUBCOUNT			! Sub-Process Count

	RECORD	/ITEM_LIST/
     +		JPI_ITMLST(8)			! Job Process Information

	EXTERNAL
     +		SS$_NOMOREPROC,			! No More Processes
     +		SS$_NONEXPR,			! Non Existent Process
     +		SS$_NORMAL,			! Normal Completion
     +		SS$_SUSPENDED,			! Process Suspended
     +		JPI$_PID,			! Pid
     +		JPI$_CPUTIM,			! Cpu Time
     +		JPI$_BUFIO,			! Buffer I/O
     +		JPI$_STATE,			! Process State
     +		JPI$_PRCNAM,			! Process Name
     +		JPI$_TERMINAL,			! Terminal Name
     +		JPI$_MASTER_PID,		! Process Master PID
     +		JPI$C_LISTEND,			! End List
     +		SCH$C_HIB,			! Schedule Hiberation
     +		SCH$C_HIBO			! Schedule Hiberation Out Swap

C
C   Define Equivalence Fields for Data Buffers
C
	EQUIVALENCE
     +		(SEQ_NUMBER(1),	PID)

C
C
C   Initialize No of Processes with Master Pid
C

	SEEN_NO_PROCESSES = 0
	CHECK_SUBPROCESSES = .false.

C
C   Job Process Information Layout Subprocess
C

	JPI_ITMLST(1).BUFFER_LENGTH	 = 4
	JPI_ITMLST(1).ITEM_CODE		 = %loc(jpi$_pid)
	JPI_ITMLST(1).BUFFER_ADDR	 = %loc(pid)
	JPI_ITMLST(1).RETURN_LENGTH_ADDR = 0
	JPI_ITMLST(2).BUFFER_LENGTH	 = 4
	JPI_ITMLST(2).ITEM_CODE		 = %loc(jpi$_cputim)
	JPI_ITMLST(2).BUFFER_ADDR	 = %loc(newcpu)
	JPI_ITMLST(2).RETURN_LENGTH_ADDR = 0
	JPI_ITMLST(3).BUFFER_LENGTH	 = 4
	JPI_ITMLST(3).ITEM_CODE		 = %loc(jpi$_bufio)
	JPI_ITMLST(3).BUFFER_ADDR	 = %loc(newioc)
	JPI_ITMLST(3).RETURN_LENGTH_ADDR = 0
	JPI_ITMLST(4).BUFFER_LENGTH	 = 4
	JPI_ITMLST(4).ITEM_CODE		 = %loc(jpi$_state)
	JPI_ITMLST(4).BUFFER_ADDR	 = %loc(state)
	JPI_ITMLST(4).RETURN_LENGTH_ADDR = 0
	JPI_ITMLST(5).BUFFER_LENGTH	 = max_terminal_len
	JPI_ITMLST(5).ITEM_CODE		 = %loc(jpi$_terminal)
	JPI_ITMLST(5).BUFFER_ADDR	 = %loc(ttynam)
	JPI_ITMLST(5).RETURN_LENGTH_ADDR = %loc(ttynam_l)
	JPI_ITMLST(6).BUFFER_LENGTH	 = max_process_len
	JPI_ITMLST(6).ITEM_CODE		 = %loc(jpi$_prcnam)
	JPI_ITMLST(6).BUFFER_ADDR	 = %loc(prcnam)
	JPI_ITMLST(6).RETURN_LENGTH_ADDR = %loc(prcnam_l)
	JPI_ITMLST(7).BUFFER_LENGTH	 = 4
	JPI_ITMLST(7).ITEM_CODE		 = %loc(jpi$_master_pid)
	JPI_ITMLST(7).BUFFER_ADDR	 = %loc(sub_master_pid)
	JPI_ITMLST(7).RETURN_LENGTH_ADDR = 0
	JPI_ITMLST(8).END_LIST		 = %loc(jpi$c_listend)

C
C   End of Job Process Information List for Subprocess
C
C
C   Loop Until We Have Looked At All Processes using 
C   Get Job Process Information with a Wild Card
C
D910	  FORMAT(' Working With PID ',Z8)

	SEEDPID   = JPI_WILDCARD
	SS_STATUS = 0
	DO WHILE (SS_STATUS .ne. %loc(SS$_NOMOREPROC))
	  SS_STATUS   = SYS$GETJPIW(,%ref(SEEDPID),,
     +                                             %ref(JPI_ITMLST),,,)
D	  TYPE *,'Type Return Status from SYS$GETJPI is ',SS_STATUS
D	  TYPE 910,PID
	  IF ((SS_STATUS .ne. %loc(SS$_NOMOREPROC)) .and.
     +	       SS_STATUS .ne. %loc(SS$_SUSPENDED)   .and.
     +	       SS_STATUS .ne. %loc(SS$_NORMAL)) then
	    CALL LIB$STOP(%val(SS_STATUS))
	   ELSE
	    IF (SS_STATUS .ne. %loc(SS$_SUSPENDED)) 
     +	      SEEN_NO_PROCESSES = SEEN_NO_PROCESSES + 1
	    IF (SS_STATUS .ne. %loc(SS$_NORMAL)) 
     +	      GOTO 20
	   END IF

C
C   We Have A User, Get The Low 16 Bits Of His Pid (the index) 
C   the High Order Bits Are the Sequence number
C

	  EPID = PID			! Change for Version 4.X
          CALL GETPID (PID)		! Change for Version 4.X
	  CUR_PID = SEQ_NUMBER(1)

C
C   Watchdog at this point only looks at Parent Processes
C   and Then Searches Other Later Out Later Necessary.
C

	  IF ((SUB_MASTER_PID .ne. MASTER_PID) .or.
     +	      (TTYNAM_L .gt. 0)) GOTO 20

C
C   If The Sequence Number Has Changed Since We Last Logged In,
C   We Have A New Sucker. Reset All The Use Counts, And Dont Bother Him
C

	  IF (SEQ(CUR_PID) .ne. SEQ_NUMBER(2)) then
D	    TYPE *,'Never Seen This Person Before'
	    SEQ(CUR_PID)      = SEQ_NUMBER(2)
	    GOTO 900
	   END IF

C
C   Leave The Processes Alone, IF There Hiberating and
C   There Using a Network Device
C

	  IF (((STATE .eq. %loc(SCH$C_HIB)) .or.
     +	      (STATE .eq. %loc(SCH$C_HIBO))) .and.
     +	      (CHKNETDEV(PID)))	THEN
D	    TYPE *, 'This Process is Hiberating and Has A Network Device'
	    GOTO 900
	   END IF

C
C   Normal User, Check Buffer I/O, or If 50ms Of Cpu was Used
C

	  IF ((BUFIOC(CUR_PID) .lt. NEWIOC) .or.
     +	      (CPUTIM(CUR_PID)+CPU_50MS .lt. NEWCPU)) then
D	    TYPE *, 'CHILD Has Done Some Work Since I Saw Them Last'
D	    TYPE *, 'Old BufIOC ', BUFIOC(CUR_PID), ' NEWIOC ', NEWIOC
D	    TYPE *, 'Old CPUTIM ', CPUTIM(CUR_PID), ' NEWCPU ', NEWCPU
	    GOTO 900
	   END IF

C
C   No Change in This User and Get Next Process
C

10	  CONTINUE
	  SEEN_NO_PROCESSES = SEEN_NO_PROCESSES + 1

20	  CONTINUE
	END DO

	IF (SEEN_NO_PROCESSES .ge. SUBCOUNT) GOTO 999

C
C   New User or Change in CPUTIM and BUFIOC, Save Time and Return at
C   This Point.
C

900	CONTINUE
	CPUTIM(CUR_PID)=NEWCPU
	BUFIOC(CUR_PID)=NEWIOC
	CHECK_SUBPROCESSES = .true.

999	CONTINUE
	RETURN
	END						! Call It a Day
