         << LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION >>     00000001
$INCLUDE INCLICS                                               <<R2212>>00252000
INTEGER POINTER ICS = 7; <<TO ACCESS THE ICS>>                 <<R2212>>00253000
Procedure Queueproc (Procsysdbinx, queue, location);                    00571100
   Value Procsysdbinx, queue, location;                                 00571200
   Integer Procsysdbinx, queue, location;                               00571300
   Option External;                                                     00571400
                                                                        00571500
$page                                                          <<U1720>>00935010
                                                               <<U1720>>00935020
PROCEDURE ERRORON'70;                                          <<U1720>>00935030
  OPTION  PRIVILEGED,UNCALLABLE;                               <<U1720>>00935040
                                                               <<U1720>>00935050
<<***********************************************************>><<U1720>>00935060
<<***********************************************************>><<U1720>>00935070
<<**                                                       **>><<U1720>>00935080
<<**    THIS IS THE MICROCODED VERSION OF ERRORON.         **>><<U1720>>00935090
<<**                                                       **>><<U1720>>00935100
<<**    INCREMENT ERROR LEVEL AND CLEAR ERROR WORD.        **>><<U1720>>00935110
<<**                                                       **>><<U1720>>00935120
<<**  ===================================================  **>><<U1720>>00935130
<<**  = WARNING   WARNING   WARNING   WARNING   WARNING =  **>><<U1720>>00935140
<<**  ===================================================  **>><<U1720>>00935150
<<**                                                       **>><<U1720>>00935160
<<**    THIS PROCEDURE IS INTENDED FOR USE ONLY WITH       **>><<U1720>>00935170
<<**    THE PERFORMANCE ENHANCEMENT MICROCODE WRITTEN      **>><<U1720>>00935180
<<**    TO REPLACE THE MPE PROCEDURE "ERRORON".            **>><<U1720>>00935190
<<**                                                       **>><<U1720>>00935200
<<**  ===================================================  **>><<U1720>>00935210
<<**  = CAUTION   CAUTION   CAUTION   CAUTION   CAUTION =  **>><<U1720>>00935220
<<**  ===================================================  **>><<U1720>>00935230
<<**                                                       **>><<U1720>>00935240
<<**    THE MICROCODE GROUP SHOULD EVALUATE ANY CHANGES    **>><<U1720>>00935250
<<**    TO THIS CODE TO AVOID POTENTIAL PROBLEMS.          **>><<U1720>>00935260
<<**                                                       **>><<U1720>>00935270
<<**    SEE ERRORON FOR FURTHER INFORMATION.               **>><<U1720>>00935280
<<**                                                       **>><<U1720>>00935290
<<***********************************************************>><<U1720>>00935300
<<***********************************************************>><<U1720>>00935310
                                                               <<U1720>>00935320
  BEGIN                                                        <<U1720>>00935330
    ASSEMBLE(CON %020104, %30);     << MICROCODED ERRORON >>   <<U1720>>00935340
  END;   << ERRORON'70 >>                                      <<U1720>>00935350
$page                                                          <<U1720>>00935360
              AND NOT RESABORTINFO.CRITFLAG                    <<N9515>>01661000
              AND NOT RESABORTINFO.HASSIRFLAG                  <<N9515>>01662000
     <<@@@ ERROREXIT no longer calls ABORT for critical and  >><<N9515>>01663000
     <<@@@ hassir process when process has stack overflow.   >><<N9515>>01664000
                                                               <<U1720>>01875010
PROCEDURE ERROREXIT'70(INTRINEXIT,ERRWORD,PARAM);              <<U1720>>01875020
  VALUE   INTRINEXIT,ERRWORD,PARAM;                            <<U1720>>01875030
  LOGICAL INTRINEXIT,ERRWORD,PARAM;                            <<U1720>>01875040
  OPTION  PRIVILEGED,UNCALLABLE;                               <<U1720>>01875050
                                                               <<U1720>>01875060
