ASMB,R,Q,C
*     NAME:   LOCK
*     SOURCE: 92070-18145 
*     RELOC:  92070-16145 
*     PGMR:   HLC 
* 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
* 
      NAM LOCK,0  92070-16145  REV.1941  790807 
* 
      ENT $TRRN,$ULLU,$CGRN 
      ENT $$LOC,$.LOC 
* 
      EXT $IDNO,$SCHD,$XQT
      EXT $LUT#,$LUTA,$RNTA 
      EXT $RQP6,$RQP7,$RQP8,$RQP9 
* 
* 
      SUP 
A     EQU 0 
B     EQU 1 
* 
* 
*     $TRRN IS THE RN/LU LOCK CLEAN UP ROUTINE. 
*     IT IS CALLED BY ABORT WHEN EVER A PROGRAM COMPLETES 
* 
*     ITS FUNCTION IS TO RELEASE ANY LOCAL LOCKS AND ANY LOCAL
*     ALLOCATIONS THE PROGRAM HAS.  IT ALSO RELEASES ANY LU 
*     LOCKS THE PROGRAM HAS.
* 
*     CALLING SEQUENCE: 
* 
*     JSB $TRRN 
*     NORMAL RETURN   REGISTERS MEANING LESS
* 
* 
$TRRN NOP 
      JSB $ULLU     RELEASE ANY LU LOCKS
* 
      LDA $RNTA,I   GET THE TABLE SIZE
      CMA,INA,SZA,RSS SET NEGATIVE / IF ZERO EXIT 
      JMP $TRRN,I 
      STA $RQP7     SET LOOP COUNTERS 
      STA $RQP8      FOR BOTH LOOPS 
* 
      LDB $RNTA     SET THE TABLE ADDRESS 
      STB $RQP9       FOR BOTH LOOPS
* 
TRRN1 INB           DALLOCATE LOOP
      LDA B,I       GET THE RN
      ALF,ALF       PUT OWNER FLAG IN LOW A 
      AND =B377     MASK
      CPA $RQP6      IF OWNED BY COMPLETING 
      STA B,I       PROGRAM FLAG FOR NEXT LOOP
      ISZ $RQP8      STEP COUNTER 
      JMP TRRN1     LOOP IF NOT DONE
* 
TRRN3 ISZ $RQP9     LOCAL LOCK LOOP 
      LDA $RQP9,I   GET THE RN
      AND =B377     IF LOCAL LOCK 
      CPA $RQP6      TO COMPLETING PROGRAM
      JMP TRRN6     GO RELEASE THE LOCK 
* 
TRRN4 ISZ $RQP7     STEP COUNT
      JMP TRRN3     IF NOT DONE LOOP
* 
      LDA $RNTA      AND THE ALLOCATE SUSPEND FLAG
      JSB $SCHD     SCHEDULE ANY WAITING PROGRAMS 
      OCT 51
      JMP $TRRN,I   RETURN
* 
TRRN6 XOR $RQP9,I   CLEAR THE LOCK
      STA $RQP9,I   FLAG AND RESET
      LDA $RQP9 
      JSB $SCHD     SCHEDULE ANY WAITERS FOR THIS RN
      OCT 51
      JMP TRRN4     RETURN TO LOOP
* 
* 
$CGRN NOP           CLEAR GLOBAL RN 
      STA TEMP  
      AND =B377 
      STA B 
      ADB $RNTA     COMPUTE ADDRESS IN TABLE
* 
      LDA TEMP
      IOR =B377 
      CPA B,I 
      RSS 
      JMP $CGRN,I   NOT VALID, RETURN 
      XOR =B377     CLEAR THE RN
      STA B,I 
      LDA B 
      JSB $SCHD     SCHEDULE ANY WAITERS
      OCT 51
      JMP $CGRN,I 
* 
TEMP  NOP 
* 
      SKP 
*     THIS SUBROUTINE RELEASES ALL LU'S LOCKED BY A PROGRAM 
*     AND SCHEDULES ANY PROGRAMS WAITING FOR AN LU LOCK.
* 
*     CALLING SEQUENCE: 
* 
*     JSB $ULLU 
*     RETURN - REGISTERS MEANINGLESS
* 
$ULLU NOP 
      LDB $XQT
      JSB $IDNO     GET THE ID NUMBER 
      STB $RQP6      SET FOR $TRRN
* 
      ALF,RAR 
      STA $RQP7     LOCK FLAG 
      LDA $LUT#       SET UP TO SCAN THE
      CMA,INA         LU TABLE
      STA $RQP8 
* 
      LDA $LUTA 
      STA $RQP9 
ULLU1 LDB $RQP9,I   SEARCH FOR ALL
      SZB,RSS 
      JMP ULLU2     BIT BUCKET
      ADB =D6 
      LDA B,I       DVT WORD 7
      AND =B3770    LOCKED LU'S 
      CPA $RQP7     LOCKED TO CALLER? 
      JMP ULLU4     YES - GO CLEAR
* 
ULLU2 ISZ $RQP9     NO / YES  STEP TO NEXT ENTRY
      ISZ $RQP8     IF NOT DONE 
      JMP ULLU1     TRY NEXT ONE
      JMP $ULLU,I 
* 
ULLU4 XOR B,I 
      STA B,I 
      LDA $RQP9,I   GET DVT ADDRESS 
      JSB $SCHD 
      OCT 50
      JMP ULLU2     CONTINUE SEARCH 
* 
$$LOC EQU *         STANDARD MODULE 
$.LOC DEC 0         STANDARD MODULE 
      END 
                                                                                                            