DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦9a9f6b9d6⟧ TextFile

    Length: 26880 (0x6900)
    Types: TextFile
    Names: »tchildpr«

Derivation

└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦this⟧ »tchildpr« 

TextFile

<*procedures for handling child processes
1982-04-15
Anders Lindgård
*>
algol list.on;

integer procedure create_child(desc,permcore,z,ct);
value permcore; boolean permcore;
integer array desc;
zone z;
integer array field ct;
if curchildren>=maxchildren or
  (core.ownref.intfuncref shift (-12) extract 12 -owninternal)<=0 then
begin
  createchild:=5;
  writeerror(z,errornointernals,desc);
end else
begin
  integer pda,i,sh,char,nameindex,res,cbn,ca,cb,cint,
   usb,usa,usint,fblock,lblock;
  own integer devices;
  boolean checkcore,stdbincat;
  integer array field par;
  integer array param(1:9);
  long array name1,jobname(1:3);
  if devices=0 then
  disable begin
  devices:=(wordload(76)-wordload(74))//2;
  end devices;
  par:=12;
  for i:=1,2 do name1(i):=jobname(i):=desc.conjobname(i);
  createchild:=0;
  checkcore:=if -,permcore then findcorehole(desc,fblock,lblock,z) else
       true;
<*+2*>
  if testop(2) and -,permcore  then 
     disable write(z,"nl",1,<:create child: coreblock:>,
     fblock,lblock);
<*-2*>
 if -,checkcore then
 begin
  createchild:=res:=1;
  writeerror(z,errornocore,desc);
 end else
  begin
   ca:=core.ownref.bufarearef;
   usb:=cb:=ca shift (-12) extract 12;
   usa:=ca:=ca extract 12;
   usint:=cint:=core.ownref.intfuncref shift (-12) extract 12;
<*+2*>
   if testop(2) then disable write(z,"nl",1,<:buf,area,int:>,cb,ca,cint);
<*-2*>
   res:=0;
   cb:=cb-ownbuf-(desc.conbufandarea shift (-12) extract 12);
   ca:=ca-ownarea-(desc.conbufandarea extract 12);
   cint:=cint-owninternal-(desc.conintandfunc shift (-12) extract 12);
   if cb<=0 then res:=errornobuffers else
   if ca<=0 then res:=errornoareas   else
   if cint<=0 then res:=errornointernals;
   if res>0 then
   begin
     param(1):=usb-ownbuf; param(2):=usa-ownarea;
     param(3):=usint-owninternal;
     writeerror(z,res,param);
     createchild:=res:=6;
  end else
  begin
   freebuf:=usb-ownbuf; freearea:=usa-ownarea;
   freeinternal:=usint-owninternal;
   if permcore then
   begin
     param(1):=desc.confirstaddress;
     param(2):=desc.contopaddress;
   end else
   begin
     desc.confirstaddress:=param(1):=coretable(fblock,1);
     desc.contopaddress:=param(2):=coretable(lblock,1)-2;
   end;
   for i:=3 step 1 until 9 do param(i):=desc.par(i);
   setbasestd;
   pda:=process_description(name1);
   stdbincat:= logand(desc.conprioandcommands,bit_stdbase)=0;
   if stdbincat then param(8):=param(9):=desc.conloweruser;
   if pda>0 and stdbincat then
   begin
    param(8):=desc.conloweruser;
    i:=0;
    repeat i:=i+1;
    sh:=-48;
    repeat sh:=sh+8;
      char:=jobname(i) shift sh extract 8;
    until char=0 or sh=0;
    until char=0 or i=2;
   res:=3; nameindex:=0;
   while res=3 and nameindex<9 do
   begin
     name1(i):=(jobname(i) shift sh add
              (48+nameindex)) shift (-sh);
     param(8):=param(9):=param(8)+1;
     res:=createint(name1,param);
<*+2*>
     if testop(2) then disable
      write(z,"nl",1,nameindex,name1,param(8),i,sh);
<*-2*>
     nameindex:=nameindex+1;
   end while;
  end else res:=createint(name1,param);
