http://www.adaconcept.com/programs/metros_szimulacio/metros_szimulacio_elemei.ads
-- Nehany fontos megjegyzes:
-- a megvalositas soran meg nem hasznalunk gyerekcsomagokat (, majd a halado programoknal :) )
-- Egy taszk a szulo (programegyseg) deklarácios reszenek kiertekelese utan, a szulo elso utasitasa elott, vagy az allokator kiertekelesekor indul el
-- Minden entry-hez kell lennie legalabb egy accept utasitasnak a taszk torzseben
-- Minden entry kulon varakozasi sorral rendelkezik, amelybe a hivok beallhatnak (szamukat az entry 'Count attributumaval kerdezhetjuk le, amennyiben szuksegunk van ra)
-- Az accept utasitas blokkol!, (select eseten az egyik nyitott agra erkezo hivas elfogadasaig)
-- ( Tovabbi fontos attributumok: 'Callable , 'Terminated )
package metros_szimulacio_elemei is
Metrok_szama : constant positive := 2; -- a szimulacioban resztvevo metrok szama
type M_string is access string;
package Peronfal is
-- Biztonsagkritikus rendszerekben gyakran hasznalt trukk: "interface jellegu" biztonsagi megoldas
-- azert generikus, mert igy a Peronfal hasznaloja veletlenul nem tudja meghivni, csak, ha peldanyositja a hivas elott,
-- (igy pl. nehezebb gepelesi hiba miatt hibas funkcionalitast leprogramozni)
-- A generikus eljaras a kovetkezo hivast tartalmazza:
-- Fal.Utasok_szerelvenyre_engedesenek_megtiltasa; -- az ilyen kommentek nehezitik a kesobbi karbantartast
generic
procedure Utasok_szerelvenyre_engedesenek_megtiltasa;
-- az elozo megoldas egy valtozata amelyben a Peronfal_taszk-ot ket fuggetlen taszk-ra valsztjuk szet ( + beagyazas ), a kommunikacio a ket taszk kozott egy privat vedett egysegen keresztul tortenik
package Utas is
task Peronfal_taszk is
entry Metrora_var(varakozo_utas_neve : M_string); -- ennek az entry-nek a varakozasi soraba allnak majd be az utasok
end Peronfal_taszk;
end Utas;
package Szerelveny is
task Peronfal_taszk is
entry Szerelveny_beall_az_allomasra(varakozo_szerelveny_szama : M_string); --| ezeknek az entry-knek a varakozasi soraiba allnak majd be a szerelvenyek
entry Szerelveny_elhagyja_az_allomast(varakozo_szerelveny_szama : M_string); --|
end Peronfal_taszk;
end Szerelveny;
private
type peronfal_allapotok is (ajtok_zarva, ajtok_nyitva);
protected Fal is
-- Az "aktualis_peronfal_allapot" valtozo ertekenek lekerdezesere szolgalo fuggveny
function Allapot return peronfal_allapotok;
-- Az "utasok_szerelvenyre_engedese_engedelyezett" valtozo ertekenek lekerdezesere szolgalo fuggveny
function Engedhetok_utasok_a_szerelvenyre return boolean;
-- Az "aktualis_peronfal_allapot" valtozo erteket "ajtok_zarva" allapotra allitja, ha az "ajtok_nyitva" allapotban van
entry Ajtot_zar;
-- Az "aktualis_peronfal_allapot" valtozo erteket "ajtok_nyitva" allapotra allitja, ha az "utasok_szerelvenyre_engedese_engedelyezett" (= true) es az "ajtok_zarva" allapotban van
entry Ajtot_nyit;
-- Az "utasok_szerelvenyre_engedese_engedelyezett" valtozo erteket hamisra allitja
procedure Utasok_szerelvenyre_engedesenek_megtiltasa;
private
utasok_szerelvenyre_engedese_engedelyezett : boolean := true;
aktualis_peronfal_allapot : peronfal_allapotok := ajtok_zarva;
end Fal;
end Peronfal;
package Szerelvenyek is
task type Metro_taszk_tipus(szerelveny_szam : M_string); -- csak taszk tipus-nak lehet diszkriminansa / parametere
type M_Metro is access Metro_taszk_tipus; -- mutato tipus gyujtotipusa egy taszk tipus
type metrok is array(positive range <>) of M_Metro;
private
type metro_allapotok is (egyeb, allomason_varakozik, halad); -- egyeb pl. garazsban all...
end Szerelvenyek;
package Emberek is
task type Utas(utas_nev : M_string);
type M_Utas is access Utas; -- mutato tipus gyujtotipusa egy taszk tipus
task Turelmetlen_utas; -- nincsen parametere, nem tipus
end Emberek;
metroszerelvenyek : Szerelvenyek.metrok(1..Metrok_szama);
private
-- Szemafor megvalositasa taszk-tipussal, szamlaloval
task type Szemafor_taszk_tipus(atengedheto_metrok_szama : natural) is
entry P; -- Dijkstra utan...
entry V; -- Dijkstra utan...
end Szemafor_taszk_tipus;
Szemafor : Szemafor_taszk_tipus(Metrok_szama); -- probaljuk ki mi torteneik, ha ide 0 -at irunk Metrok_szama helyett
end metros_szimulacio_elemei;