|
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: 15360 (0x3c00) Types: TextFile Names: »tbatch«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦this⟧ »tbatch«
batch queue 82.04.15 Anders Lindgård :1: batch queue: trim variables and fields algol list.on; integer qdescsize,qdes,b_max_jobs,b_curjob, b_child_first,b_child_last, b_max_time, b_max_time_day, b_max_size_day, b_max_time_night,b_max_size_night, b_day_to_night, b_night_to_day, b_upd_time,b_interval,b_time_slice,b_std_time, b_max_children,b_cur_children,b_job_number, b_run_children,b_stop_begin,b_stop_end, swop_segm, b_max_prio_day; real b_time_fac,b_job_fac; integer field q_jobmask, q_job_no,q_job_state,q_job_seq,q_max_time, q_start_time, q_remove_job_file,q_lref; long array field q_job_name,q_printer,q_wrk_o, d_job_name; integer field q0_max_time_day,q0_max_size_day, q0_max_time_night,q0_max_size_night, q0_day_to_night,q0_night_to_day, q0_upd_time; long array qname,swop,swopdoc(1:3); algol list.off; :2: batch queue: initialization algol list.on; d_job_name:=4; i:=qdescsize:=condescsize; i:=q_jobno:=i+2; i:=q_jobmask:=i+2; i:=q_job_state:=i+2; i:=q_job_seq:=i+2; i:=q_max_time:=i+2; i:=q_start_time:=i+2; i:=q_remove_job_file:=i+2; i:=q_lref:=i+2; i:=q_job_name:=i; i:=q_printer:=i+8; i:=q_wrk_o:=i+8; i:=qdescsize:=i+8; <*global information*> i:=q0_max_time_day:=con_desc_size+2; i:=q0_max_size_day:=i+2; i:=q0_max_time_night:=i+2; i:=q0_max_size_night:=i+2; i:=q0_night_to_day:=i+2; i:=q0_day_to_night:=i+2; i:=q0_upd_time:=i+2; qname(1):=long <:bqueu:> add 'e'; qname(2):=0; b_max_time_day:=20*60; <*sec*> b_max_time_night:=8*60*60; b_max_size_day:=512*coreblocksize; b_cur_job:=0; b_maxjobs:=250; b_max_children:=1; b_std_time:=5*60; b_time_slice:=30; b_interval:=5; swop(1):=long <:bswop:>; swop(2):=0; for i:=1,2 do swopdoc(i):=owndisc(i); b_time_fac:=0.5; b_job_fac :=1.0; algol copy.batchtrim; readifp(<:btimeslice:>,b_time_slice,b_time_slice); b_max_prio_day:=2*b_max_time_day; readifp(<:bprio:>,b_max_prio_day,b_max_prio_day); readrfp(<:btimefac:>,btimefac,btimefac); readrfp(<:bjobfac:>,bjobfac,bjobfac); readifp(<:bchildren:>,bmaxchildren,bmaxchildren); readifp(<:bjobs:>,bmaxjobs,bmaxjobs); readifp(<:bstdtime:>,bstdtime,bstdtime); readifp(<:time:>,b_max_time_day,b_max_time_day); laf:=2; swopsegm:=bmaxchildren*bmaxsizenight//512+1; b_curchildren:=0; qdes:=b_maxchildren+1; b_job_number:=0; if readifp(<:bsize:>,bmaxsizeday,bmaxsizeday) then bmaxsizeday:=bmaxsizeday*1024; <*halfwords*> <*+2*> if testop(7) then write(out,"nl",1,<:qdes, qdeszise:>, qdes,qdescsize); <*-2*> algol list.off; :3: batch que: claiming basic maxcoru:=maxcoru+4; maxsemch:=maxsemch+2; maxop:=maxop+qdes+b_max_jobs+4; maxnettoop:=maxnettoop+12*qdes+6*(bmaxjobs+4); maxsem:=maxsem+qdes+1; maxmessext:=maxmessext+1; :4: batch queue global variables and procedures algol list.on; integer array q(1:qdes*qdescsize//2); integer array b_segm_table(1:b_maxchildren,1:2); integer array job_table(1:b_maxjobs,1:13); <* 1: segment number 2: state (0: free, 1: enrolled, 2: running, 3: removed) 3: unique job number 4: current job priority 5: run time 6: rest time 7: childno 8: termpda 9: jobprio 10: projno 11: cpu time 12: sequence number 13: job mask (0=normal, 1=released, 2=evening) *> zone qz,q_in(128,1,noerror); real timebase; boolean cmess,qmess,bmess,jobtimermess,newqueue,day; integer qmessline,bmessline,qsem; algol list.on copy.treadsub; procedure init_batch_queue; begin if -,newqueue then begin integer array field bref; integer segm; <*+2*> if testop(7) then begin disable write(out,"nl",1,<:b queue :>,qname); outendcur(0); end; if testop(2) then disable begin write(out,"nl",1,<:segm 0 (before) :>,qname); outendcur(0); end; <*-2*> get_job_segm_0(false); for segm:=1 step 1 until b_max_jobs do begin if get_job_segm(q,segm,false) then begin <*old job found*> if q.q_job_state=staterunning then begin disable write(out,"nl",1,true,12,q.qjobname,q.qjobno,<: lost:>); q.q_job_state:=q.qjobno:=0; get_jobsegm(q,segm,true); end else begin b_cur_job:=b_cur_job+1; <*+2*> if testop(7) then disable begin write(out,"nl",1,<:job :>,b_curjob,segm); outendcur(0); end; <*-2*> jobtable(segm,1):=segm; jobtable(segm,2):=q.q_job_state; jobtable(segm,3):=q.q_job_no; jobtable(segm,4):=q.q_maxtime; jobtable(segm,5):=q.qmaxtime; jobtable(segm,6):=q.qmaxtime; jobtable(segm,7):=0; jobtable(segm,8):=q.contermpda; jobtable(segm,9):=q.qmaxtime; jobtable(segm,10):=q.conprojno shift (-8) extract 16; jobtable(segm,11):=0; jobtable(segm,12):=0; jobtable(segm,13):=q.q_jobmask; if bjobnumber<q.fi.q_job_no then b_jobnumber:= q.fi.q_job_no; waitch(bmessline,bref,free,0); d.bref(1):=2; d.bref(2):=segm; signalch(bmessline,bref,bmess); end initjob; end old job; end scan segments; end -,newqueue; disable write(out,"nl",2,<:batch included :>,if newqueue then <:new:> else <:old:>,<: queue :>); disable writetime(out,b_upd_time);; disable write(out,<< dddddd>, "nl",1,<:current max time:>,bmaxtime, if day then <: day:> else <: night:>, "nl",1,<:max time day :>,b_max_time_day//60,<: min:>, b_max_time_day mod 60,<: sec:>, "nl",1,<:max size day :>,b_max_size_day//1024,<: k:>, "nl",1,<:max time night :>,b_max_time_night//60//60,<: h:>, "nl",1,<:max size night :>,b_max_size_night//1024,<: k:>, "nl",1,<:day to night :>,<<_____dd.dd>,b_day_to_night//100, "nl",1,<:night to day :>,b_night_to_day//100, "nl",1,<:parallel jobs :>,<< dddddd>,b_max_children, "nl",1,<:jobs in queue :>,b_cur_job, "nl",1,<:max job number :>,b_job_number); outendcur(10); end initbatch; procedure batch_queue; begin integer i,j,res,cbn,op,mode,word,jobno,jobstate; long array field nf; integer array field qref,qcur,concur,bref,ct; long array name,text(1:3); zone pz(17,1,noerror); stackclaim(800); fi:=0; <*+2*> if testop(7) then writelog(<:batch queue started:>,0,<::>); <*-2*> repeat waitch(qmessline,qref,qmess,0); concur:=d.qref(2); for i:=1,2 do name(i):=condesc.concur.condesterm(i); open(pz,8,name,1 shift 9); open(qin,8,name,1 shift 9); <*+2*> if testop(7) then disable begin write(pz,"nl",1,<:batch called :>,concur, case d.qref(1) of (<:submit:>,<:queue:>,<:what:>, <:search:>,<:kill:>,<:release:>,<:setprio:>,<::>)); if d.qref(1)=1 then write(pz,d.qref.djobname,qref,djobname) else write(pz,d.qref(3)); end test; <*-2*> case d.qref(1) of begin begin <*submit*> qcur:=0; j:=condescsize//2; for i:=2 step 1 until j do q.qcur(i):=condesc.concur(i); j:=j+1; for i:=qdescsize//2 step -1 until j do q.qcur(i):=0; res:=0; if d.qref.d_job_name(1)<>0 then begin <*+2*> if testop(7) then write(pz,"nl",1,<:b: search user cat :>, d.qref.d_job_name); <*-2*> if readusercat(d.qref.d_jobname,q.qcur,testop(7),pz) then begin stdclaim(q.qcur); stdbs(q.qcur,pz); end else begin res:=4; writeerror(pz,errornameunknown,q.qcur); end; end jobname; if res=0 then read_submit(qin,pz,q.qcur,false); end submit; begin integer t; <*queue*> t:=condesc.concur.contermpda; list_job_table(pz,if t=sysconpda then 0 else t); end queue; begin integer i,jte,rest; boolean first; <*what*> first:=true; for i:=1 step 1 until maxchildren do begin ct:=(i-1)*ctsize; if childtable.ct.ct_batch>0 then begin if first then begin write(pz,"nl"1,if day then <:day :> else <:night :>); writecurtime(pz); write(pz,"nl",1,<:user________:>,<:state____:>, <:jobno__:>,<:time left:>); first:=false; end; jte:=childtable.ct.ct_segm_queue; rest:=jobtable(jte,6); write(pz,"nl",1,true,12,childtable.ct.ct_jobname, true,9,case childtable.ct.ctstate of (<:created:>,<:running:>,<:stopped:>,<:breaked:>, <:swopped:>),<< dddd>,childtable.ct.ctjobno); if rest>0 then write(pz,<< dd >,rest//3600,rest mod 3600 //60, rest mod 60); end batch job; end childtable scan; end what; begin <*search*> <*+2*> if testop(7) then disable writebdes(q.qcur,pz); <*-2*> i:=0; jobno:=d.qref(3); repeat i:=i+1; until i=bmaxjobs or jobno=jobtable(i,3); if jobno=jobtable(i,3) then begin write(pz,"nl",1,<:job number:>,jobno,<: :>, case jobtable(jobno,2)+1 of ( <:impossible:>,<:enrolled:>,<:running:>,<:removed:>)); end else writeerror(pz,errorjobnumbernotfound,q.qcur); end search; begin <*kill*> i:=0; jobno:=d.qref(3); repeat i:=i+1; until i=bmaxjobs or jobno=jobtable(i,3); if jobno=jobtable(i,3) then begin jobstate:=jobtable(i,2); b_cur_job:=b_cur_job-1; if jobstate=2 then begin waitch(bmessline,bref,free,0); d.bref(1):=1; <*clock*> d.bref(2):=-6; <* kill running job*> d.bref(3):=(jobtable(i,7)-1)*ctsize; signalch(bmessline,bref,cmess); end job running else for j:=2 step 1 until 15 do jobtable(i,j):=0; qcur:=0; q.qcur.qjobno:=0; get_job_segm(q.qcur,i,true); end else writeerror(pz,errorjobnumbernotfound,q.qcur); end kill; begin <*release*> i:=0; jobno:=d.qref(3); repeat i:=i+1; until i=bmaxjobs or jobno=jobtable(i,3); if jobno=jobtable(i,3) then begin <*job no found*> jobtable(i,13):=1; <*released*> end job found else writeerror(pz,errorjobnumbernotfound,q.qcur); end release; begin <*set prio*> i:=0; jobno:=d.qref(3); repeat i:=i+1; until i=bmaxjobs or jobno=jobtable(i,3); if jobno=jobtable(i,3) then begin jobtable(i,4):=0; end else writeerror(pz,errorjobnumbernotfound,q.qcur); end setprio; end case; <*+2*> if testop(7) then writelog(<:batch end:>,0,<::>); if testop(7) then begin write(pz,"nl",1,<:batch :>,d.qref(1), d.qref(2)); if d.qref(1)=1 then write(pz,<: :>,d.qref.d_jobname) else write(pz,d.qref(3)); end test; <*-2*> close(pz,true); close(q_in,true); signalch(qmessline,qref,free); until false; end batch queue; procedure b_timer; begin integer array field bref; real r; stackclaim(250); repeat waitch(bmessline,bref,free,0); delay(b_time_slice); systime(5,0,r); d.bref(1):=1; d.bref(2):=r; signalch(bmessline,bref,cmess); until false; end b_timer; procedure run_job_timer; begin integer array field bref; stackclaim(150); repeat waitch(bmessline,bref,jobtimermess,0); d.bref(1):=2; d.bref(2):=-1; delay(b_time_slice); signalch(bmessline,bref,bmess); until false; end runjobtimer; algol list.on copy.trunbatch; procedure write_b_des(d,z); integer array d; zone z; begin writeentry(d,z,true); write(z,"nl",1,<:job number :>,d.qjobno, "nl",1,<:job state :>,d.qjobstate, "nl",1,<:job seq :>,d.qjobseq, "nl",1,<:max time :>,d.qmaxtime, "nl",1,<:start wanted :>,d.qstarttime, "nl",1,<:job file name:>,d.qjobname, "nl",1,<:printer :>,d.qprinter); end writebdes; algol list.off; :5: batch queue: program algol list.on; setbasestd; tail(1):=swopsegm; laf:=2; for i:=1,2 do tail.laf(i):=swopdoc(i); for i:=6 step 1 until 10 do tail(i):=0; i:=createentry(swop,tail); if i=3 then begin removeentry(swop); i:=createentry(swop,tail); end; if i>0 then alarm(<:***swop area :>,swop,i); permentry(swop,3); resetbase; begin integer cs,cb,blocks; cs:=coreblocksize*512; blocks:=(bmaxsizeday+cs-2)//cs; if blocks<=noofcoreblocks then begin cb:=0; for cb:=1 step 1 until blocks do coretable(cb,2):=ownpda; bchildfirst:=coretable(1,1); bchildlast :=coretable(blocks+1,1)-2; end else begin write(out,"nl",1,<:batch inactive, no free core :>, bmaxsizeday,<: needed:>); bmaxchildren:=0; end; end local; qmess:=false add (1 shift 5); bmess:=false add (1 shift 6); cmess:=false add (1 shift 7); jobtimermess:=false add (1 shift 8); qsem:=nextsem; signal(qsem); qmessline:=nextsemch; for i:=1 step 1 until qdes do begin j:=nextop(12); signalch(qmessline,j,free); end; systime(5,0,timebase); timebase:=timebase/100; day:=(timebase>b_night_to_day and timebase<b_day_to_night); b_max_time:=if day then b_max_time_day else b_max_time_night; bmessline:=nextsemch; for i:=1 step 1 until bmaxchildren do begin bsegmtable(i,1):=0; bsegmtable(i,2):=(i-1)*bmaxsizenight//512; end; for i:=1 step 1 until b_maxjobs+4 do begin j:=nextop(6); signalch(bmessline,j,free); end; for i:=1 step 1 until b_max_jobs do for j:=1 step 1 until 10 do job_table(i,j):=0; setbaseusercat; readbfp(<:newq:>,newqueue,false); i:=lookupentry(qname,tail); if i>0 or tail(1)<=b_max_jobs or newqueue then begin newqueue:=true; tail(1):=b_max_jobs+1; laf:=2; for i:=1,2 do tail.laf(i):=own_disc(i); for i:=7 step 1 until 10 do tail(i):=0; removeentry(qname); i:=createentry(qname,tail); if i>0 then alarm(<:Queue no resources :>,qname,i); end; permentry(qname,3); open(qz,4,qname,1 shift 9); if newqueue then begin outrec6(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); outrec6(qz,512); for i:=1 step 1 until 256 do qz.fi(i):=0; for i:=3 step 1 until b_max_jobs+1 do outrec6(qz,512); setposition(qz,0,0); end newqueue; resetbase; for i:=1 step 1 until qdes do begin fi:=(i-1)*qdescsize; for j:=2 step 1 until qdescsize//2 do q.fi(j):=0; q.fi.conref:=fi; q.fi.conaccess:=nextsem; signal(q.fi.conaccess); end; j:=nextcoru(4,300,true); <*+2*> if testop(7) then write(out,"nl",1,<:batch queue corutine :>,j); <*-2*> newactivity(j,j,batch_queue); j:=nextcoru(5,50,true); <*+2*> if testop(7) then write(out,"nl",1,<:run batch corutine :>,j); <*-2*> newactivity(j,j,run_batch); j:=nextcoru(6,25,true); <*+2*> if testop(7) then write(out,"nl",1,<:b timer corutine :>,j); <*-2*> newactivity(j,j,b_timer); j:=nextcoru(7,25,true); <*+2*> if testop(7) then write(out,"nl",1,<:run job timer corutine:>,j); <*-2*> newactivity(j,j,run_job_timer); algol list.off; ▶EOF◀