<*+2*>
if testop(2) then disable write(z,"nl",1,<:createint: res :>,res,
     "nl",1,<:name :>,name1,
     "nl",1,<:faddr:>,param(1),
     "nl",1,<:taddr:>,param(2),
     "nl",1,<:b a a:>,param(3),
     "nl",1,<:i a f:>,param(4),
     "nl",1,<:mode :>,param(5),
     "nl",1,<:maxb :>,param(6),param(7),
     "nl",1,<:stdb :>,param(8),param(9),
     "nl",1,if stdbincat then <::> else <:*stdbase=userbase:>);
<*-2*>
if res>0 then
begin
  createchild:=res+8;
  writeerror(z,case res of (
    errorresultimpossible,errorcatalogerror,errornameconflict),desc);
end else
begin
  for i:=1,2 do desc.con_proc_name(i):=name1(i);
  setcatbase(name1,desc.conloweruser,desc.conupperuser);
  for i:=1,2 do desc.con_proc_name(i):=name1(i);
  childrencreated:=childrencreated+1;
  curchildren:=curchildren+1;
  if logand(desc.conprio_and_commands,bit_priv)=0 then
  include_devices(name1,includelist,lastdevice) else
  for i:=0 step 1 until devices do include_user(name1,i);
  pda:=process_description(name1);
  if permcore then else
  begin
    for cbn:=lblock-1 step -1 until fblock do coretable(cbn,2):=pda;
<*+2*>
    if testop(2) then write(z,"nl",1,<:fblock, lblock:>,fblock,lblock);
<*-2*>
  end;
  cbn:=0;
  ct:=-ct_size;
  repeat cbn:=cbn+1;
  ct:=ct+ct_size;
  inspect(childtable.ct.ct_sem,i);
  until cbn>maxchildren or (childtable.ct.ct_childpda=0 and i>0);
  childtable.ct.ct_child_pda:=pda;
  childtable.ct.ct_term_pda:=desc.contermpda;;
  childtable.ct.ct_state:=state_created; <*created*>
  childtable.ct.ct_ref:=desc.conref;
  for i:=1,2 do childtable.ct.ct_jobname(i):=jobname(i);
  childtable.ct.ct_first:=param(1);
  childtable.ct.ct_last :=param(2);
  childtable.ct.ct_usercatno:=desc.conusercatno;
  desc.con_cur_child:=cbn;
  desc.con_cur_childpda:=pda;
<*+2*>
 if testop(2) then disable write(z,"nl",1,<:child no :>,cbn,
     childtable.ct.ct_childno,
     "nl",1,<:childpda:>,childtable.ct.ct_childpda);
<*-2*>
end;
  resetbase;
  end buf,area,int ok;
end coreblock_found;

end create_child;

integer procedure checkchild(desc,error,z,ct);
value error; boolean error;
integer array desc;
zone z;
integer array field ct;
begin
integer pda,cn,res;
  <*checks whether the name in desc is a child of this console*>
  res:=1;
  cn:=0;
  pda:=process_description(desc.con_proc_name);
  if pda>0 then begin
    res:=0;
    ct:=-ct_size;
    repeat cn:=cn+1;
    ct:=ct+ctsize;
    until cn>maxchildren or pda=childtable.ct.ct_childpda;
    if cn>maxchildren then res:=1 else
    if (desc.contermpda<>sysconpda and
       desc.contermpda<>childtable.ct.ct_termpda) or
        childtable.ct.ctbatch>0 then res:=2;
  end pda>0;
checkchild:=res;
desc.concurchild:=if res=0 then cn else 0;;
desc.concurchildpda:=if res=0 then pda else 0;
if res>0 and error then writeerror(z,case res of (errorprocessunknown,
     errornotallowed),desc);
end checkchild;

integer procedure load_and_modify(desc,z,mode);
value mode; boolean mode;
integer array desc;
zone z;
begin
integer res,rep,progext,base;
integer array field childpda,ct;
integer array M,A(1:8),param(1:6);
long array bsname(1:3);

procedure set_in_out(name,proc);
long array field name;
integer field proc;
if desc.name(1)<>0 or desc.name(2)<>0 then
begin
integer array field pda;
  desc.proc:=pda:=processdescription(desc.name);
  if pda=0 then
  begin
    set_base(desc.conloweruser,desc.conupperuser);
    res:=createareaprocess(desc.name);
    if res<>0 then write(z,"nl",1,<:**create area process :>,
        desc.name,res);
    pda:=processdescription(desc.name);
    if pda=0 then desc.proc:=desc.contermpda else
    desc.proc:=pda;
    reset_base;
  end;
