/* MAILBOX - Programm zur Demonstration des Task-Kommunikations systems. Autor : Karl Hermann Fuchs MPI f. biophysikalische Chemie Am Fassberg 3400 Goettingen Datum: 4. Mai 1988 */ MODULE MAILBOX; /*-L*/ SYSTEM; TTY: LD/12,0/.terminal <->; A1; A2; A3: LD/4,0/ <->; PROBLEM; SPECIFY TTY DATION INOUT ALPHIC CONTROL(ALL); SPECIFY A1 DATION INOUT ALPHIC CONTROL(ALL); SPECIFY A2 DATION INOUT ALPHIC CONTROL(ALL); SPECIFY A3 DATION INOUT ALPHIC CONTROL(ALL); SPECIFY ASSIGN ENTRY (DATION INOUT ALPHIC CONTROL(ALL) IDENT, CHAR(24)) GLOBAL; SPECIFY QOpen ENTRY (BIT(32) IDENT,FIXED(15)) GLOBAL; SPECIFY QClose ENTRY (BIT(32)) GLOBAL; SPECIFY QDelet ENTRY (BIT(32)) GLOBAL; SPECIFY QWrite ENTRY (BIT(32),FIXED(15)IDENT) RETURNS (FIXED(15)) REENT GLOBAL; SPECIFY QRead ENTRY (BIT(32),FIXED(15) IDENT) RETURNS (FIXED(15)) REENT GLOBAL; TYPE Message STRUCT [ size FIXED(15), time CLOCK, user CHAR(10), message CHAR(80) ]; DCL queue1 BIT(32); DCL queue2 BIT(32); DCL queue3 BIT(32); DCL done1 SEMA PRESET(0); DCL done2 SEMA PRESET(0); DCL done3 SEMA PRESET(0); Serve1 : TASK PRIO 18 RESIDENT; DCL mes Message; WHILE QRead(queue1,mes.size) == 0 REPEAT PUT 'Nachricht von ',mes.user,' um ',mes.time TO A1 BY A,A,A,T(8),SKIP; PUT mes.message TO A1 BY A,SKIP; END; RELEASE done1; END; Serve2 : TASK PRIO 18 RESIDENT; DCL mes Message; WHILE QRead(queue2,mes.size) == 0 REPEAT PUT 'Nachricht von ',mes.user,' um ',mes.time TO A2 BY A,A,A,T(8),SKIP; PUT mes.message TO A2 BY A,SKIP; END; RELEASE done2; END; Serve3 : TASK PRIO 18 RESIDENT; DCL mes Message; WHILE QRead(queue3,mes.size) == 0 REPEAT PUT 'Nachricht von ',mes.user,' um ',mes.time TO A3 BY A,A,A,T(8),SKIP; PUT mes.message TO A3 BY A,SKIP; END; RELEASE done3; END; MAIL : TASK PRIO 18 RESIDENT GLOBAL; DCL mes Message; DCL rec FIXED(15); DCL status FIXED(15); CALL ASSIGN(TTY,'TY'); mes.size = 94; PUT 'Sender: ' TO TTY; GET mes.user FROM TTY BY A; PUT 'Zieladresse (1/2/3): ' TO TTY BY SKIP,A; GET rec FROM TTY BY F(3); mes.time = NOW; PUT 'Nachricht: ' TO TTY BY SKIP,A; GET mes.message FROM TTY BY A; CASE rec ALT status = QWrite(queue1,mes.size); ALT status = QWrite(queue2,mes.size); ALT status = QWrite(queue3,mes.size); OUT status = 2; FIN; CASE status+2 ALT PUT 'Kein dynamischer Speicher verfuegbar' TO TTY BY SKIP,A; ALT PUT 'Nachricht gesendet.' TO TTY BY SKIP,A; ALT PUT 'Ziel-Server ist nicht aktiv' TO TTY BY SKIP,A; ALT PUT 'Falsche Zieladresse!' TO TTY BY SKIP,A; FIN; END; MAILINIT : TASK GLOBAL; CALL QOpen(queue1,20); CALL QOpen(queue2,20); CALL QOpen(queue3,20); IF (queue1 == TOBIT 0) OR (queue2 == TOBIT 0) OR (queue3 == TOBIT 0) THEN CALL ASSIGN(TTY,'TY'); PUT 'Kein dynamischer Speicher!' TO TTY BY SKIP; ELSE ACTIVATE Serve1; ACTIVATE Serve2; ACTIVATE Serve3; FIN; END; MAILEXIT : TASK GLOBAL; CALL QClose(queue1); CALL QClose(queue2); CALL QClose(queue3); REQUEST done1; REQUEST done2; REQUEST done3; CALL QDelet(queue1); CALL QDelet(queue2); CALL QDelet(queue3); END; MODEND;