GDSX Manual
USKELEX and USKELEXC Listings
Extended General Device Support (GDSX) Manual–134303
B-6
USKELEX Listing
@BUF^PTR := WT^IOCB.BUFADDRX;
! MOVE TEXT INTO TASK'S OWN BUFFER
MSG^BUF ':=' BUF^PTR FOR WT^IOCB.IOCNT BYTES;
CALL ^WRITEX(LINE^FILE^NUM,MSG^BUF,WT^IOCB.IOCNT);
IF <> THEN CALL DEBUG;
END;
SUBPROC WT^RD^TO^LINE;
BEGIN
INT .EXT BUF^PTR, .EXT IOCB(IOCB^TEMPLATE);
WHILE ((WT^RD^IOCB^LIST[OLDEST] = 0D) AND ! SKIP CANCELED REQUESTS
(OLDEST <> NEWEST)) DO
CALL INCR^INDEX(OLDEST);
IF (OLDEST = NEWEST) THEN RETURN; ! NO OUTSTANDING REQUESTS
@IOCB := WT^RD^IOCB^LIST[OLDEST];
@BUF^PTR := IOCB.BUFADDRX;
MSG^BUF ':=' BUF^PTR FOR IOCB.IOCNT BYTES;
CALL ^WRITEREADX(LINE^FILE^NUM,MSG^BUF,IOCB.IOCNT,IOCB.CNT);
IF <> THEN CALL DEBUG;
END;
?PAGE
SUBPROC CANCEL^ITC;
BEGIN
INT X;
INT .EXT Q^IOCB(IOCB^TEMPLATE);
IF (OLDEST = NEWEST) THEN CALL DEBUG; ! SANITY CHECK
X := OLDEST;
WHILE (X <> NEWEST) DO ! SCAN LIST LOOKING FOR CANCELED IOCBS
BEGIN
@Q^IOCB := WT^RD^IOCB^LIST[X];
IF (Q^IOCB.STATE = IO^CANCELED) THEN ! (NOTE SPELLING)
BEGIN
WT^RD^IOCB^LIST[X] := 0D; ! MARK AS "CANCELED"
CALL NOTIFY^IO^COMPLETIONX(Q^IOCB); !For Ext Memory IO
END;
CALL INCR^INDEX(X);
END;
IF (WT^RD^IOCB^LIST[OLDEST] = 0D) THEN
BEGIN ! THE WT^RD OUTSTANDING TO LINE WAS CANCELED
CALL ^CANCEL(LINE^FILE^NUM);
IF <> THEN CALL DEBUG;
MSG^BUF ':=' [" D^H TASK STOPPED "];
CALL ^WRITEX(LINE^FILE^NUM,MSG^BUF,18);
IF <> THEN CALL DEBUG;
CALL WAIT^EVENT(DISP^IOC,-1D); ! WAIT FOR
! ^WRITE TO COMPLETE
@LINE^IOCB := ^LISTEN(0,LINE^FILE^NUM,0);
IF @LINE^IOCB = 0D THEN CALL DEBUG;
CALL DEALLOCATEIOCB(LINE^IOCB);
CALL WT^RD^TO^LINE; ! ADVANCE TO NEXT QUEUED REQUEST (IF ANY)
END;
END; ! SUBPROC