.TITLE LDLIB - LOAD SHAREABLE LIBRARY .IDENT /07/ ;+ ; ;** - LDLIB - LOAD A SHARABLE LIBRARY ; ; This task receives messages from requesting tasks, and ; uses the first two words of each message as a library ; name. If a region exists with the library name, the ; requestor is attached and mapped to the region and a ; resume is done for the requestor. ; ; If the region doesn't already exist, then the library ; file is searched for in directory LB:[1,1] if found, ; an attempt is made to create a region and read the lib. ; into memory. Then a send by ref. and a resume are done ; as before. ; ; The library may not be position independent. ; ; The task should be a slave task so that errors may be ; reported to the terminal issueing the request. ; ; BRIAN S. MCCARTHY 9/21/78 ; ; MODIFIED: ; J. DOWNWARD FIXED UP ERROR HANDELING. ; ; DEATCH REGION PRIOR TO DOING NEXT ; RECEIVE. ; ; JGD2 J. DOWNWARD CHECKPOINT OUT TASKS SITTING IN GEN ; TO MAKE ROOM FOR RESIDENT LIBRARY. ; THIS REQUIRE CKP... TO BE INSTALLED. ; SEND-REQUEST-AND-CONNECT IS USED SO ; THIS PARTICULAR VERSION WILL ONLY WORK ; ON MPLUS, OR BL27 OR GREATER OF RSX11M. ; PLEASE SEE CONDITIONAL CODE(BL27=1). AN ; ATTEMPT IS MADE TO USE SEPERATE SEND,REQUEST, ; AND CONNECT DIRECTIVES IF SDRC$ SUPPORT IS ; MISSING, BUT WINDOWS MAY EXIST! ; ; JGD3 J. DOWNWARD Try to use STOP/UNSTOP rather than the ; SUSPEND/RESUME pair so that the calling ; task will immediately be elegible for ; checkpointing while LDLIB is busy finding ; room for the library. ; ; JGD4 J. DOWNWARD IF CKP... IS ACTIVE WAIT UP TO 50 TICS BEFORE ; TRYING TO CREATE REGION. ;- .ENABL LC .PAGE ; EXTERNAL MACRO CALLS AND DEFINITION OF LABEL BLOCK OFFSETS .MCALL FDBDF$, FSRSZ$, NMBLK$ .MCALL FDOP$A, FDRC$A, FDBK$A .MCALL OPEN$R, READ$, WAIT$, CLOSE$ .MCALL RDBBK$, WDBBK$ .MCALL CRRG$, ATRG$, CRAW$, SREF$ .MCALL LBLDF$ .MCALL DIR$ .MCALL RSUM$S, RCVX$,USTP$S ; JGD3 .MCALL SDRC$,STSE$,SDAT$,RQST$,CNCT$,MRKT$ ; JGD2 .MCALL QIOW$S,EXIT$S,SVTK$S,DTRG$ LBLDF$ ; ERROR MESSAGE MACROS AND DEFINITIONS .MACRO ERRMSG ERRNUM,MSG,PSECT .IIF B,,.MEXIT .NCHR $$$ERL, .PSECT ERR1 $$$ERA = . .ASCII <15><12>\MSG\<15> .PSECT ERR2 .IF NDF,ERRTB ERRTB: .ENDC .WORD $$$ERA $$$ERN = <. - ERRTB>/2-1 .PSECT ERR3 .IF NDF,ERRLN ERRLN: .ENDC .WORD $$$ERL+2 .PSECT PSECT ERRNUM == $$$ERN .ENDM ERRMSG .MACRO ERROR NUM TRAP NUM .ENDM ERROR ; ; DEFINE ERROR CODES ; ER.ATF=1 ER.OPF=2 ER.RED=3 ER.WAT=4 ER.PIC=5 ER.HDR=6 ER.CRE=7. ER.WND=8. ER.SND=9. ER.RSM=10. ER.CLS=11. ER.CKP=12. ER.REQ=13. ; DEFINE ERROR MESSAGES ERRMSG ER.ATF, ERRMSG ER.OPF, ERRMSG ER.RED, ERRMSG ER.WAT, ERRMSG ER.PIC, ERRMSG ER.HDR, ERRMSG ER.CRE, ERRMSG ER.WND, ERRMSG ER.SND, ERRMSG ER.RSM, ERRMSG ER.CLS, ERRMSG ER.CKP, ERRMSG ER.REQ, .PAGE ; SET UP TRAP CATCHING TABLE TRPTBL: .BLKW 6 ; NO-OP ALL BUT TRAP SST .WORD ERRORP ; THIS IS WHERE WE TRAP TO .WORD 0 ; ; LOCAL DATA AND DIRECTIVES ; FCS STUFF FSRSZ$ 0 ; READ DATA INTO REGION LIBFDB: FDBDF$ ; RESERVE AN FDB FDRC$A FD.RWM ; DECLARE READ/WRITE ACCESS FDBK$A LIBLAB,512.,,32.,RDSTAT ; BLOCK PARAMETERS FDOP$A 1,LIBDDB,LIBDEF,FO.RD LIBDDB: .WORD SYDEVL,SYDEV,SYUICL,SYUIC,0,0 SYDEV: .ASCII /LB0:/ SYDEVL=.-SYDEV SYUIC: .ASCII /[1,1]/ SYUICL=.-SYUIC .EVEN LIBDEF: NMBLK$ ,TSK ; REGION DIRECTIVES CREATE: CRRG$ LIBRDB WINDOW: CRAW$ LIBWDB ATTACH: ATRG$ LIBRDB DETACH: DTRG$ LIBRDB SEND: SREF$ ,LIBWDB BUFF: .BLKW 8. TRYCNT: .WORD 0 ; Number of times to try and create reg ; JGD2 WATCNT: .WORD 5 ; # Times to wait for request to CKP... ; JGD4 LIBRDB: RDBBK$ 0,,GEN,RS.MDL!RS.ATT!RS.DEL!RS.WRT!RS.RED,0 LIBWDB: WDBBK$ 0,0,0,0,0,WS.64B!WS.WRT!WS.MAP,BUFF ; RECEIVE BUFFER AND DIRECTIVES SNDNAM: .WORD 0,0 ; SENDER TASK NAME LIBNAM: .WORD 0,0 ; LIBRARY NAME .BLKW 11. ; REST OF MESSAGE RCVX: RCVX$ ,SNDNAM ; RECEIVE DATA DIRECTIVE .IFDF BL27 ; IF BL27 OR LATER SNDCNT: SDRC$ CKP...,SNDNAM,1 ; SEND,REQUEST, AND CONNECT TO CKP... .IFF ; IF NOT SDAT: SDAT$ CKP...,SNDNAM ; SEND DATA RQST: RQST$ CKP... ; REQUEST TASK CNCT: CNCT$ CKP...,1 ; CONNNECT TO TASK .ENDC ; WAIT: MRKT$ 1,10,1 ; MARK TIME FOR 10 TICS STOP: STSE$ 1 ; STOP FOR EVENT FLAG 1 AGAIN: .WORD 0 ; SET TO 1, IF SHOULD RETURN FROM TRAP ; TASK IMAGE FILE BLOCK NUMBER STFLAG: .WORD 0 BLKNUM: .WORD 0,1 RDSTAT: .WORD 0,0 ; LABEL BLOCK BUFFER LIBLAB: .BLKB 512. .PAGE .SBTTL MAIN LINE CODE ; RECEIVE MESSAGES TILL THERE ARE NONE LDLIB: SVTK$S #TRPTBL,#8. ; SET UP SST TABLE FOR ERROR TRAP ; JGD RECV: DIR$ #RCVX ; TRY TO RECEIVE A MESSAGE MOV #5,TRYCNT ; Initialize # times to try & create reg; JGD2 ; FILL IN FDB INFO 10$: MOV #LIBFDB,R0 ; GET FDB ADDRESS MOV #LIBNAM,R1 ; GET LIBRARY NAME ADDRESS MOV (R1),LIBDEF+N.FNAM ; FILL IN TASK MOV (R1)+,LIBRDB+R.GNAM ; AND REGION MOV (R1),LIBDEF+N.FNAM+2 ; NAMES MOV (R1),LIBRDB+R.GNAM+2 ; ; TRY TO ATTACH REGION 30$: DIR$ #ATTACH ; TRY TO ATTACH TO REGION MOV #1,STFLAG ; ASSUME LIB. ALREADY EXISTS CMP #IS.SUC,$DSW ; WAS ATTACH SUCCESSFUL BEQ 40$ ; IF EQ YES CLR STFLAG ; LIB DOESNT' EXIST CMP #IE.PNS,$DSW ; WAS IT JUST BECAUSE IT IS NOT THERE BEQ 40$ ; IF EQ YES(SO GO CREATE IT FIRST) ERROR ER.ATF ; ELSE FATAL(CAN NOT ATTACH REGION) ; PARITY ERROR,BAD DPB,INVALID NAME, ETC ; OPEN TASK IMAGE FILE AND DETERMINE SIZE 40$: OPEN$R ; OPEN TASK FILE BCC 50$ ; IF CC SUCCESSFUL OPEN ERROR ER.OPF ; ELSE FATAL(CAN NOT OPEN FILE) 50$: READ$ ,,,#BLKNUM ; TRY TO READ BLOCK 0 BCC 55$ ; IF CC OK ERROR ER.RED ; ELSE FATAL(CAN NOT READ FILE) 55$: WAIT$ ; WAIT TIL READ FINISHED BCC 60$ ; IF CC WAIT OK ERROR ER.WAT ; ELSE FATAL(WAIT FAILED) 60$: BIT #TS$PIC,LIBLAB+L$BFLG ; IS LIB PIC (I HOPE NOT) BEQ 70$ ; IF EQ OK ERROR ER.PIC ; ELSE FATAL(LIB IS PIC CODE) 70$: BIT #TS$NHD,LIBLAB+L$BFLG ; IS LIB BUILT /-HD (I HOPE SO) BNE 80$ ; IF NE OK ERROR ER.HDR ; ELSE FATAL(NOT BUILT WITH /-HD) 80$: MOV LIBLAB+L$BSA,R1 ; GET PARTITION BASE ADDRESS SWAB R1 ; CHANGE BYTES ASR R1 ; CHANGE ASR R1 ; V.A. ASR R1 ; INTO ASR R1 ; APR ASR R1 ; NUMBER BIC #177770,R1 ; CLEAR OUT CRUD MOVB R1,LIBWDB+W.NAPR ; AND STORE IN WINDOW BLOCK MOVB R1,BUFF+1 ; FILL IN APR NUMBER IN SREF BUFFER CLRB BUFF ; AND CLEAR WINDOW ID ; CALCULATE LOAD SIZE AND CREATE REGION MOV LIBLAB+L$BLDZ,R1 ; GET LOAD SIZE IN 64B BLOCKS MOV R1,LIBWDB+W.NSIZ ; THAT'S WINDOW SIZE, TOO ! TST STFLAG ; LIBRARY ALREADY CREATED ? BNE 90$ ; IF NE YES, SKIP CREATE MOV R1,LIBRDB+R.GSIZ ; LOAD SIZE IS SIZE OF REGION ASL R1 ; CONVERT TO 32B BLOCKS ASL R1 ; " 16 ASL R1 ; " 8 ASL R1 ; " 4 ASL R1 ; " 2 ASL R1 ; " 1 MOV R1,LIBFDB+F.BKDS ; SET SIZE TO LOAD ; CREATE REGION 85$: CALL CKP ; FIRST CHECKPOINT TASKS IN GEN ;JGD2 DIR$ #CREATE ; EXECUTE CREATE CMP #IS.SUC,$DSW ; DID IT WORK BEQ 90$ ; IF EQ YES DEC TRYCNT ; Show we tried once ; JGD2 BNE 85$ ; Keep trying up to TRYCNT times ; JGD2 ERROR ER.CRE ; ELSE FATAL(CAN NOT CREATE REGION) ; REGION IS UP, MAP IT 90$: MOV LIBRDB+R.GID,LIBWDB+W.NRID ; COPY REGION ID DIR$ #WINDOW ; CREATE WINDOW AND MAP CMP #IS.SUC,$DSW ; DID IT WORK BEQ 95$ ; IF EQ YES ERROR ER.WND ; ELSE FATAL(CAN NOT CREATE WINDOW OR MAP) 95$: TST STFLAG ; LIB ALREADY IN BNE 120$ ; IF NE YES ; READ IN TASK IMAGE 100$: MOV LIBWDB+W.NBAS,LIBFDB+F.BKDS+2 ADD LIBLAB+L$BBLK,BLKNUM+2 READ$ ,,,#BLKNUM ; READ FILE BCC 110$ ; DID IT WORK ERROR ER.RED ; ELSE FATAL(CAN'T READ LIB IMAGE) 110$: WAIT$ ; WAIT FOR COMPLETION BCC 120$ ; IF CC OPERATION SUCCESSFUL ERROR ER.WAT ; ELSE FATAL(WAIT FAILED) ; SEND REFERENCE BACK W R/O ACCESS 120$: MOV #WS.RED!WS.WRT,LIBWDB+W.NSTS ; SET TO READ/WRITE ACCESS MOV SNDNAM+0,SEND+S.RETN+0 ; FILL TASK NAME INTO MOV SNDNAM+2,SEND+S.RETN+2 ; SEND DIRECTIVE DIR$ #SEND ; SEND BACK REFERENCE BCC 130$ ; IF CC OK ERROR ER.SND ; ELSE FATAL(SEND FAILED) 130$: USTP$S #SNDNAM ; UNSTOP SENDER TASK ; JGD3 BCC 140$ ; IF CC OK ; JGD3 RSUM$S #SNDNAM ; RESUME SENDER TASK BCC 140$ ; IF CC OK ERROR ER.RSM ; ELSE FATAL(RESUME FAILED) 140$: CLOSE$ #LIBFDB ; CLOSE LIBRARY FILE BCC 150$ ; IF CC OK ERROR ER.CLS ; ELSE FATAL(CLOSE FAILED) 150$: DIR$ #DETACH ; DETACH REGION ; JGD JMP RECV ; AND GO AROUND AGAIN ERRORP: MOV (SP)+,R0 ; QIOW$S #IO.WVB,#2,#2,,,, TST AGAIN ; SHOULD WE JUST ISSUE MESSAGE AND RETURN;JGD2 BNE 10$ ; IF NE, YES USTP$S #SNDNAM ; UNSTOP SENDER TASK(GET IT GOING) ; JGD3 BCC 5$ ; IF SUCCEEDS DON'T TRY RESUME ; JGD3 RSUM$S #SNDNAM ; RESUME SENDER TASK(TRY AND GET IT GOING) 5$: EXIT$S ; ; JGD3 10$: CLR AGAIN ; CLEAR FLAG ; JGD2 RTT ; RETURN FROM TRAP ; JGD2 ; ASK CKP... TO CLEAR OUT GEN ; CKP: .IFDF BL27 ; DO WE HAVE SDRC$ SUPPORT ; JGD2 DIR$ #SNDCNT ; ISSUE THE REQUEST ; JGD2 .IFF ; ; JGD2 DIR$ #SDAT ; SEND DATA ; JGD2 BCS 4$ ; FAILED, PROBABLY NOT INSTALLED ; JGD2 1$: DIR$ #RQST ; REQUEST IT ; JGD2 BCS 2$ ; FAILED, ALREADY ACTIVE? ; JGD2 DIR$ #CNCT ; CONNECT TO TASK ; JGD2 .ENDC ; ; CMP #IS.SUC,$DSW ; DID WE SUCCEED ; JGD2 BEQ 6$ ; YES ; JGD2 2$: CMP #IE.INS,$DSW ; IS CKP... INSTALLED ; JGD4 BEQ 4$ ; IF EQ, NO, WARN USER ; JGD4 CMP #IE.ACT,$DSW ; IS CKP... JUST ACTIVE ; JGD4 BNE 5$ ; NO, RQST FAILD FOR SOME OTHER REASON ; JGD4 DEC WATCNT ; ONLY TRY 5 TIMES ; JGD4 BEQ 5$ ; IF ZERO, GIVE UP IN DISPAIR ; JGD4 DIR$ #WAIT ; MARK TIME FOR 10 TICS ; JGD4 BCS 7$ ; WHY SHOULD WAIT FAIL, BUT IN CASE ; JGD4 DIR$ #STOP ; AND STOP UNTIL 10 TICS DONE ; JGD4 BR 1$ ; AND TRY REQUEST AGAIN ; JGD4 4$: INC AGAIN ; TRY EVEN IF TASK NOT INSTALLED ; JGD2 ERROR ER.CKP ; ERROR, CKP... IS NOT INSTALLED ; JGD2 BR 7$ ; DON'T STOP, ELSE WE WON'T START ; JGD2 5$: INC AGAIN ; TRY EVEN IF CNCT FAILS ; JGD4 ERROR ER.REQ ; WARN USER REQUEST FAILED ; JGD4 BR 7$ ; DON'T STOP, ELSE WON'T START ; JGD4 6$: DIR$ #STOP ; AND WAIT UNTIL CKP DOES ITS THING ; JGD2 7$: RETURN ; BACK TO MAINLINE .END LDLIB