Google
 

Trailing-Edge - PDP-10 Archives - bb-lw55a-bm - galaxy-sources/qsripc.mac
There are 28 other files named qsripc.mac in the archive. Click here to see a list.
	TITLE	QSRIPC  --  IPC Handler for QUASAR
	SUBTTL	Preliminaries

;	COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1975, 1988.
;	ALL RIGHTS RESERVED.
;
;	THIS SOFTWARE IS FURNISHED UNDER A  LICENSE AND MAY BE USED AND  COPIED
;	ONLY IN  ACCORDANCE  WITH  THE  TERMS OF  SUCH  LICENSE  AND  WITH  THE
;	INCLUSION OF THE ABOVE  COPYRIGHT NOTICE.  THIS  SOFTWARE OR ANY  OTHER
;	COPIES THEREOF MAY NOT BE PROVIDED  OR OTHERWISE MADE AVAILABLE TO  ANY
;	OTHER PERSON.  NO  TITLE TO  AND OWNERSHIP  OF THE  SOFTWARE IS  HEREBY
;	TRANSFERRED.
;
;	THE INFORMATION IN THIS  SOFTWARE IS SUBJECT  TO CHANGE WITHOUT  NOTICE
;	AND SHOULD  NOT  BE CONSTRUED  AS  A COMMITMENT  BY  DIGITAL  EQUIPMENT
;	CORPORATION.
;
;	DIGITAL ASSUMES NO  RESPONSIBILITY FOR  THE USE OR  RELIABILITY OF  ITS
;	SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.


	SEARCH	QSRMAC,GLXMAC	;PARAMETER FILE

	PROLOGUE(QSRIPC)	;GENERATE THE NECESSARY SYMBOLS
	IPCMAN==:0			;Maintenance edit number
	IPCDEV==:20			;Development edit number
	VERSIN (IPC)			;Generate edit number
	Subttl	Table of Contents

;		     Table of Contents for QSRIPC
;
;				  Section		      Page
;
;
;    1. Revision history . . . . . . . . . . . . . . . . . . .   3
;    2. C$INIT - ROUTINE TO INITIALIZE THE IPCF INTERFACE  . .   5
;    3. C$INT - IPCF INTERRUPT PROCESSOR . . . . . . . . . . .   6
;    4. C$SEND - ROUTINE TO SEND AN IPCF MESSAGE . . . . . . .   7
;    5. C$RSND - ROUTINE TO PERFORM IPCF RESEND  . . . . . . .   9
SUBTTL	Revision history

COMMENT \

*****  Release 4.2 -- begin maintenance edits  *****

0			7-Jan-83
	Currently no edits

*****  Release 5.0 -- begin development edits  *****

10	5.1003		7-Jan-83
	Move to new development area.  Add version vector.  Clean up
edit organization.  Update TOC.

*****  Release 5 -- begin maintenance edits  *****
15	Increment maintenance edit level for GALAXY 5.

*****	Release 6.0 -- begin development edits	*****

20	6.1037		26-Oct-87
	Move sources from G5: to G6:

21	6.1225		8-Mar-88
	Update copyright notice.

\   ;End of Revision History

SNDQUE:	BLOCK	1		;RESEND IPCF QUEUE LINK LIST ID


	;RESEND QUEUE STRUCTURE

	PHASE	0

RS.CNT:! BLOCK	1		;RESEND COUNT
RS.SAB:! BLOCK	SAB.SZ		;SENDERS SAB
RS.MSG:!			;THE MESSAGE
RS.LEN:!			;MINIUM RESEND QUEUE ENTRY LENGTH

	DEPHASE
	SUBTTL	C$INIT - ROUTINE TO INITIALIZE THE IPCF INTERFACE

	INTERN	C$INIT		;MAKE IT GLOBAL

C$INIT:	PUSHJ	P,L%CLST	;CREATE A LINK LIST FOR RESEND QUEUE
	MOVEM	S1,SNDQUE	;SAVE THE ID
	$RETT			;AND RETURN
	SUBTTL	C$INT - IPCF INTERRUPT PROCESSOR

	INTERN	C$INT			;MAKE IT GLOBAL

C$INT:	$BGINT(INT.PL)			;ASSUME INTERRUPT CONTEXT
	$COUNT	(IPCI)			;COUNT IPCF INTERRUPTS
	PUSHJ	P,C%INTR		;CALL SUPPORT INTERRUPT ROUTINE
	$DEBRK				;AND DISMISS THE INTERRUPT
	SUBTTL	C$SEND - ROUTINE TO SEND AN IPCF MESSAGE

	;CALL:	G$SAB containing the SAB 
	;
	;RET:	True if send wins, False otherwise

	INTERN	C$SEND			;MAKE IT GLOBAL

