1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
PACKET aufrufmanagerDEFINES starteaufrufmanager:LET ack=0,nak=1,naksingletask
=2;LET modussingleuser=1;PROC starteaufrufmanager:starteaufrufmanager(0)END
PROC starteaufrufmanager;PROC starteaufrufmanager(INT CONST modus):TASK VAR
sohn;initialisiere;REP warteaufdatenbankkennungundkanal;IF korrektTHEN
gruendesohntaskmitkanalnrunddatenbankkennungFI PER .initialisiere:break;
disablestop;setautonom;initsybifunktionen;.warteaufdatenbankkennungundkanal:
TASK VAR sender;INT VAR kanalnr;DATASPACE VAR datenbankkennung;clearerror;
wait(datenbankkennung,kanalnr,sender).korrekt:NOT iserror.
gruendesohntaskmitkanalnrunddatenbankkennung:IF modus=modussingleuserCAND
sohntaskschoneingerichtetTHEN quittung:=naksingletask;send(sender,quittung,
niltask)ELSE gruendesohntask;meldesohnnameansenderFI .gruendesohntask:
gruenden;IF korrektTHEN mitkanalnrunddatenbankkennungversorgenFI .gruenden:
begin(PROC stellvertreter,sohn).mitkanalnrunddatenbankkennungversorgen:BOOL
VAR erfolg;call(sohn,kanalnr,datenbankkennung,erfolg).meldesohnnameansender:
INT VAR quittung;IF erfolgTHEN quittung:=ackELSE quittung:=nakFI ;send(sender
,quittung,sohn).END PROC starteaufrufmanager;BOOL PROC
sohntaskschoneingerichtet:accesscatalogue;exists(son(myself))END PROC
sohntaskschoneingerichtet;PROC stellvertreter:
warteaufkanalnrunddatenbankkennung;geheaufkanalundsetzewerte;IF erfolgTHEN
warteaufauftrag;fuehreauftragausFI ;selbstmord.erfolg:NOT iserror.selbstmord:
end(myself).warteaufkanalnrunddatenbankkennung:disablestop;DATASPACE VAR ds;
TASK VAR vater;INT VAR kanalnr;wait(ds,kanalnr,vater).
geheaufkanalundsetzewerte:INT VAR quittung;IF erfolgTHEN #quittung:=ack;
oeffnedatenbank(ds)#datenbankeneroeffnenELSE quittung:=nakFI ;continue(
kanalnr);send(vater,quittung,ds);forget(ds);initmeldungsfunktionen.
datenbankeneroeffnen:oeffnedatenbank;fetchdd(schulisdbname);IF dbopen(
schulisdbname)THEN systemdboff;quittung:=ackELSE quittung:=nakFI .
warteaufauftrag:INT VAR knotenname;TASK VAR auftraggeber;REP wait(ds,
knotenname,auftraggeber)UNTIL korrekterauftragPER .korrekterauftrag:
knotenname>0.fuehreauftragaus:setzesystembaumundaktuellenknoten(ds,knotenname
);starteanwendung;IF erfolgTHEN quittung:=ackELSE quittung:=nakFI ;break(
quiet);send(auftraggeber,quittung,ds);forget(ds).END PROC stellvertreter;
PROC call(TASK CONST zielmanager,INT CONST kanal,DATASPACE VAR ds,BOOL VAR
erfolg):INT VAR replycode;call(zielmanager,kanal,ds,replycode);erfolg:=
replycode=ack;forget(ds)END PROC call;PROC send(TASK CONST sender,INT CONST
quittung,TASK CONST sohn):DATASPACE VAR ds:=nilspace;IF quittung=ackTHEN
BOUND TASK VAR t:=ds;t:=sohnFI ;send(sender,quittung,ds);forget(ds)END PROC
send;END PACKET aufrufmanager;
|