ORIGIN '~beta/basiclib/systemenv'; ---program: descriptor--- (*Ez a program egy billentyuzetbuffernek a megvalositasa a beepitett monitor minta segitsegevel. A monitor almintaja a condition, amelyben egy semaphore van, es ket "szlotja" , a wait es a signal. A wait hatasara futasa felfuggesztodik, a signal hatasara ujra munkahoz lat. *) SystemEnv (# buffer: @Monitor (# R: [20] @char; in,out: @integer; full,empty: @Condition; put: Entry (# ch: @char enter ch do (if in = out then full.wait if); (*Ha a buffer betelik, a put Entry futasa felfuggesztodik, egeszen addig, amig nem kap egy full.signal-t*) ch->R[in]; (in mod R.range)+1 ->in; (*Ide mar csak akkor juthatott el a program, ha a buffer elozoleg nem volt tele. Miutan itt most betettunk egy elemet, biztos, hogy a buffer nem lesz ures. Viszont lehet, hogy volt valahol egy empty.wait, ezert meghivja az empty.signal-t, hogy biztos ami biztos, felebressze.*) empty.signal; #); get: Entry (# ch: @char do (if in = (out mod R.range)+1 then empty.wait if); (*Ha a buffer kiurul, a get Entry futasa felfuggesztodik, egeszen addig, amig nem kap egy empty.signal-t*) R[(out mod R.range)+1->out]->ch; full.signal; (*Ide mar csak akkor juthatott el a program, ha a buffer elozoleg nem volt ures. Miutan itt most kivettunk egy elemet, biztos, hogy a buffer nem lesz tele. Viszont lehet, hogy volt valahol egy full.wait, ezert meghivja az full.signal-t, hogy biztos ami biztos, felebressze.*) exit ch #); init::< (# do 1->in; R.range->out #) (*inicializalas*) #); prod: @| System(# do cycle(# do keyboard.get->buffer.put #) #); cons: @| System(# do cycle(# do buffer.get->screen.put #) #); (*A prod es a cons a System minta kiterjesztett egyedi mintaja. A @| hatasara derul ki, hogy parhuzamos szalakrol van szo*) do buffer.init; conc(# do prod[]->start; cons[]->start #) (*A conc minta egy parhuzamos szintu minta, nem terminal, amig minden egyes elinditott szala nem terminal*) #)