C$SEND:	PUSHJ	P,.SAVE2		;SAVE P1 & P2 FOR A MINUTE

	;Here to scan the RESEND queue to see if the reciever is in there

	SKIPE	P1,G$SAB##+SAB.PD	;GET THE RECIEVERS PID
	SETZM	G$SAB##+SAB.SI		;CLEAR SPECIAL INDEX IF PID PRESENT
	MOVE	P2,G$SAB##+SAB.SI	;GET SPECIAL INDEX
	SETZM	G$SAB##+SAB.PB		;CLEAR AUX PIB
	MOVE	S1,SNDQUE		;GET THE RESEND QUEUE ID
	PUSHJ	P,L%FIRST		;GET THE FIRST ENTRY
	JRST	SEND.1			;JUMP THE FIRST TIME THROUGH

SEND.0:	MOVE	S1,SNDQUE		;GET THE RESEND QUEUE ID
	PUSHJ	P,L%NEXT		;GET THE NEXT QUEUE ENTRY
SEND.1:	JUMPF	SEND.2			;NO MORE,,SEND THE MESSAGE
	CAMN	P1,RS.SAB+SAB.PD(S2)	;IS HE IN THE RESEND QUEUE ???
	CAME	P2,RS.SAB+SAB.SI(S2)
	JRST	SEND.0			;NO,,TRY NEXT ENTRY
	JRST	SEND.3			;YES,,QUEUE THIS MESSAGE UP


	;Here to send the IPCF Message

SEND.2:	MOVX	S1,SAB.SZ		;GET THE SAB LENGTH
	MOVEI	S2,G$SAB##		;AND THE SAB ADDRESS
	PUSHJ	P,C%SEND		;SEND THE MESSAGE OFF
	JUMPT	[$COUNT (SIPC)		;WIN,,COUNT'EM UP
		 $RETT  ]		;AND RETURN

	;Here if the SEND failed

	$COUNT	(IPCF)			;COUNT FAILURES...
	CAXE	S1,ERNSP$		;IS THE ERROR 'NO SUCH PID' ???
	JRST	SEND.3			;NO,,QUEUE THE MSG FOR A RETRY LATER
	$COUNT	(IPCU)			;NOT RECOVERABLE...
	MOVE	S1,G$SAB##+SAB.PD	;GET RECIEVERS PID
	PUSHJ	P,G$SFAL##		;TELL WORLD USER WENT AWAY...
	MOVE	S2,G$SAB##+SAB.LN	;GET THE MESSAGE LENGTH
	CAXE	S2,PAGSIZ		;SENDING A PAGE ???
	$RETF				;NO,,JUST RETURN
	MOVE	S1,G$SAB##+SAB.MS	;YES,,GET THE PAGE ADDRESS
	PUSHJ	P,M%RPAG		;RETURN THE PAGE
	$RETF				;AND RETURN
	;Here to queue the message up for a later resend attempt

SEND.3:	MOVE	P1,G$SAB##+SAB.PD	;GET THE RECIEVERS PID
	MOVE	P2,G$SAB##+SAB.SI	; AND THE SPECIAL INDEX

	;Here to position to the last entry for the reciever in the resend queue

SEND.4:	MOVE	S1,SNDQUE		;GET THE RESEND QUEUE ID
	PUSHJ	P,L%NEXT		;GET THE NEXT ENTRY IN THE QUEUE
	JUMPF	SEND.5			;NO MORE...
	CAMN	P1,RS.SAB+SAB.PD(S2)	;DO PID MATCH ???
	CAME	P2,RS.SAB+SAB.SI(S2)
	JRST	SEND.5			;AT THE END...
	JRST	SEND.4			;PIDS MATCH,,TRY NEXT QUEUE ENTRY

	;Here to create an entry in the resend queue

