GDSX Manual
LINE^HANDLER Example, Design
Extended General Device Support (GDSX) Manual–134303
7-17
LINE^HANDLER Procedure
When a WRITE to the IOP completes, the proper IOCB to return to the
DEVICE^HANDLER task is wt^iocb. When a WRITEREAD to the IOP completes, the
proper IOCB is pointed to by the oldest entry on the wt^rd^iocb^list.
All file-system error handling is to be done by the requester process.
Note that the IOCB associated with a ^WRITEREAD to the LINE file is given by the
oldest element on the wt^rd^iocb^list, and that this IOCB is not removed from the queue
when the ^WRITEREAD completes, but only when the following ^WRITE completes,
ensuring that the ^WRITEREAD-^WRITE transaction is not interrupted by other
Example 7-5. LINE^IO^CMPLT Subprocedure
SUBPROC LINE^IO^CMPLT;
BEGIN
INT .EXT DH^BUF;
INT .EXT LH^BUF;
@LINE^IOCB := ^LISTEN(0,LINE^FILE^NUM,0);
IF @LINE^IOCB = 0D THEN RETURN;
CASE LINE^IOCB.OPTYPE OF
BEGIN
WT^OP -> ! THE SINGLE OUTSTANDING WRITE OP IS FINISHED
BEGIN
WT^IOCB.ERR := LINE^IOCB.ERR; ! PASS I/O
! PROCESS FS ERR BACK
CALL NOTIFY^IO^COMPLETIONX(WT^IOCB);
CALL INCR^INDEX(OLDEST);
! TAKE THIS WT^RD OFF THE LIST
IF (OLDEST <> NEWEST) THEN ! MORE WT^RDS PENDING
CALL WT^RD^TO^LINE;
END;
WT^RD^OP -> ! OLDEST WT^RD ON LIST IS FINISHED
BEGIN ! AND TEXT HAS BEEN READ AT THE PROMPT
@DH^IOCB := WT^RD^IOCB^LIST[OLDEST];
@DH^BUF := DH^IOCB.BUFADDRX;
@LH^BUF := LINE^IOCB.BUFADDRX;
IF (LINE^IOCB.ERR = 0) THEN
BEGIN ! NORMAL COMPLETION
DH^BUF ':=' LH^BUF FOR LINE^IOCB.IOCNT BYTES;
DH^IOCB.IOCNT := LINE^IOCB.IOCNT;
DH^IOCB.ERR := 0;
END
ELSE
BEGIN ! PASS I/O PROCESS FS ERR BACK TO APPL
DH^IOCB.IOCNT := 0;
DH^IOCB.ERR := LINE^IOCB.ERR;
END;
CALL NOTIFY^IO^COMPLETIONX(DH^IOCB);
END;
OTHERWISE ->
CALL DEBUG;
END; ! CASE
CALL DEALLOCATEIOCB(LINE^IOCB); ! TSCODE ALLOCATED THIS IOCB
END; ! SUBPROC