GDSX Manual

LINE^HANDLER Example, Design
Extended General Device Support (GDSX) Manual134303
7-18
LINE^HANDLER Procedure
threads. When the ^WRITE completes, the IOCB is removed from the queue by
incrementing the oldest index.
Cancel^ITC Procedure
Example 7-6 shows the code for the CANCEL^ITC subprocedure. Most of this
procedure is described under “E^CAN” on page 7-11.
Before this procedure is called, TSCODE finds the IOCB associated with the canceled
request and puts the IOCB in a canceled state by setting iocb.state equal to
IO^CANCELED. When the LINE^HANDLER task scans the queue of IOCBs, a list
item marked for cancellation is set to 0 to indicate the cancellation. In the
WT^RD^TO^LINE SUBPROC, list items equal to 0 are skipped when the queue is
scanned for the next IOCB address for a ^WRITEREAD.
Caution. Although TSCODE handles deallocation of IOCBs for intertask communication
completed with NOTIFY^IO^COMPLETION, it will not deallocate LINE IOCBs. If the LINE
IOCB is not deallocated, eventually the GDSX process runs out of IOCBs. The default for the
maximum number of IOCBs is 128.
Example 7-6. CANCEL^ITC Subprocedure
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);
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