end set in out;

childpda:=processdescription(desc.conprocname);
load_and_modify:=1;
<*+2*>
if testop(2) then disable write(z,"nl",1,<:load and modify:>,
    "nl",1,<:child pda :>,childpda);
<*-2*>
if childpda>0 and wordload(childpda)=0 then
begin
  setbase(desc.conloweruser,desc.conupperuser);
  res:=lookupentry(desc.conprogram,tail);
<*+2*>
  if testop(2) then disable write(z,"nl",1,
     <:program :>,desc.conprogram,<: lookup result :>,res);
<*-2*>
  if res>0 then 
  begin
    writeerror(z,case res of (
      0,errorcatalogerror,errorareaunknown),desc);
  res:=res+24;
  end else
  begin
    ct:=(desc.concurchild-1)*ct_size;
    base:=core.childpda(50);
    setinout(coninname,conprocin);
    childtable.ct.ct_procin:=
    param(1):=desc.con_proc_in;
    param(2):=ownpda;
    setinout(conoutname,conprocout);
    childtable.ct.ct_procout:=
    param(3):=desc.con_proc_out;
    param(4):=childpda;
    param(5):=0;
    param(6):=desc.confirstaddress-base
             +tail(9) extract 12;
    if tail(9) shift (-12) extract 12<>3 then
    begin
      writeerror(z,errorareaerror,desc);
      res:=25;
    end else
    if tail(1)<=0 then
    begin
      writeerror(z,errorareaerror,desc);
      res:=26;
    end else
    if tail(10)>desc.contopaddress-desc.confirstaddress then
    begin
      res:=27;
      writeerror(z,errorprogramtoobig,desc);
    end else
    begin
     M(1):=3 shift 12;
     M(2):=desc.confirstaddress;
     M(3):=M(2)+tail(10)-2;
     M(4):=0;
     for i:=1,2 do bsname(i):=desc.conprogram(i);
     createareaprocess(desc.conprogram);
     rep:=0;
     repeat rep:=rep+1;
       if mode then
       begin
         res:=waitanswer(sendmessage(bsname,M),A);
       end else
       begin
       csendmessage(bsname.f,M,progext);
       cwaitanswer(progext,A,res,0);
       end;
      until res<>1 or (A(1)=0 and A(2)=tail(10)) or rep=10;
      if res=1 and rep=10 then
      begin
        res:=24+5;
        writeerror(z,errorareaerror,desc);
      end else
      if res>1 then 
      begin
        writeerror(z,case res of(0,errorareareserved,
          errorresultimpossible,errorareaunknown),desc);
        res:=res+32;
      end else
      begin
        res:=modifyint(desc.conprocname,param);
        if res>0 then
        begin
<*+2*>
          if testop(2) then write(z,"nl",1,<:modify: :>,res,
           "nl",1,<:in    :>,param(1),
           "nl",1,<:parent:>,param(2),
           "nl",1,<:out   :>,param(3),
           "nl",1,<:own   :>,param(4),
           "nl",1,<:IC    :>,param(6));
<*-2*>
          res:=24+res;
          writeerror(z,errorresultimpossible,desc);
        end modify>0 else
     if base=0 then
     begin
       res:=changeaddressbase(desc.conprocname,
           desc.confirstaddress-childbaseaddress);
       if res<>0 or testop(2) then write(z,"nl",1,<:change address :>,res,
         desc.confirstaddress,childbaseaddress,desc.confirstaddress-
         childbaseaddress);
     end base=0;
     end program in core;
    end tail ok;
end lookup;
resetbase;
end internal;
loadandmodify:=res;
end load and modify;

integer procedure stop_child(desc);
integer array desc;
begin
integer cn,res;
integer array field ct,cpda;
boolean state;
res:=2;
cn:=desc.concurchild;
if cn>0 then
begin
ct:=(cn-1)*ctsize;
  cpda:=childtable.ct.ct_childpda;
  state:=core.cpda.stateref;
  state:=(state and bit_start) extract 7=0;
  if state then
  begin
    res:=stopchild:=stopint(desc.con_proc_name);
    if res=0 then
    begin
      childtable.ct.ct_state:=state_stopped;
      if childtable.ct.ctbatch>0 then brunchildren:=brunchildren-1;
    end;
  end else 
  begin
    res:=0; childtable.ct.ct_state:=state_stopped;
  end;
