app/baisy/2.2.1-schulis/src/aufruf manager

Raw file
Back to index

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;