$include(subsys.inc) /**************************************************************************** * * MODULE NAME: task2 (Note: module name should always be the same as * the source file name without the extension) * * DESCRIPTION: This is the second task, it receives a character from * a mailbox and echos it to the console until it receives * another character and then it starts echoing the new * character. It also returns a semaphore unit to the * sending task to acknowledge the receipt ot each character. * * SYSTEM CALLS: s$create$file,s$open,lookup$object,receive$message, * create$mailbox,send$units,a$write,wait$io. * ****************************************************************************/ task2: DO; $include(:rmx:inc/rmxplm.ext) $include(:rmx:inc/common.lit) $include(:rmx:inc/error.lit) $include(:rmx:inc/nstexh.lit) $include(:rmx:inc/io.lit) $if r_32 $else DECLARE WORD_16 LITERALLY 'WORD', WORD_32 LITERALLY 'DWORD', SIZE$OF$WORD LITERALLY 'WORD_16'; $endif /* external procedures */ set$exception: PROCEDURE(except$mode) EXTERNAL; DECLARE except$mode BYTE; END set$exception; error$check: PROCEDURE(number,test$status) EXTERNAL; DECLARE number WORD, test$status WORD; END error$check; $subtitle('task2') task2: PROCEDURE REENTRANT PUBLIC; DECLARE co$conn CONNECTION$TOKEN, write$mbx MAILBOX$TOKEN, mail$box MAILBOX$TOKEN, pool$tkn TOKEN, semaphore SEMAPHORE$TOKEN, buff$tkn TOKEN, buff2$tkn TOKEN; DECLARE status WORD, actual SIZE$OF$WORD; DECLARE message(*) BYTE DATA (CR,LF,'TASK2 PROCESSING '); CALL set$exception(NO$EXCEPTIONS); co$conn=rq$s$create$file (@(4,':co:'), @status); CALL error$check(500,status); CALL rq$s$open (co$conn, WRITE$ONLY, 0, @status); CALL error$check(510,status); mail$box = rq$lookup$object (CALLER, @(3,'MBX'), INFINITE$WAIT, @status); CALL error$check(520,status); pool$tkn = rq$lookup$object (CALLER, @(6,'BUFFER'), INFINITE$WAIT, @status); CALL error$check(530,status); buff$tkn = selector$of(NIL); buff2$tkn = rq$receive$message (mail$box, INFINITE$WAIT, @semaphore, @status); write$mbx = rq$create$mailbox (FIFO$QUEUING, @status); DO FOREVER; IF status = E$OK THEN DO; CALL rq$a$write (co$conn, @message, size(message), write$mbx, @status); CALL error$check(540,status); actual = rq$wait$io (co$conn, write$mbx, INFINITE$WAIT, @status); CALL error$check(550,status); IF buff$tkn <> selector$of(NIL) THEN DO; CALL rq$release$buffer(pool$tkn,buff$tkn,0,@status); CALL error$check(560,status); END; buff$tkn = buff2$tkn; CALL rq$send$units (semaphore, 1, @status); CALL error$check(590,status); END; ELSE IF status <> E$TIME THEN CALL error$check(600,status); /* In a 'real' program this is where you would normally process the data */ CALL rq$a$write (co$conn, build$ptr(buff$tkn,0), 1, write$mbx, @status); CALL error$check(610,status); actual = rq$wait$io (co$conn, write$mbx, INFINITE$WAIT, @status); CALL error$check(620,status); buff2$tkn = rq$receive$message (mail$box, 100, @semaphore, @status); END; END task2; END task2;