end cn>0;
stopchild:=res;
end stop_child;

integer procedure startchild(desc);
integer array desc;
begin
integer cn,res;
integer array field ct,cpda;
boolean state;
res:=2;
cn:=desc.concurchild;
if cn>0 then
begin
  ct:=(cn-1)*ct_size;
    cpda:=childtable.ct.ct_childpda;
    state:=core.cpda.state_ref;
    state:=(state and bit_start) extract 7 >0;
    if state then
    begin
    res:=startchild:=startint(desc.con_proc_name);
    if res=0 then
    begin
      if childtable.ct.ctstate<>state_breaked then 
      childtable.ct.ct_state:=state_running;
      if childtable.ct.ctbatch>0 then brunchildren:=brunchildren+1;
   end res=0;
  end state else 
  begin
    res:=0;
    childtable.ct.ct_state:=state_running;
  end started;
end cn>0;
startchild:=res;
end startchild;

integer procedure set_prio_child(desc);
integer array desc;
begin
integer cn,res;
res:=23;
cn:=desc.concurchild;
if cn>0 then
begin
  res:=set_priority(desc.conprocname,desc.con_prio_and_commands shift (-12)
          extract (12));
  if res=0 then desc.conprioandcommands:=desc.conprioandcommands extract 12;
end cn>0;
set_prio_child:=res;
end setpriochild;

integer procedure break_child(desc,z);
integer array desc; zone z;
begin
  integer i,res,base,oldIC;
  integer array param(1:6);
  integer array field childpda,reg,ct;
    res:=stopchild(desc);
    childpda:=processdescription(desc.conprocname);
    oldIC:=core.childpda(46);
    base:=core.childpda(50);
    reg:=core.childpda(19)+base;
    if reg>0 and res=0 then
    begin
      for i:=1 step 1 until 6,8 do core.reg(i):=core.childpda(40+i);
      core.reg(7):=8;
      param(1):=desc.conprocin;
      param(2):=ownpda;
      param(3):=desc.conprocout;
      param(4):=childpda;
      param(5):=0;
      param(6):=reg+16-base; <* new IC*>
      res:=modifyint(desc.conprocname,param);
      if res<>0 then res:=res+16;
    end;
     write(z,<:<10>break :>,core.reg(7),oldIC,reg-base);
    if res=0 then 
    begin
      res:=startchild(desc);
      ct:=(desc.concurchild-1)*ct_size;
      if res=0 then childtable.ct.ct_state:=state_breaked;
    end;
    breakchild:=res;
end break;

integer procedure remove_child(desc,z);
integer array desc;
zone z;
begin
integer cn,res,bs,job;
integer array field pda,iaf,ppda,ct;
boolean batch;
long array field laf,laf1;
long array name,pname(1:3);
integer array param(1:8);
removechild:=1;
cn:=desc.concurchild;
<*+2*>
if testop(2) then disable write(z,"nl",1,<:remove: child :>,cn);
<*-2*>
if cn>0 then
begin
  ct:=(cn-1)*ctsize;
  pda:=childtable.ct.ct_childpda;
  laf:=pda+2;
  for i:=1,2 do pname(i):=core.laf(i);
  batch:=childtable.ct.ctbatch>0;
<*+2*>
  if testop(2) then disable write(z,"nl",1,<:child state:>,
      childtable.ct.ctstate,if batch then <: batch :> else <:on line:>);
<*-2*>
  if childtable.ct.ct_state <>staterunning then
  begin
    clearentries(1,core.pda.stdbaseref(1),core.pda.stdbaseref(2),z);
    for bs:=1 step 1 until noofbs do
    begin
      laf:=iaf:=(bs-1)*12;
      iaf:=usercatbs.iaf(6);
      res:=lookup_bs_claims(pname,usercatbs.laf,param);
      if res=0 then
      begin
       for i:=1,2 do perm_bs_claimed(childtable.ct.ct_usercatno,bs,i):=
                     perm_bs_claimed(childtable.ct.ct_usercatno,bs,i)-param(6+i);
<*+2*>
       if testop(2) and (param(7)<>0 or param(8)<>0) then
       write(z,"nl",1,<:perm bs userno :>,childtable.ct.ct_usercatno,
          permbsclaimed(childtable.ct.ct_usercatno,bs,1),
          permbsclaimed(childtable.ct.ct_usercatno,bs,2));