<<***********************************************************>><<U1720>>01875070
<<***********************************************************>><<U1720>>01875080
<<**                                                       **>><<U1720>>01875090
<<**    THIS IS THE MICROCODED VERSION OF ERROREXIT.       **>><<U1720>>01875100
<<**                                                       **>><<U1720>>01875110
<<**    PROCESS EXIT PATHS OF MPE INTRINSICS.              **>><<U1720>>01875120
<<**                                                       **>><<U1720>>01875130
<<**  ===================================================  **>><<U1720>>01875140
<<**  = WARNING   WARNING   WARNING   WARNING   WARNING =  **>><<U1720>>01875150
<<**  ===================================================  **>><<U1720>>01875160
<<**                                                       **>><<U1720>>01875170
<<**    THIS PROCEDURE IS INTENDED FOR USE ONLY WITH       **>><<U1720>>01875180
<<**    THE PERFORMANCE ENHANCEMENT MICROCODE WRITTEN      **>><<U1720>>01875190
<<**    TO REPLACE THE MPE PROCEDURE "ERROREXIT".          **>><<U1720>>01875200
<<**                                                       **>><<U1720>>01875210
<<**  ===================================================  **>><<U1720>>01875220
<<**  = CAUTION   CAUTION   CAUTION   CAUTION   CAUTION =  **>><<U1720>>01875230
<<**  ===================================================  **>><<U1720>>01875240
<<**                                                       **>><<U1720>>01875250
<<**    THE MICROCODE GROUP SHOULD EVALUATE ANY CHANGES    **>><<U1720>>01875260
<<**    TO THIS CODE TO AVOID POTENTIAL PROBLEMS.          **>><<U1720>>01875270
<<**                                                       **>><<U1720>>01875280
<<**    SEE ERROREXIT FOR FURTHER INFORMATION.             **>><<U1720>>01875290
<<**                                                       **>><<U1720>>01875300
<<***********************************************************>><<U1720>>01875310
<<***********************************************************>><<U1720>>01875320
                                                               <<U1720>>01875330
  BEGIN                                                        <<U1720>>01875340
    TOS := INTRINEXIT;       << STACK UP THE PARAMETERS >>     <<U1720>>01875350
    TOS := ERRWORD;                                            <<U1720>>01875360
    TOS := PARAM;                                              <<U1720>>01875370
    ASSEMBLE(CON %020104, %31);   << MICROCODED ERROREXIT >>   <<U1720>>01875380
    IF > THEN                                                  <<U1720>>01875390
       ASSEMBLE(PCAL ABORT)                                    <<U1720>>01875400
    ELSE                                                       <<U1720>>01875410
       ASSEMBLE(XEQ 0);                                        <<U1720>>01875420
  END;   << ERROREXIT'70 >>                                    <<U1720>>01875430
$page                                                          <<U1720>>01875440
<<                                                                      04801000
<< When the process releases its last resource, the priority            04802000
<< will be adjusted accordingly. The algorithm used in                  04803000
<< here is similiar to that using in the DISPATCHER to adjust           04804000
<< the process'spriority at the Reschedule time.                        04805000
<< Example:                                                             04805100
<<    Newpriority = Scheduling Base + ( Number of times when            04806000
<<                  the process used up its Quantum * 2)                04807000
<<                                                                      04808000
<< However, the NEWPRIORITY can not be exceeded the WROST               04808100
<< PRIORITY of that particuliar queueing base.                          04808200
<<                                                                      04809000
INTEGER PXFIXEDLOC, <<TO USE IN PXFIXED DEFINITION>>           <<R2212>>04931000
        QUANTUMCNT, <<# OF TIME PROCESS USED TIME QUANTUM>>    <<R2212>>04931100
        NEWPRIOFFSET,                                          <<R2212>>04931200
        PROCNEWPRI;                                            <<R2212>>04931300
                                                               <<R2212>>04932000
Equate Dispatchq = 1;                                                   04935100
Equate Endofqueue = 0;                                                  04935200
<<ONLY GET HERE IF THE CALLER IS REALLY OWNS THE RESOURCE>>    <<R2212>>05040100
                                                               <<R2212>>05040200
PXFIXED; <<SET UP POINTER TO ACCESS THE PXFIXED AREA>>         <<R2212>>05045100
TOS := PXFXRSRCCNT; <<PUT THE RESOURCE COUNT ON TOS>>          <<R2212>>05045200
IF S0 > 0 THEN  <<PROCESS STILL HOLD SOME RESOURCE>>           <<R2212>>05045300
TOS := TOS - 1; <<DECREMENT THE COUNTER>>                      <<R2212>>05045400
PXFXRSRCCNT := TOS; <<SAVE IT AWAY>>                           <<R2212>>05045500
                                                               <<R2212>>05115100
