|
DataMuseum.dkPresents historical artifacts from the history of: RC3500 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC3500 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6144 (0x1800) Types: TextFileVerbose Names: »tadam«
└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system └─⟦6b41451d2⟧ └─⟦this⟧ »tadam«
job bbl 3 600 time 11 0 perm mini 100 1 size 92000 ( platonenv = set bs bblenv ; o adamout head 1 cpu pascal80 codesize.12000 spacing.12000 , short.yes, stack.436, codelist.no ; o c ; convert adamout badam = set 1 mini badam = move pass6code if ok.yes scope project badam finis ) process adam(var operator_sem : semaphore); const default_size = 0; spriority = -1; maxprocs = 6; (* max number of process descriptors *) maxchildren = 10;(* max number of incarnations *) (* states *) unlinked = 0; (* commands *) unknown = 0; adam_link = 1; adam_create = 2; adam_start = 3; adam_stop = 4; adam_remove = 5; adam_unlink = 6; adam_break = 7; (* results *) ok = 0; opsysname = 'opsys '; operatorname = 'operator '; sname = 's '; integerlength = 2; adamtype_length = 2 * alfalength + 1 * integerlength; type adamtype = record name1 : alfa; (* processname *) name2 : alfa; (* incarnationname *) aux : integer (* size, priority or excode *) end; search_modes = (getprocess,getchild); indextype = packed array (unknown..adam_break) of 0..31; tabletype = packed array (0..23) of 0..15; const index = indextype(0,2,9,13,15,17,19,22); table = tabletype(1,15,0,4,3,5,2,?,4,0,6,7,8,0,9,0,10,0,11,0,12,13,0,14); var sem_vector : adamvector; proc : array(1..maxprocs) of process_descriptor; child : array(1..maxchildren) of shadow; adam_sem : semaphore; msg : reference; processname , childname : alfa; param : integer; command : integer; result : integer; i : integer; j : integer; max : integer; procedure initproc(var dest,source : process_descriptor); begin dest := source end; (* initproc *) procedure setmax(mode : search_modes); begin case mode of getprocess: max := maxprocs; getchild : max := maxchildren end end; (* setmax *) function getindex(var index : integer; mode : search_modes) : boolean; var found : boolean := false; begin setmax(mode); index := 0; repeat index := index + 1; case mode of getprocess: with proc(index) do if (name = processname) and (link_state <> unlinked) then found := true; getchild: if not nil(child(index)) then lock child(index).r as inc : ext_incarnation_descriptor do if inc.incname = childname then found := true end until found or (index = max); getindex := found end; (* getindex *) function getfree(var index : integer; mode : search_modes) : boolean; var found : boolean := false; begin setmax(mode); index := 0; repeat index := index + 1; case mode of getprocess: if proc(index).link_state = unlinked then found := true; getchild: if nil(child(index)) then found := true end until found or (index = max); getfree := found end; (* getfree *) function adamcreate(i,j : integer; var name : alfa; p : processrec; size : integer) : integer; begin p.processref := ptraddr(addr_of_proc(proc(i))); adamcreate := create(name,p,child(j),size) end; (* adamcreate *) procedure run(index : integer; name : alfa; p : processrec); var i : integer; begin i := link(name,proc(index)); i := adamcreate(index,index,name,p,default_size); if i = ok then start(child(index),spriority) else i := unlink(proc(index)) end; process s(var sem_vector : system_vector); external; (********************************************************************) (* *) (* adam main program *) (* *) (********************************************************************) begin own.secret_pointer^(adamstack)^.chain := addr_of(own.chain); sem_vector(allocatorsem) := own.secret_pointer^(allocsem); sem_vector(adamsem) := ref(adam_sem); sem_vector(operatorsem) := ref(operator_sem); (* move contents of process_descriptor of s to array *) for i := 1 to maxprocs do initproc(proc(i),s); run(1,operatorname,s(sem_vector)); run(2,opsysname ,s(sem_vector)); run(3,sname ,s(sem_vector)); while true do begin wait(msg,adam_sem); command := unknown; result := 0; (* check size of databuffer *) if msg^.size >= (adamtype_length div integerlength) then begin (* unpack parameters *) lock msg as p : adamtype do begin processname := p.name1; childname := p.name2; param := p.aux end; command := msg^.u1; case command of adam_link: if not getindex(i,getprocess) then begin if getfree(i,getprocess) then result := link(processname,proc(i)) else result := 2 end else result := 4; adam_create: if getindex(i,getprocess) then begin if not getindex(j,getchild) then begin if getfree(j,getchild) then result := adamcreate(i,j,childname,s(sem_vector),param) else result := 1 end else result := 1 end else result := 2; adam_unlink: if getindex(i,getprocess) then result := unlink(proc(i)) else result := 1; adam_start, adam_stop, adam_remove, adam_break: if getindex(i,getchild) then case command of adam_start : start(child(i),param); adam_stop : stop(child(i)); adam_remove: remove(child(i)); adam_break : break(child(i),param) end else result := 1; otherwise command := unknown; result := 1 end; end; msg^.u2 := table(index(command) + result); return(msg) end (* while *) end (* adam *) . «eof»