// IfsScav2-1.bcpl - Pass 2 Phase 1 // Copyright Xerox Corporation 1979, 1980, 1981 // Last modified July 14, 1981 3:55 PM by Boggs get "AltoFileSys.d" external [ // outgoing procedures Pass2Phase1 // incoming procedures PutTemplate; Ws; InitializeZone; Sort ReadLPTE; WriteLPTE; GetLptSorted; SetLptSorted Gets; Resets; TruncateDiskStream; FlushLPT; CompareLPTEs GetLpteIfsName; GetLpteLength; GetLpteType PrintTime; ReadCalendar; Usc; SysErr; Unqueue // incoming statics dsp; keys; debugFlag; scratchDisk; numFiles; phase; lpt chunkQ ] structure String [ length byte; char↑1,1 byte ] //--------------------------------------------------------------------------- let Pass2Phase1(buffPtr, numBuffs) = valof //--------------------------------------------------------------------------- // This phase sorts the leader page table for use by phase 3. // The more memory available to the sort package, the faster things go. // Pass2 starts in resident code with no paging buffers in use and // allocates as much contiguous space as it can, leaving just enough // slop for the intermediate sort files and the sort overlays. [ Ws("*N[2-1]"); if debugFlag then Gets(keys) if GetLptSorted(lpt) then [ Ws("*N[2-1] LPT is already sorted"); resultis true ] phase, numFiles = 1, 0 Resets(lpt) let sortZone = InitializeZone(buffPtr, 256*numBuffs, SysErr, 0) // InitializeZone calls IfsAddToZone, which queues a chunk descriptor // on chunkQ. Since sortZone is not part of sysZone, this is bad. Unqueue(chunkQ, chunkQ!1) let startTime = vec 1; ReadCalendar(startTime) Sort(GetLpte, PutLpte, CompareLPTEs, 25, 256, sortZone, scratchDisk) PrintTime(startTime) PutTemplate(dsp, "*N[2-1] Number of files = $UD", numFiles) PutTemplate(dsp, "*N[2-1] SortZone size = $D words", 256*numBuffs) TruncateDiskStream(lpt) //we may have squeezed out some deleted entries SetLptSorted(lpt, true) FlushLPT(lpt) resultis true ] //--------------------------------------------------------------------------- and GetLpte(lpte, nil) = valof //--------------------------------------------------------------------------- // Gets the next lpte to be added to the sort [ unless ReadLPTE(lpt, lpte) resultis 0 if GetLpteType(lpte) ne dvTypeFile loop resultis GetLpteLength(lpte) ] repeat //--------------------------------------------------------------------------- and PutLpte(lpte, length) be //--------------------------------------------------------------------------- // Puts a sorted lpte into the output file [ if numFiles eq 0 then [ //first output record - overwrite input! Resets(lpt) ReadLPTE(lpt) //don't overwrite home block ] numFiles = numFiles +1 WriteLPTE(lpt, lpte) ]