IF PXFXRSRCCNT = 0 THEN                                        <<R2212>>05115200
   BEGIN <<THE PROCESS RELEASE ITS LAST RESOURCE. ITS PRI.>>   <<R2212>>05115300
         <<WILL BE ADJUSTED ACCORDINGLY>>                      <<R2212>>05115400
   PCBPT := CURPRC;  <<GET THE CALLER'S PCB INDEX>>            <<R2212>>05115500
   IF NOT QUEUEINGINFO.LSCHEDFLAG THEN                         <<H2255>>05115550
   BEGIN <<ONLY ADJUST THE PRI. IF RUN IN NON-LINEAR Q>>       <<H2255>>05115560
   IF RESABORTINFO.HOLDSIRPRIFLAG = 0 AND                      <<R2212>>05115700
   RESABORTINFO.HOLDIMPPRIFLAG = 1 THEN                        <<R2212>>05115710
      BEGIN <<ONLY ADJUST THE CALLER'S PRIORITY IF IT IS>>     <<R2212>>05115800
            <<GIVING UP THE LAST RESOURCE AND NOT HOLDING>>    <<R2212>>05115900
            <<ANY SIR >>                                       <<R2212>>05116000
      QUANTUMCNT := PXFXQCNT;<<Get the number of >>            <<R2212>>05116100
      <<quantun time out from the PXFIXED>>                    <<R2212>>05116200
      NEWPRIOFFSET := IF 0<=QUANTUMCNT<=127 THEN               <<R2212>>05116300
      QUANTUMCNT*2 ELSE 256; <<the offset can not be>>         <<R2212>>05116400
      <<greater than 256>>                                     <<R2212>>05116500
      IF QUEUEINGINFO.CSCHEDFLAG THEN                          <<R2212>>05116600
         BEGIN  <<process is running on CQ>>                   <<R2212>>05116700
         PROCNEWPRI := ICS(-ICS'CSCHEDBASECELL) + NEWPRIOFFSET;<<R2212>>05116800
         IF PROCNEWPRI > ICS(-ICS'WORSTCPRICELL) THEN          <<R2212>>05117000
         PROCNEWPRI := ICS(-ICS'WORSTCPRICELL);                <<R2212>>05117100
         END ELSE                                              <<R2212>>05117200
            BEGIN                                              <<R2212>>05117300
            IF QUEUEINGINFO.DSCHEDFLAG THEN                    <<R2212>>05117400
               BEGIN                                           <<R2212>>05117500
               PROCNEWPRI := ICS(-ICS'DSCHEDBASECELL)+         <<R2212>>05117600
               NEWPRIOFFSET;                                   <<R2212>>05117700
               IF PROCNEWPRI > ICS(-ICS'WORSTDPRICELL)         <<R2212>>05117800
               THEN PROCNEWPRI :=ICS(-ICS'WORSTDPRICELL);      <<R2212>>05117900
               END ELSE                                        <<R2212>>05118000
               IF QUEUEINGINFO.ESCHEDFLAG THEN                 <<R2212>>05118100
                  BEGIN                                        <<R2212>>05118200
                  PROCNEWPRI:=ICS(-ICS'ESCHEDBASECELL)+        <<R2212>>05118300
                  NEWPRIOFFSET;                                <<R2212>>05118400
                  IF PROCNEWPRI>ICS(-ICS'WORSTEPRICELL)        <<R2212>>05118500
                  THEN PROCNEWPRI :=                           <<R2212>>05118600
                  ICS(-ICS'WORSTEPRICELL);                     <<R2212>>05118700
                  END;                                         <<R2212>>05118800
            END;                                               <<R2212>>05118900
       QUEUEINGINFO.PRIFIELD := PROCNEWPRI;<<SAVE THE NEW PRI>><<R2212>>05119000
       <<INTO THE PCB TABLE>>                                  <<R2212>>05119010
       RESABORTINFO.HOLDIMPPRIFLAG := 0;<<REST THE PRI FLAG>>  <<R2212>>05119020
       If queueinginfo.Dispqflag then                                   05119030
          begin                                                         05119040
          tos := %1000d;                                                05119050
          assemble(xchd); <<set DB to sysglob>>                         05119060
          Queueproc(pcbpt,dispatchq,endofqueue);                        05119070
          assemble(xchd); <<back to old stack>>                         05119080
          end;                                                          05119090
       END;                                                    <<R2212>>05119100
   END;                                                        <<H2255>>05119105
   END;  <<RESOURCE COUNT = 0>>                                <<R2212>>05119110
                                                               <<R2212>>05119900
<<                                                             <<R2212>>05216000
<<  Each time the process calls Obtain to lock a Resource      <<R2212>>05217000
<<  the RESOURCECNT is incremented by one. At the RELEASE      <<R2212>>05218000
<<  time the counter will be decremented by one. If the        <<R2212>>05219000
<<  count falls to zero, the priority of the process will      <<R2212>>05220000
<<  be adjusted back to the original priority instead of       <<R2212>>05221000
<<  letting the Dispatcher do it at the Reschedule time.       <<R2212>>05222000
<<  This insures that no process can requeue for another       <<R2212>>05223000
<<  Resource at an artificially high priority.                 <<R2212>>05224000
<<                                                             <<R2212>>05224500
INTEGER PXFIXEDLOC,  <<TO USE THE PXFIXED DEFINITION>>         <<R2212>>05371000
        RESOURCECNT; <<NUMBER OF RESOURCES OBTAINED>>          <<R2212>>05372000
                                                               <<R2212>>05373000
PDISABLE;                                                      <<R2212>>05416000
IF OWNER = CURPRC THEN                                         <<R2212>>05420000
   BEGIN <<THE CALLER ALREADY OWN THE RESOURCE>>               <<R2212>>05425000
         <<NOTHING DOING HERE !!!!!>>                          <<R2212>>05430000
   PENABLE;                                                    <<R2212>>05435000
   RETURN;                                                     <<R2212>>05440000
   END                                                         <<R2212>>05445000
ELSE                                                           <<R2212>>05450000
   BEGIN <<THE CALLER OBTAINS THIS RESOURCE FOR THE FIRST >>   <<R2212>>05455000
         <<TIME. GET THE RESOURCECNT FROM THE PXFIXED AREA>>   <<R2212>>05460000
         <<AND INCREMENT IT BY ONE.>>                          <<R2212>>05465000
   PXFIXED; <<SET UP TO USE THE PXFIXED INCLUDE FILE>>         <<R2212>>05470000
   TOS := PXFXRSRCCNT;<<PUT THE RESOUCE COUNT ON TOS>>         <<R2212>>05475000
   TOS := TOS + 1;    <<INCREMENT RESOURCE COUNT>>             <<R2212>>05480000
   PXFXRSRCCNT := TOS; <<STORE THE COUNTER BACK >>             <<R2212>>05485000
   IF OWNER = 0 THEN                                           <<R2212>>05490000
      BEGIN <<THE RESOURCE IS FREE, GIVE IT TO THE CALLER>>    <<R2212>>05495000
      OWNER := CURPRC; <<CALLER WILL BE THE NEW OWNER>>        <<R2212>>05500000
      PENABLE;                                                 <<R2212>>05505000
      RETURN;                                                  <<R2212>>05510000
      END                                                      <<R2212>>05515000
   ELSE                                                        <<R2212>>05520000
      BEGIN <<SOME ONE OWNED THE RESOURCE. THE CALLER HAS TO>> <<R2212>>05525000
            <<WAIT IN LINE. RELEASE THE ALTERNATE RESOURCE>>   <<R2212>>05530000
            <<IF SO INSTRUCTED IN 'ALTRES'>>                   <<R2212>>05535000
      IF @ALTRES <> IGNORE THEN                                <<R2212>>05540000
         RELEASE (ALTRES,IGNORE,ONEWAITER);                    <<R2212>>05545000
      QPROC(RESOURCE,CURPRC); <<PUT THE CALLER INTO THE Q'S>>  <<R2212>>05550000
      IF OWNER = DUMMYPIN THEN IMPEDE(0) <<DON'T IMPARED>>     <<R2212>>05555000
      <<BECAUSE THIS RAISES IMPEDERS PRIORITY>>                <<R2212>>05560000
      ELSE IMPAIRED(OWNER/PCBSIZE,@RESOURCE,FALSE);            <<R2212>>05565000
      END;                                                     <<R2212>>05570000
                                                               <<R2212>>05575000
