GDSX Manual
DEVICE^HANDLER Example, Design
Extended General Device Support (GDSX) Manual–134303
5-11
The DEVICE^HANDLER Procedure
swapped in and out, I/O cannot be done from buffers within a task’s data stack. Instead
of declaring local variables for message buffers, I/O buffer space is obtained from the
global memory pools.
The 10 in the GETEXTPOOL call indicates the extended buffer pool. The buffer
allocated is pointed to by @rcv^buf. The take^over variable is used when running this
example as a process pair, and is discussed later in this section.
Then ^READUPDATE is called on dolr^rcv, which represents the pseudo-$RECEIVE
file set up by TSCODE. (The pseudo-$RECEIVE file is indicated by value 0 for all
DEVICE^HANDLER tasks.) Because this is a single-threaded routine, the
^READUPDATE is followed by a ^AWAITIO on dolr^rcv with no timeout specified.
Then there is a check to see what kind of operation is being requested. If the condition
code is equal, ^AWAITIO completed normally, and either a WRITE, a READ, or a
WRITEREAD came in. ^AWAITIO gives the WRITE count (rqstr^wt^ct) that the
requester specified, and ^RECEIVEINFO gives the READ count (rqstr^rd^ct) specified
by the requester and the request type (rqst^type).
If the condition code is > (CCG), a system message was received. The first character of
rcv^buf is examined to determine what kind of system message this is. The only kind
Example 5-3. Reading and Decoding Requests
!===============================================================
! Device^Handler Procedure MAIN ENTRY POINT begins here
!===============================================================
WHILE (1) DO
BEGIN
@RCV^BUF := GETEXTPOOL(10,BUF^SIZE); !EXT BUFFER POOL
IF @RCV^BUF = 0D THEN CALL DEBUG; !(BYTE ADDRESSABLE)
@E^RCV^BUF := @RCV^BUF;
TAKE^OVER := FALSE;
CALL ^READUPDATEX(DOLR^RCV,RCV^BUF,BUF^SIZE);
IF <> THEN CALL DEBUG;
CALL ^AWAITIOX(DOLR^RCV,@RCV^BUF,RQSTR^WT^CT);
IF = THEN ! (CCE) NORMAL COMPLETION
CALL ^RECEIVEINFO(,,,,RQSTR^RD^CT,RQST^TYPE)
ELSE IF > THEN ! (CCG) SYSTEM MSG RECEIVED
BEGIN
IF RCV^BUF[0] = -32 THEN
RQST^TYPE := CTRL
ELSE IF RCV^BUF[0] = -33 THEN
RQST^TYPE := SET^MD
ELSE
CALL DEBUG;
END
ELSE
CALL DEBUG; ! (CCL) ERROR
Note. The USKELEX and USKELEXC example programs include very little error-handling
logic, because error-handling code depends on the application requirements, and extensive
error-handling code would detract from the overall design focus of this tutorial. Adequate error
handling, however, must be included in applications designed for actual production.