<*-2*>
      end update resources
    end for bs;
    ppda:=childtable.ct.ctprocin;
    if ppda=0 then else
    begin
      laf1:=ppda+2;
      for i:=1,2 do  name(i):=core.laf1(i);
      if core.ppda(1)=4 then 
      begin
        laf:=2;
        if core.ppda.laf(1) shift (-24) extract 24=
           long <:wrk:>     shift (-24) extract 24 and
           batch then removeentry(name);
        removeprocess(name);
      end;
    end ppda>0;
    ppda:=childtable.ct.ct_procout;
    if ppda=0 then else
    begin
      laf1:=ppda+2;
      for i:=1,2 do name(i):=core.laf1(i);
      if core.ppda(1)=4 then removeprocess(name);
    end procout;
    res:=removechild:=removeprocess(pname);
<*+2*>
    if testop(7) then disable
      write(z,"nl",1,<:remove :>,pname,<: res :>,res);
<*-2*>
    if res=0 then 
    begin
      if childtable.ct.ct_bufref<>0 then
      begin integer array A(1:8);
       <*release possible buffer from finis or break*>
       send_answer(1,childtable.ct.ct_bufref,A);
       childtable.ct.ct_bufref:=0;
     end;
      job:=childtable.ct.ctsegmqueue;
      for i:=1,2 do childtable.ct.ct_jobname(i):=0;
       childtable.ct.ct_childpda:=childtable.ct.ct_termpda:=
       childtable.ct.ct_state   :=childtable.ct.ct_ref    :=
       childtable.ct.ct_first   :=childtable.ct.ct_last   :=
       childtable.ct.ct_jobno   :=childtable.ct.ct_segmswop:=
       childtable.ct.ct_usercatno:=childtable.ct.ctprocin :=
       childtable.ct.ct_procout :=0;
      if batch then
      begin
        childtable.ct.ct_batch:=0;
        if desc.q_remove_job_file>0 then
           remove_entry(desc.q_jobname);
        bcurchildren:=bcurchildren-1;
        for i:=1 step 1 until bmaxchildren do
        begin
          if cn=bsegmtable(i,1) then bsegmtable(i,1):=0;
        end;
        for i:=2 step 1 until 15 do jobtable(job,i):=0;
        desc.q_jobno:=0;
        getjobsegm(desc,job,true);
      end batch;
      for cn:=1 step 1 until no_of_coreblocks do
        if coretable(cn,2)=pda then coretable(cn,2):=0;
     curchildren:=curchildren-1;
     desc.con_cur_child:=0;
     desc.con_cur_child_pda:=0;
     freebuf:=core.ownref.bufarearef shift (-12) extract 12 -ownbuf;
     freearea:=core.ownref.bufarearef extract 12 - ownarea;
     freeinternal :=core.ownref.intfuncref shift (-12) extract 12 -owninternal;
    end;
  end;
end cn>0;
end remove child;



integer procedure find_bs_ref(desc,bs_type,bsno);
value bstype; integer bsno,bstype;
integer array desc;
begin
boolean found;
integer bs;
integer array field iaf;
long array field laf;
findbsref:=0;
repeat
  iaf:=laf:=(bsno-1)*12;
  iaf:=usercatbs.iaf(6);
  found:=desc.iaf(5)=bs_type;
  if found then findbsref:=iaf;
  bsno:=bsno+1;
until bsno>no_of_bs or found;
end find_bs_ref;

procedure std_claim(desc);
integer array desc;
begin
  desc.con_buf_and_area:=std_buf shift 12 add std_area;
  desc.con_int_and_func:=std_int shift 12 add std_func;
  desc.con_mode:=240 shift 12+7;
end std_claim;


procedure std_bs(desc,z);
integer array desc;
zone z;
begin
integer bs,firstbs;
integer array field iaf;

firstbs:=1;
repeat iaf:=findbsref(desc,0,firstbs); <*drum*>
if iaf=0 then else
begin
<*drum or not used*>
 if  desc.iaf(3)>stdentries then desc.iaf(1):=desc.iaf(8):=
    stdentries else desc.iaf(8):=desc.iaf(3);
 desc.iaf(9):=0;
