/*+T*/ /*+M*/ /* FILE: sMESS SUBTASKGENERIERUNG DURCH NEUE SHELL-BEFEHLE AUFRUF VON PEARL-PROZEDUREN DURCH DIESE SUBTASKS, PARAMETERUEBERGABE AN PEARL-PROGRAMME FUER RTOS V2.1 UND AELTER (DIE DINGE MOEGEN SICH IN NICHT ALLZUFERNER ZUKUNFT AENDERN LAUT IEP) ES IST IN DER REGEL NOETIG, TIMESHARING FUER DIE PRIORITAET DER SUBTASKS ZU AKTIVIEREN 25.05.1988 ROLF HEMMERLING, IM MOORE 39 3000 HANNOVER 1 TEL 0511/708457 */ /* BEISPIEL: AUSGABE EINER MELDUNG AN DIE/DEN ANDEREN BENUTZER A) DURCH einen BEDIENBEFEHL, B) SUBTASK-GENERIERUNG FUER jeden BENUTZER EINMAL MOEGLICH, C) BENUTZUNG derselben PROZEDUREN ZUR EIN/AUSGABE D) gleichzeitige EINGABE VON DATEN DURCH verschiedene BENUTZER IN DERSELBEN PROZEDUR ZUR gleichen ZEIT JE NACHDEM WAS DER/DIE ANDEREN BENUTZER TUN,KANN ES SEIN, DASS DIE MELDUNG ERST SPAETER DURCHKOMMT (Z.B BEI WARTEN AUF EINGABE. */ /* DIE SUBTASK-PRIO MUSS IM ASSEMBLERTEIL EINGESTELLT WERDEN -> LABEL "DEFPR", UND DANACH RICHTET SICH DIE ANZUGEBENDE PRIO BEIM SHARE-KOMMANDO, DIE (DEZIMAL ANZUGEBEN) UM EINS NIEDRIGER SEIN MUSS ALS DEFPR FUER DIESES BEISPIEL MUSS IM ASSEMBLERTEIL GESETZT SEIN TRSUB EQU 1 TMJOB EQU 0 DEFPR EQU 9 ==> UND DAMIT DAS SHELL-KOMMANDO "SHARE PRIO 8" NOETIG */ MODULE MESS; SYSTEM; /* USER 1 DATIONS */ DA1:A1; DB1:B1; DC1:C1; DD1:D1; D1ED:ED.DUMMY/LONGNAME; D1F0:F0.DUMMY/LONGNAME; D1F1:F1.DUMMY/LONGNAME; D1F2:F2.DUMMY/LONGNAME; D1PP:PP.DUMMY/LONGNAME; D1VI:VI.DUMMY/LONGNAME; D1VO:VO.DUMMY/LONGNAME; D1XC:XC.DUMMY/LONGNAME; /* USER 2 DATIONS */ DA2:A2; DB2:B2; DC2:C2; DD2:D2; D2ED:ED.DUMMY/LONGNAME; D2F0:F0.DUMMY/LONGNAME; D2F1:F1.DUMMY/LONGNAME; D2F2:F2.DUMMY/LONGNAME; D2PP:PP.DUMMY/LONGNAME; D2VI:VI.DUMMY/LONGNAME; D2VO:VO.DUMMY/LONGNAME; D2XC:XC.DUMMY/LONGNAME; PROBLEM; /* USER 1 DATIONS */ SPC DA1 DATION INOUT ALPHIC CONTROL(ALL); SPC D1ED DATION INOUT ALPHIC CONTROL(ALL); SPC D1F0 DATION INOUT ALPHIC CONTROL(ALL); SPC D1F1 DATION INOUT ALPHIC CONTROL(ALL); SPC D1F2 DATION INOUT ALPHIC CONTROL(ALL); SPC D1PP DATION OUT ALPHIC CONTROL(ALL); SPC D1VI DATION IN ALPHIC CONTROL(ALL); SPC D1VO DATION OUT ALPHIC CONTROL(ALL); SPC D1XC DATION OUT ALPHIC CONTROL(ALL); /* USER 2 DATIONS */ SPC DA2 DATION INOUT ALPHIC CONTROL(ALL); SPC D2ED DATION INOUT ALPHIC CONTROL(ALL); SPC D2F0 DATION INOUT ALPHIC CONTROL(ALL); SPC D2F1 DATION INOUT ALPHIC CONTROL(ALL); SPC D2F2 DATION INOUT ALPHIC CONTROL(ALL); SPC D2PP DATION OUT ALPHIC CONTROL(ALL); SPC D2VI DATION IN ALPHIC CONTROL(ALL); SPC D2VO DATION OUT ALPHIC CONTROL(ALL); SPC D2XC DATION OUT ALPHIC CONTROL(ALL); TYPE KDOSTR CHAR(128); SPC GETUN ENTRY RETURNS(FIXED(15)) GLOBAL; /* GET USER NUMBER */ /* ENTRY PROC FROM SUBTASK */ SPC MAIN ENTRY( KDOSTR IDENT,FIXED(15), DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT, DATION INOUT ALPHIC CONTROL(ALL) IDENT ); SPC ASSIGN ENTRY (DATION INOUT ALPHIC CONTROL(ALL) IDENT,CHAR(24)) GLOBAL; SPC (WRITE,READ) ENTRY GLOBAL; DCL USERANZAHL FIXED(15) INIT(2); /* USER1,USER2 IM SYSTEM */ /* EINGABE DURCH AUGENBLICKLICHEN USER */ EINGABE: PROC(DAX DATION INOUT ALPHIC CONTROL(ALL) IDENT, NUMEIN FIXED(15) IDENT); GET NUMEIN FROM DAX BY SKIP,LIST; END; /* AUSGABE DES STRINGS AUF ANGEGEBER PHYSIKALISCHER DATION */ AUSGABE: PROC(DAX DATION INOUT ALPHIC CONTROL(ALL) IDENT, ARGAUS KDOSTR,LENAUS FIXED(15),DATAUS CHAR(2)); CALL ASSIGN(DAX,DATAUS); /* UMSCHALTEN AUF'S ANDERE TERMINAL */ PUT ARGAUS TO DAX BY SKIP,A(LENAUS),SKIP; CALL ASSIGN(DAX,'TY'); /* ZURUECK AUF'S EIGENE TERMINAL */ END; MAIN: PROC( ARG KDOSTR IDENT,ARGLEN FIXED(15), (DAX,DBX,DCX,DDX,DXED,DXF0,DXF1, DXF2,DXPP,DXVI,DXVO,DXXC) DATION INOUT ALPHIC CONTROL(ALL) IDENT ) GLOBAL; DCL USERNUMBER FIXED(15); CALL ASSIGN(DAX,'TY'); USERNUMBER:= GETUN; /* GET USER NUMBER */ DCL NUM FIXED(15); PUT '<< BEISPIEL FUER PEARL-SUBTASK >>' TO DAX BY LIST,SKIP; PUT '<< MIT UEBERGABE DER KOMMANDO-ZEILE AN DAS PROGRAMM >>' TO DAX BY LIST,SKIP; PUT '<< SENDEN EINER 1-ZEILEN-MELDUNG ZUM ANDEREN TERMINAL >>' TO DAX BY LIST,SKIP; PUT '<< DIE LAENGE DER KOMMANDOZEILE WAR: ',ARGLEN, ' >>' TO DAX BY LIST,LIST,LIST,SKIP; PUT '<< DIE KOMMANDOZEILE LAUTETE, EINGERAHMT VON (") : >>' TO DAX BY LIST,SKIP; /* NACH DEM ENDE DES GUELTIGEN STRINGS STEHT $FF, WIRD ABER NICHT MITAUSGEGEBEN */ PUT '"',ARG,'"' TO DAX BY LIST,A(ARGLEN),LIST,SKIP; PUT '<< DRUECKE 0, UM DIE MELDUNG ABZUSCHICKEN, >>', '<< 1, UM DIE UEBERMITTLUNG ZU VERHINDERN >>', '<< 2, UM DIESE TASK ZU SUSPENDIEREN >>' TO DAX BY LIST,SKIP,LIST,SKIP; CALL EINGABE(DAX,NUM); CASE NUM+1 ALT /* MELDUNG ABSCHICKEN */ FOR I FROM 1 TO USERANZAHL REPEAT CASE USERNUMBER-I+1 ALT PUT '<< DIE MELDUNG WURDE ABGESCHICKT >>' TO DAX BY LIST,SKIP; OUT CALL AUSGABE(DAX,ARG,ARGLEN,'A'>>' TO DAX BY LIST,SKIP; ALT /* TASK SUSPENDIEREN */ PUT '<< DIE TASK WIRD SICH NUN SUSPENDIEREN >>' TO DAX BY LIST,SKIP; SUSPEND; PUT '<< DIE TASK WURDE WIEDER AUFGEWECKT >>' TO DAX BY LIST,SKIP; FIN; /* CASE */ END; /* PROC */ MODEND;