SEND.5:	MOVE	S2,G$SAB##+SAB.LN	;GET THE MESSAGE LENGTH
	CAXN	S2,PAGSIZ		;SENDING A PAGE ???
	SETZM	S2			;YES,,ZAP MESSAGE LENGTH
	ADDI	S2,RS.LEN		;ADD IN THE RESEND QUEUE LENGTH
	MOVE	S1,SNDQUE		;GET THE RESEND QUEUE ID
	PUSHJ	P,L%CENT		;CREATE AN ENTRY IN THE QUEUE
	SKIPT
	$STOP(CCE,Can't create list entry)
	MOVE	P1,S2			;SAVE THE ENTRY ADDRESS
	MOVEI	S1,RS.SAB(P1)		;POINT TO THE DESTINATION SAB
	HRLI	S1,G$SAB##		;GET THE SOURCE SAB ADDRESS
	BLT	S1,RS.SAB+SAB.SZ-1(P1)	;SAVE THE SENDERS SAB
	MOVE	S2,G$SAB##+SAB.LN	;GET THE MESSAGE LENGTH
	CAXN	S2,PAGSIZ		;WAS IT A PAGE MODE SEND ???
	$RETT				;YES,,RETURN NOW
	ADDI	S2,RS.MSG-1(P1)		;GET THE BLT END ADDRESS
	HRL	S1,G$SAB##+SAB.MS	;GET THE SOURCE MESSAGE ADDRESS
	HRRI	S1,RS.MSG(P1)		;GET THE DESTINATION MESSAGE ADDRESS
	BLT	S1,0(S2)		;SAVE THE MESSAGE
	MOVEI	S1,RS.MSG(P1)		;GET THE NEW MESSAGE ADDRESS
	MOVEM	S1,RS.SAB+SAB.MS(P1)	;AND SET IT FOR THE RESEND
	$RETT				;RETURN
	SUBTTL	C$RSND - ROUTINE TO PERFORM IPCF RESEND 

	INTERN	C$RSND			;MAKE IT GLOBAL

C$RSND:	PUSHJ	P,.SAVE1		;SAVE P1 FOR A MINUTE
	MOVE	S1,SNDQUE		;GET THE RESEND QUEUE ID
	PUSHJ	P,L%FIRST		;GET THE FIRST ENTRY
	JRST	RSND.2			;JUMP THE FIRST TIME THROUGH

RSND.1:	MOVE	S1,SNDQUE		;GET THE RESEND QUEUE ID
	PUSHJ	P,L%NEXT		;GET THE NEXT QUEUE ENTRY
RSND.2:	JUMPF	.RETT			;NO MORE,,RETURN
RSND.3:	MOVE	P1,S2			;SAVE THE ENTRY ADDRESS
	AOS	S1,RS.CNT(P1)		;BUMP AND LOAD THE RESEND COUNT
	CAILE	S1,^D10			;ONLY TRY RESEND 10 TIMES...
	JRST	RSND.5			;TOO MANY,,GO DELETE THIS ENTRY
	MOVEI	S1,SAB.SZ		;GET THE SAB LENGTH
	MOVEI	S2,RS.SAB(P1)		;AND THE SAB ADDRESS
	PUSHJ	P,C%SEND		;RESEND THE MESSAGE
	JUMPT	[$COUNT (SIPC)		;COUNT WINNERS...
		 JRST RSND.6 ]		;AND GO DELETE THE CURRENT ENTRY
	$COUNT	(IPCF)			;COUNT FAILURES...
	CAXN	S1,ERNSP$		;DID WE FAIL FOR NO SUCH PID ???
	JRST	[$COUNT (IPCU)		;COUNT UNRECOVERABLE ERRORS
		 MOVE	S1,G$SAB##+SAB.PD ;GET RECIEVERS PID
		 PUSHJ	P,G$SFAL##	;TELL WORLD USER WENT AWAY...
		 JRST	RSND.5 ]	;AND GO DELETE THE CURRENT ENTRY

	;Here to skip all messages for the same reciever

	MOVE	P1,RS.SAB+SAB.PD(P1)	;NO,,GET THE RECIEVERS PID
RSND.4:	MOVE	S1,SNDQUE		;GET THE RESEND QUEUE ID
	PUSHJ	P,L%NEXT		;GET THE NEXT QUEUE ENTRY
	JUMPF	.RETT			;NO MORE,,RETURN
	CAMN	P1,RS.SAB+SAB.PD(S2)	;DO THE PIDS MATCH ???
	JRST	RSND.4			;YES,,SKIP THIS MSG AND TRY NEXT
	JRST	RSND.3			;NO,,GO PROCESS THIS MESSAGE

RSND.5:	MOVE	S2,RS.SAB+SAB.LN(P1)	;GET THE MESSAGE LENGTH
	MOVE	S1,RS.SAB+SAB.MS(P1)	;GET THE MESSAGE ADDRESS
	CAXN	S2,PAGSIZ		;IS IT A PAGE MODE SEND ???
	PUSHJ	P,M%RPAG		;YES,,RETURN PAGE TO THE MEMORY MANAGER
RSND.6:	MOVE	S1,SNDQUE		;GET THE RESEND QUEUE ID
	PUSHJ	P,L%DENT		;DELETE THE CURRENT QUEUE ENTRY
	JRST	RSND.1			;GO PROCESS NEXT QUEUE ENTRY
	END