This procedure is called to handle interrupts from the line printer. As mentioned above, most potential interrupts are ignored by the processor. Those interrupts which are accepted by the CP will be associated with either
completion of a print cycle; or
the printer going ready after a period during which the “Error” bit was set; or
the last transfer in a series of character transfers;
Start transferring characters into the printer buffer again;
Wakeup the process waiting to feed characters to the printer if the number of characters waiting to be sent is either zero or exactly “LPLWAT” (8818).
This latter condition is somewhat puzzling in that it will only occasionally be satisfied. The intention surely is “if the number of characters in the list is getting low, start refilling”. However if “lpstart” carries out a series of transfers without interruption (at least by “lpint”) the number of characters could go from a value greater than “LPLWAT” to one less than this without this test ever being made. Accordingly the waiting process will not be awakened until the list is completely empty. The result could be frequently to delay the initiation of the next print cycle, and hence to allow the printer to run below its rated capacity.
One solution to this problem is to change entirely the buffering strategy for line printers. A less drastic change would involve inventing a new flag, “lp11.wflag” say, replacing lines 8981, 8982 by something like
if (lp11.cc <= LPLWAT && lp11.wflag) { wakeup (&lp11); lp11.wflag = 0 }
and replacing line 8989 by
{ lp11.wflag++; sleep(&lp11, LPRI); }