GDSX Manual
Intertask Communication Example
Extended General Device Support (GDSX) Manual–134303
E-5
USAMPLE3
118. INT .EXT MY^DCB (DCB^TEMPLATE);
119. INT .EXT MY^TCB (TCB^TEMPLATE);
120. INT .EXT RCV^IOCB (IOCB^TEMPLATE);
121. INT .EXT ITC^IOCB (IOCB^TEMPLATE);
122. INT .EXT DEV^IOCB (IOCB^TEMPLATE);
123. INT .EXT Itc^Fcb (FCB^TEMPLATE);
124.
125. INT .EXT TERM^BUF := 0D;
126. STRING .EXT S^TERM^BUF = TERM^BUF;
127. INT .EXT RCV^BUF := 0D;
128. STRING .EXT S^RCV^BUF = RCV^BUF;
129.
130. INT .EXT Buffptr := 0D;
131. INT .EXT ITC^Buf := 0D;
132.
133. Int Error := 0;
134. Int Term^Buf^Len := 0;
135. Int(32) W^Fcbaddr := -1D;
136. Int(32) W^Dcbaddr := 0D;
137. Int DOLR^RCV := 0;
138. Int All^Files := -1;
139. Int .EXT Fcb^Ptr := 0D;
140. Int EVT := 0;
141. Int Rcv^ITC^Fnum := 0;
143. !=====================================================================
144. ! DEVICE^HANDLER Procedure MAIN ENTRY POINT begins here
145. !=====================================================================
146. -- find out who we are
147. @MY^DCB := DCBTBL[INTERNAL^TERM^NO];
148. @MY^TCB := MY^DCB.TCBADDR;
149.
150. -- reserve all the buffers we need
151. @RCV^BUF := GETEXTPOOL(11,66); ! from extended message pool
152. IF @RCV^BUF = 0D THEN
153. CALL DEBUG;
154.
155. @Term^BUF := GETEXTPOOL(11,66); ! from extended message pool
156. IF @Term^BUF = 0D THEN
157. CALL DEBUG;
158.
159. @ITC^BUF := GETEXTPOOL(11,69); ! from extended message pool
160. IF @ITC^BUF = 0D THEN
161. CALL DEBUG;
162.
163. -- open an ITC file so we can receive ITC messages
164. If Error := Itc^OpenX (My^Tcb,Rcv^ITC^Fnum) Then
165. Rcv^ITC^Fnum := -1;
166.
167. -- do the initial ^READUPDATE on $RECEIVE
168. CALL ^READUPDATEX(DOLR^RCV,RCV^BUF,132);
169.
170. -- do the initial ^READUPDATE on our ITC file
171. If Rcv^ITC^Fnum > 0 Then
172. Call ^ReadupdateX(Rcv^ITC^Fnum);
174. -- do the endless loop
175 While 1 Do Begin
176.
177. Evt := Wait^Event ((Disp^Imsg + Disp^IOC + Disp^ITC + Disp^Stop), -
1D);
178.
179. Case Evt of Begin
180. ------
181. E^IMSG -> ! from $RECEIVE
182. ------
183. Begin
184. -- get the address of the IOCB
185. @Rcv^Iocb := ^Listen (1,0,0);
186. @BuffPtr := RCV^Iocb.BufaddrX;
187.
188. If Rcv^Iocb.Err = 6 Or Buffptr = -32 Then Begin
189. -- this is a system message or a control message to the
task
190. Call ^ReplyX();
191. -- read the next message