<*+2*>
if testop(2) then write(z,"nl",1,<:std_bs : :>,iaf,desc.iaf(8),
    desc.iaf(9));
<*-2*>
end;
until  firstbs>=noofbs;
firstbs:=1;
repeat iaf:=findbsref(desc,1,firstbs);   <*disc*>
if iaf=0 then else
begin
if  desc.iaf(3)>stdentrydisc then
   desc.iaf(1):=desc.iaf(8):=stdentrydisc else desc.iaf(8):=desc.iaf(3);
if  desc.iaf(4)>stdsegmdisc then
   desc.iaf(2):=desc.iaf(9):=stdsegmdisc else desc.iaf(9):=desc.iaf(4);
end;
until  firstbs>noofbs;
firstbs:=1;
if stddisc1name(1)>0 then
begin
  repeat iaf:=findbsref(desc,2,firstbs); <*disc1*>
  if iaf>0 then
  begin
    if desc.iaf(3)>stdentrydisc1 then
    desc.iaf(1):=desc.iaf(8):=stdentrydisc1 else desc.iaf(8):=desc.iaf(3);
    if desc.iaf(4)>stdsegmdisc1 then
    desc.iaf(2):=desc.iaf(9):=stdsegmdisc1 else desc.iaf(9):=desc.iaf(4);
  end iaf>0
  until iaf=0 or firstbs>noofbs;
end stddisc1;
firstbs:=1;
repeat iaf:=findbsref(desc,3,firstbs);  <*aux*>
if iaf=0 then else
begin
  for bs:=1,2 do desc.iaf(7+bs):=desc.iaf(bs):=desc.iaf(2+bs);
end;
until firstbs>noofbs;
firstbs:=1;
repeat iaf:=findbsref(desc,4,firstbs);   <*max*>
if iaf=0 then else
begin
  for bs:=1,2 do desc.iaf(7+bs):=desc.iaf(bs):=desc.iaf(2+bs);
end;
until firstbs>noofbs;
end stdbs;

integer procedure setbs(desc,bserror,z,tempadjust);
value tempadjust; boolean tempadjust;
integer array desc,bserror;
zone z;
begin
boolean priv;
integer bs,i,cn,res,usn,slicel;
integer array param(1:8);
long array field n;
integer array field iaf;
res:=setbs:=0;
cn:=desc.concurchild;
priv:=logand(desc.con_prio_and_commands,bit_priv)<>0 or
      logand(desc.con_prio_and_commands,bit_maxclaim)<>0;
<*+2*>
if testop(2) then disable write(z,"nl",1,<:setbs: childno :>,cn,
   <:  :>,desc.con_procname);
<*-2*>

for bs:=1 step 1 until no_of_bs do
begin
  bserror(bs):=0;
  iaf:=n:=(bs-1)*12;
  slicel:=usercatbs.iaf(5);
  iaf:=usercatbs.iaf(6);
  for i:=1,2 do param(6+i):=desc.iaf(7+i);
  if (param(8)<>0 or param(7)<>0) and bs_exist(bs) then
  begin
  param(8):=(param(8)+slicel-1)//slicel*slicel;
  for j:=0,1,2 do for i:=1,2 do param(j*2+i):=param(6+i)*
     (if tempadjust then( if j=0 then 2.0 else 1.5) else 1.0);
  if bs=1 then param(1):=param(1)+std_temp_entries;
  <*first bs device must be catalog device*>
  usn:=desc.conusercatno;
  if perm_bs_claimed(usn,bs,3)-perm_bs_claimed(usn,bs,1)-param(7)<0
     and desc.iaf(5)<3 and -,priv <*drum,disc,disc1*> then bserror(bs):=7 else
  if perm_bs_claimed(usn,bs,4)-perm_bs_claimed(usn,bs,2)-param(8)<0 
     and desc.iaf(5)<3 and -,priv then bserror(bs):=8 else
  bserror(bs):=set_bs_claims(desc.conprocname,usercatbs.n,param);
  if bserror(bs)=0 then
  begin
   lookup_bs_claims(desc.conprocname,usercatbs.n,param);
   for i:=1,2 do permbsclaimed(desc.conusercatno,bs,i):=
                 permbsclaimed(desc.conusercatno,bs,i)+param(6+i);
