|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 14592 (0x3900) Types: TextFile Names: »treadsub«
└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦this⟧ »treadsub«
<*reads a submit command from a console 1982.04.15 Anders Lindgård*> boolean procedure readsubmit(c_buffer,very,descriptor,bsnameset); value bsnameset; boolean bsnameset; zone c_buffer,very; integer array descriptor; begin integer i,j,syntax,notallowed,bs_name, command,commandtype,del,int,nexttype, res,errortype; integer array param(1:3),bserror(1:no_of_bs); long array n,name(1:2); boolean ok,verify; verify:=testop(7) or testop(4) or testop(8); <*+2*> if testop(5) then write(very,"nl",1,<:read submit called:>,"nl",1); if verify then write(very,"nl",1,"*",1); setposition(very,0,0); <*-2*> nexttype:=0; errortype:=0; syntax:=17; notallowed:=syntax+1; bsname:=syntax+2; commandtype:=0; for command:=if errortype=0 then nextparam(c_buffer,n,int,del) else 0 while (command>0 ) and commandtype<>syntax do begin AGAIN: <*+2*> if testop(8) then write(very,"nl",1,<:;:>,command,<:,:>,nexttype,<:;:>); <*-2*> if command mod 4=1 and nexttype=1 then begin for i:=1,2 do name(i):=n(i); nexttype:=case commandtype of(0,0,0,0,0,2,2, 0,0,0,0,0,0,0,0,0,0); <*+2*> if testop(8) then write(very,n,"sp",1); <*-2*> end else if command mod 4=1 and nexttype<2 then begin <*find a name in the list and convert it to a number*> commandtype:=syntax; i:=0; for i:=i+1 while i<syntax and commandtype=syntax do if n(1)=long (case i of (<:job:>,<:lp:>,<:lines:> , <:evene:> add 'n',<:time:>,<:bs:>, <:prog:>,<:in:>,<:out:>, <:prio:>,<:buf:>,<:area:>,<:int:>, <:size:>,<:start:>, <:seq:>)) then commandtype:=i; if commandtype=syntax and -,bsnameset then commandtype:=bsname; nexttype:=case commandtype of(1,1,2,0,2,1, 1,1,1,2,2,2,2,2,2,2,0,0,0); <*+2*> if testop(8) then write(very,case commandtype of ( <:job:>,<:lp:>,<:lines:>, <:evening:>,<:time:>,<:bs:>,<:prog:>,<:in:>, <:out:>,<:prio:>,<:buf:>,<:area:>,<:int:>, <:size:>,<:start:>,<:seq:>, <:syntax:>,<:notallowed:>,<:bsname:>),<:(nt=:>,nexttype, <:) :>); <*+2*> for i:=1,2,3 do param(i):=0; end name or name. else if command mod 4=2 and nexttype>=2 then begin <*integer*> if commandtype=5 or commandtype=15 then begin if nexttype>2 then param(5-nexttype):=param(6-nexttype); if nexttype>3 then param(6-nexttype):=param(7-nexttype); param(3):=int; end time and start else param(nexttype-1):=int; nexttype:=case commandtype of( 0,0,0,0,if nexttype<5 then nexttype+1 else 0, if nexttype=2 then 3 else 0, 0,0,0,0,0,0,0,0,if nexttype<5 then nexttype+1 else 0,0,0); if verify and false then write(very,<<d>,int,"sp",1); end integer or integer. else begin commandtype:=syntax; if verify and false then write(very,<:***syntax:>); end syntax error; <*execute commands*> if nexttype=0 or commandtype>=syntax or del='nl' or ((commandtype=5 or commandtype=15) and command mod 4=1 and nexttype>2) then begin case commandtype of begin begin <*_1_job*> if verify then write(very,<:job :>,name); ok:=readusercat(name,descriptor,testop(4),very) and curchildren<maxchildren; if ok then begin descriptor.conprocin:=descriptor.conprocout:=descriptor.contermpda; std_claim(descriptor); std_bs(descriptor,very); end else begin errortype:=4; writeerror(very,errornameunknown,bserror); end; end job; if -,bsnameset or descriptor.qprinter(1)=0 then begin <*_2_lp*> if verify then write(very,<:lp.:>,name,"sp",1); for i:=1,2 do descriptor.q_printer(i):=name(i); end lp; begin <*_3_lines*> if verify then write(very,<:lines.:>,param(1)); end lines; begin <*_4_evening*> if verify then write(very,<:evening :>); descriptor.q_jobmask:=2; <*hold job (evening)*> end evening; begin <*_5_time*> if verify then write(very,<:time :>,param(1),param(2),param(3)); descriptor.qmaxtime:=(param(1)*60+param(2))*60+param(3); if command mod 4=1 then begin nexttype:=0; goto AGAIN; end; end time; begin integer array field ref; long array field nf; integer bs,i,usn; <*_6_bs*> if verify then write(very,<:bs :>,name,param(1),param(2),"sp",1); usn:=descriptor.conusercatno; bs:=noofbs+1; for i:=1 step 1 until noofbs do begin bserror(i):=0; nf:=ref:=i*12-12; ref:=usercatbs.ref(6); if usercatbs.nf(1)=name(1) and usercatbs.nf(2)=name(2) then bs:=i; end for; if bs=no_of_bs+1 then writeerror(very,errorbsdeviceunknown,bserror) else begin ref:=(bs-1)*12; ref:=usercatbs.ref(6); descriptor.ref(8):=param(1); descriptor.iaf(9):=param(2); end; end bs; begin <*_7_prog*> if verify then write(very,<:prog :>,name,"sp",1); <* for i:=1,2 do descriptor.conprogram(i):=name(i); *> errortype:=not_allowed; end prog; begin <*_8_in*> if verify then write(very,<:in.:>,name,"sp",1); errortype:=notallowed; end in; begin <*_9_out*> if verify then write(very,<:out.:>,name,"sp",1); for i:=1,2 do descriptor.conoutname(i):=name(i); end out; begin <*_10_prio*> if verify then write(very,<:prio.:>,<<d>,param(1),"sp",1); i:=descriptor.con_prio_and_commands; i:=(i extract 12) add (param(1) shift 12); if param(1)>=0 and param(1)<1024 then begin descriptor.con_prio_and_commands:=i; end else begin errortype:=29; writeerror(very,errorillegalpriority,bserror); end; end prio; begin <*_11_buf*> if verify then write(very,<:buf.:>,<<d>,param(1),"sp",1); if int<0 or int>1023 then writeerror(very,errornobuffers,bserror) else descriptor.conbufandarea:=descriptor.conbufandarea extract 12 add (int shift 12); end buf; begin <*_12_area*> if verify then write(very,<:area.:>,<<d>,param(1),"sp",1); if int<0 or int>1023 then writeerror(very,errornoareas,bserror) else descriptor.conbufandarea:=(descriptor.conbufandarea shift (-12) extract 12) shift 12 add int; end area; begin <*_13_int*> if verify then write(very,<:int.:>,<<d>,param(1),"sp",1); i:=descriptor.conint_and_func; i:=(i extract 12) add (int shift 12); if int>=0 and int<1024 then descriptor.con_int_and_func:=i else writeerror(very,errorsyntax,bserror); end int; begin <*_14_size*> if verify then write(very,<:size:>,param(1)); i:=param(1); if i<0 or i>512*noofcoreblocks*coreblocksize then begin errortype:=81; writeerror(very,errornotallowed,bserror); end else descriptor.consize:=i; end size; begin <*_15_start*> if verify then write(very,<:start :>,param(1),param(2),param(3)); descriptor.q_starttime:=(param(1)*60+param(2))*60+param(3); if command mod 4=1 then begin nexttype:=0; goto AGAIN; end; end start; begin <*__16__seq*> if verify then write(very,<:seq:>,param(1)); descriptor.q_job_seq:=param(1); end seq; begin <*_17_syntax*> if verify then write(very,<:syntax:>); errortype:=syntax; end syntax; begin <*_18_notallowed*> errortype:=notallowed; end not allowed; begin <*__19_bsname*> if verify then write(very,<:bsname.:>,n); errortype:=job_to_queue(descriptor,n,very); <*+2*> if testop(7) then disable begin write(very,<:bsname :>,n,<: errortype :>,errortype); setposition(very,0,0); end; <*-2*> end bsname; end case; end nexttype=0; end for command; if command<0 then errortype:=syntax; if errortype=0 then writeerror(very,errorready,descriptor) else if errortype=syntax then writeerror(very,errorsyntax,bserror) else if errortype=notallowed then writeerror(very,errornotallowed,bserror); if verify then write(very,"nl",1,<:errortype :>,errortype); read_submit:=commandtype<>syntax; end read submit; procedure get_job_segm_0(update); value update; boolean update; if update then begin wait(qsem); setbaseusercat; setposition(qz,0,0); swoprec6(qz,512); fi:=0; for i:=1 step 1 until 256 do qz.fi(i):=0; qz.fi.q0_max_time_day:=b_max_time_day; qz.fi.q0_max_size_day:=b_max_size_day; qz.fi.q0_max_time_night:=b_max_time_night; qz.fi.q0_max_size_night:=b_max_size_night; qz.fi.q0_night_to_day:=b_night_to_day; qz.fi.q0_day_to_night:=b_day_to_night; qz.fi.q0_upd_time:=b_upd_time:=systime(7,0,0.0); setposition(qz,0,0); resetbase; signal(qsem); end update else begin wait(qsem); setbaseusercat; setposition(qz,0,0); inrec6(qz,512); fi:=0; b_upd_time:=qz.fi.q0_upd_time; setposition(qz,0,0); resetbase; signal(qsem); end get job segm 0; boolean procedure get_job_segm(desc,segmno,update); value segmno,update; integer segmno; boolean update; integer array desc; begin integer array field fi; integer i; wait(qsem); setbaseusercat; fi:=0; setposition(qz,0,segmno); if update then swoprec6(qz,512) else inrec6(qz,512); for i:=qdescsize//2 step -1 until 2 do begin if update then qz.fi(i):=desc(i) else desc(i):=qz.fi(i); end; get_job_segm:=update or qz.fi.q_job_no>0; setposition(qz,0,0); resetbase; signal(qsem); end get job_segm; integer procedure b_create_child(des,z); integer array des; zone z; begin integer i,res; integer array field ct; integer array bserror(1:noofbs); des.confirstaddress:=b_child_first; des.contopaddress:=b_child_last; b_cur_children:=bcur_children+1; res:=create_child(des,true,z,ct); if res=0 then begin res:=setbs(des,bserror,z,true); if res>0 then removechild(des,z) else begin i:=des.con_prio_and_commands; i:=(i extract 12) add (((i shift (-12) extract 12)+1) shift 12); des.conprioandcommands:=i; set_prio_child(des); end setbs; end created; bcreatechild:=res; end b_create_child; integer procedure b_load_and_start(des,z); integer array des; zone z; begin integer i,res; integer array field ct; res:=loadandmodify(des,z,false); <*+2*> if testop(7) then disable write(z,"nl",1,<:b_load_start: modify: :>,res); <*-2*> if res>0 then removechild(des,z) else begin res:=startchild(des); <*+2*> if testop(7) then disable write(z,"nl",1,<:b_load_start: start: :>,res); <*-2*> if res>0 then removechild(des,z) else begin i:=des.concurchild; ct:=(i-1)*ctsize; jobtable(childtable.ct.ctsegmqueue,7):=des.concurchild; des.qjobstate:=staterunning; getjobsegm(des,childtable.ct.ctsegmqueue,true); <*+2*> if testop(7) then disable begin write(z,"cr",1,"nl",1,<:b load start: started:>); setposition(z,0,0); end; <*-2*> end; end loaded; bloadandstart:=res; end b_load_and start; integer procedure b_check_child(des,ref); integer array des; integer array field ref; begin integer array field ct,pda,tpda; long array field cname; integer i,childno; boolean b_child; long array name(1:2); cname:=2; bcheckchild:=1; for i:=1,2 do name(i):=des.con_proc_name(i); tpda:=des.con_term_pda; childno:=0; repeat childno:=childno+1; ct:=(childno-1)*ctsize; pda:=childtable.ct.ct_childpda; b_child:=childtable.ct.ct_batch>0 and pda>0; if b_child then bchild:=bchild and name(1)=core.pda.cname(1) and name(2)=core.pda.cname(2); until b_child or childno=max_children; if b_child and (tpda=sysconpda or tpda=childtable.ct.ct_termpda) then begin ref:=ct; bcheckchild:=0; end ok; end bcheckchild; integer procedure job_to_queue(descriptor,n,very); integer array descriptor; long array n; zone very; begin integer res,res1,i,j,time; integer array ht(1:17),tail(1:10); integer array field t,bref,pda; long array field laf; t:=14; for i:=1,2 do descriptor.q_job_name(i):=n(i); setbase(descriptor.conloweruser,descriptor.conupperuser); res:=lookup_headandtail(descriptor.q_job_name,ht); resetbase; if res>0 or ht(1) extract 3<2 or ht.t(1)<=0 then begin <*+2*> if testop(7) then write(very,"nl",1,<:lookup tail :>, descriptor.q_job_name,res,ht(1) extract 3, ht.t(1)); <*-2*> writeerror(very,errorjobfileunknown,descriptor); end else begin descriptor.coninname(1):=long <:primi:> add 'n'; descriptor.coninname(2):=0; setbase(descriptor.conloweruser,descriptor.conupperuser); res1:=lookupheadandtail(descriptor.q_printer,ht); laf:=2; pda:=process_description(ht.t.laf); if pda=0 and descriptor.q_printer(1)<>0 then begin write(very,"nl",1,<:printer :>,descriptor.qprinter, <: does not exist:>); descriptor.qprinter(1):=descriptor.qprinter(2):=0; end; if descriptor.q_printer(1)<>0 then generatename(descriptor.q_wrk_o); i:=0; j:=bmaxjobs+1; repeat i:=i+1; if jobtable(i,2)=0 then j:=i; until j<>bmaxjobs+1 or i=bmaxjobs; if j=bmaxjobs+1 then else begin jobtable(j,1):=j; descriptor.qjobstate:= jobtable(j,2):=1; descriptor.qjobno:= jobtable(j,3):=bjobnumber+1; if descriptor.qmaxtime=0 then descriptor.qmaxtime:=b_std_time; jobtable(j,4):= jobtable(j,5):=descriptor.qmaxtime; jobtable(j,6):=descriptor.qmaxtime; jobtable(j,7):=0; jobtable(j,8):=descriptor.contermpda; jobtable(j,9):=descriptor.qmaxtime; jobtable(j,10):=descriptor.conprojno shift(-8) extract 16; jobtable(j,11):=0; jobtable(j,12):=0; jobtable(j,13):=descriptor.q_jobmask; bcurjob:=bcurjob+1; bjobnumber:=bjobnumber+1; for i:=1,2 do descriptor.conprogram(i):=std_program(i); get_job_segm(descriptor,j,true); inspectch(bmessline,free,i); <*+2*> if testop(7) then disable begin write(very,"nl",1,<:bmessline free :>,i); setposition(very,0,0); end; <*-2*> waitch(bmessline,bref,free,0); d.bref(1):=2; d.bref(2):=j; signalch(bmessline,bref,bmess); write(very,"nl",1,true,12,descriptor.q_jobname, <: job number :>,bjobnumber,<: time :>,descriptor.qmaxtime); setposition(very,0,0); end job ok; end jobfile ok; job_to_queue:=res; <*+2*> if testop(7) then disable begin write(very,"nl",1,<:job to queue: res: :>,res); setposition(very,0,0); end; <*-2*> end job_to_queue; ▶EOF◀