<*+2*>
   if testop(2) and param(7)<>0 and param(8)<>0 then 
    disable write(z,"nl",1,<:perm bs set userno :>,desc.conusercatno,
     usercatbs.n,
     permbsclaimed(desc.conusercatno,bs,1),
     permbsclaimed(desc.conusercatno,bs,2));
<*-2*>
  end else
  begin
    res:=setbs:=31;
<*+2*>
    if testop(2) then disable write(z,"nl",1,
       <:set bs claim :>,bserror(bs),true,10,usercatbs.n,<< ddddd>,
       param(1),param(2),param(3),param(4),
       param(6),param(7),param(8));
<*-2*>
  end bserror;
  end resource>0;
end for bs;
if res>0 then
  writeerror(z,errorbsclaimsexceeded,bserror);
end setbs;

procedure list_bs(name,z);
long array name; zone z;
begin
integer bs,i,res;
long array field laf;
integer array param(1:10);
write(z,"nl",2,true,10,<:device:>,"sp",7,<:temp:>,"sp",11,<:key 1:>,
      "sp",11,<:login:>,"sp",12,<:perm:>,
        "nl",1,"sp",9);
for i:=1 step 1 until 4 do write(z,"sp",1,<:entries:>,"sp",4,<:segm:>);
for bs:=1 step 1 until noofbs do
begin
  laf:=(bs-1)*12;
  res:=lookup_bs_claims(name,usercatbs.laf,param);
  write(z,"nl",1);
  if res>0 then write(z,<:***:>,true,12,name,
       true,12,usercatbs.laf,<: does not exist:>,res) else
begin
  write(z,true,10,usercatbs.laf);
  for i:=1 step 1 until 4 do
  write(z,true,8,<< dddddd>,param(2*i-1),true,8,param(2*i));
end;
end for bs;
end listbs;

procedure write_cur_time(z);
zone z;
begin
integer t;
real r;
write(z,<< dd dd dd.dd dd>,systime(6,systime(7,0,0.0),r)+r/1000000);
end writecurtime;

procedure write_time(z,time);
value time; integer time;
zone z;
begin
integer t;
real r;
write(z,<< dd dd dd.dd dd>,systime(6,time,r)+r/1000000);
end writetime;

procedure clear_entries(permkey,lower,upper,z);
value permkey,lower,upper; integer permkey,lower,upper;
zone z;
<*clear all temporary entries up to permkey
within the bases given*>
begin
integer i,j;
integer array field rec,srec,r;
long array field doc,name;
long array sname(1:3);

rec:=0;
name:=6;
doc:=16;
sname(1):=0;
wait(catsem);
open(cat,4,<:catalog:>,1 shift 9);
setposition(cat,0,0);
<*+2*>
if testop(2) then write(z,<:remove entries: :>,permkey,lower,upper);
<*-2*>
for i:=inrec6(cat,0) while i>2 do
begin
  inrec6(cat,i);
  srec:=0;
  repeat
  for r:=0 step 34 until 512-34 do
  begin
    rec:=srec+r;
    if cat.rec(1)<>-1 then
    begin
      if cat.rec(1) extract 3<=permkey then
      begin
        if lower<=cat.rec(2) and upper>=cat.rec(3) then
        begin
        setbase(lower,upper);
<*+2*>
        if testop(2) then write(z,"nl",1,cat.rec.name);
<*-2*>
        removeentry(cat.rec.name);
        resetbase;
        end stdbase;
      end permkey;
    end entry;
  end record;
  srec:=srec+512;
  until srec>=i;
end segments;
close(cat,true);
signal(catsem);
end clearentries;

boolean procedure find_core_hole(desc,fblock,lblock,z);
integer fblock,lblock;
integer array desc;
zone z;
begin
integer size,blocks,cbn,ccb,cblock,cs;
boolean free;
  fblock:=lblock:=-1;
  cs:=coreblocksize*512;
  size:=desc.con_size;
  blocks:=((size+cs-2)//cs);
<*+2*>
  if testop(2) then write(z,"nl",1,<:size, blocks :>,size,blocks,cs);
<*-2*>
  findcorehole:=false;
  cbn:=0;
  repeat cbn:=cbn+1;
  cblock:=blocks;
  ccb:=0;
    repeat ccb:=ccb+1;
    free:=coretable(cbn+ccb-1,2)=0;
    if free then cblock:=cblock-1;
<*+2*>
    if testop(2) then write(z,"nl",1,<:free blocks:>,blocks-cblock);
<*-2*>
    until -,free or cblock=0 or cbn+ccb-1>=noofcoreblocks;
  until cblock=0 or free or cbn>=noofcoreblocks;
  if cblock=0 then
  begin
    findcorehole:=true;
    fblock:=cbn;
    lblock:=cbn+blocks;
  end found;
end findcorehol;

integer procedure find_max_free_core;
begin
integer max,i,j,jmax;
boolean free;
max:=i:=0;
repeat i:=i+1;
  j:=jmax:=0;
  repeat j:=j+1;
    free:=coretable(i+j-1,2)=0;
    if free then jmax:=jmax+coreblocksize;
  until -,free or i+j-1>=noofcoreblocks;
  if max<jmax then max:=jmax;
  until i>=noofcoreblocks;
findmaxfreecore:=max*512;
end findmaxfreecore;


integer procedure swop_child(swop,ct,in,z);
value in;
long array swop;
integer array field ct;
boolean in;
zone z;
begin
integer array M,A(1:8);
integer i,j,res,rep,bytes,swopext,pda_bs;
long array field nf;
integer array field pda_c;
  setbasestd;
  pda_c:=childtable.ct.ctchildpda;
  if pda_c=0 then res:=4 else
  begin
  nf:=2;
  pda_bs:=process_description(swop);
  if pda_bs=0 then
  begin
   create_area_process(swop);
   reserve_process(swop);
  end;
  M(1):=(if in then 3 else 5) shift 12;
  M(2):=core.pda_c.coreaddressref(1)+core.pda_c.base_ref;
  M(3):=core.pda_c.coreaddressref(2)+core.pda_c.base_ref;
  M(4):=childtable.ct.ctsegmswop;
  bytes:=M(3)-M(2)+2;
<*+2*>
  if testop(7) then
   disable begin
      write(z,"nl",1,"cr",1,<:swopproc :>,swop,
       if in then <: in:> else <: out:>,M(2),M(3),M(4));
      setposition(z,0,0);
   end;
<*-2*>
  rep:=0;
  repeat rep:=rep+1;
    csendmessage(swop.f,M,swopext);
    cwaitanswer(swopext,A,res,0);
  until res<>1 or (A(1)=0 and A(2)=bytes) or rep=10;
<*+2*>
     if testop(7) then
     disable begin
       write(z,res,A(1),A(2),rep);
       setposition(z,0,0);
     end;
<*-2*>
  if rep=10 then res:=6 else
  if res=1 and A(1)=0 and A(2)<>bytes then res:=7 else
  if res=1 and A(1)<>0 then res:=8;
  end child pda>0
swop_child:=res;
resetbase;
end swop_child;


procedure list_proc(very,connect);
value connect; boolean connect;
zone very;
begin
long array field nf;
integer array field ct,cpda,cur;
integer i;
long t;
real r;
    nf:=2;
    ct:=-ct_size;
    if connect then writecurtime(very);
    if lock and connect then write(very,<:  **locked** :>);
    for i:=1 step 1 until maxchildren do
    begin
      ct:=ct+ct_size;
      cpda:=childtable.ct.ct_childpda;
      if cpda>0 and connect then
      begin
        cur:=childtable.ct.ctref;
        t:=core.cpda.runtimeref;
        r:=core.cpda.starttimeref/10000;
        if connect then write(very,"cr",1,"nl",1,true,11,core.cpda.nf,
        <<ddd>,(core.cpda.coreaddressref(2)-
                core.cpda.coreaddressref(1)+2)//1024,<:k:>,
        "sp",1,case childtable.ct.ct_state of (
         <:created :>,<:running :>,<:stopped :>,
         <:breaked :>,<:swopped :>),<<dd dd dd.dd dd>,
         systime(4,r,r)+r/1000000,
         <: cpu:>,<< ddddd>, t/10000,"sp",2,
        if childtable.ct.ct_batch>0 then <:batch___:> else <:on line :>);
        if childtable.ct.ct_batch>0 then
         write(very,true,11,q.cur.condesterm) else
         write(very,true,11,condesc.cur.condesterm);
         if childtable.ct.ct_batch>0 then
         write(very,<: job :>,<<dddd>,q.cur.q_jobno);
      end;
    end for;
  end list;
▶EOF◀