5 * Revision 1.2 1996/04/24 17:27:05 mclareni
6 * Extend the include file cleanup to dzebra, rz and tq, and also add
7 * dependencies in some cases.
9 * Revision 1.1.1.1 1996/03/06 10:47:26 mclareni
13 #include "zebra/pilot.h"
14 SUBROUTINE RZPURG(NKEEP)
16 ************************************************************************
18 * Purge cycles in the CWD
20 * NKEEP Number of cycles which must be kept for the given key
21 * If NKEEP < 1 then NKEEP is taken to be 1 and only the highest
26 * Author : R.Brun DD/US/PD
29 * : 04.03.94 S.Banerjee (Change in cycle structure)
31 ************************************************************************
32 #include "zebra/rzcl.inc"
33 #include "zebra/rzclun.inc"
34 #include "zebra/rzk.inc"
35 #include "zebra/rzcycle.inc"
37 *-----------------------------------------------------------------------
39 #include "zebra/q_jbit.inc"
40 #include "zebra/q_jbyt.inc"
46 * Check if write permission
48 IF(LQRS.EQ.0)GO TO 999
50 CALL RZMODS('RZPURG',IFLAG)
51 IF(IFLAG.NE.0)GO TO 999
56 NKEYS =IQ(KQSP+LCDIR+KNKEYS)
57 NWKEY =IQ(KQSP+LCDIR+KNWKEY)
58 IF(NKEYS.EQ.0)GO TO 999
62 NPURG=IQ(KQSP+LPURG+1)
64 NPUOLD=NPUOLD+IQ(KQSP+LPURG+2*I+1)-IQ(KQSP+LPURG+2*I)+1
69 LKC=LK+(NWKEY+1)*(IK-1)
70 LCYC=IQ(KQSP+LCDIR+LKC)
74 LCOLD = JBYT(IQ(KQSP+LCDIR+LCYC+KPPCYC), 1,16)
76 LCOLD = IQ(KQSP+LCDIR+LCYC+KPPCYC)
79 * Check for first cycle to be kept
83 12 IF(JBIT(IQ(KQSP+LCDIR+LKEEP+KFLCYC),5).EQ.0)THEN
85 LKEEP = JBYT(IQ(KQSP+LCDIR+LKEEP+KPPCYC),1,16)
87 LKEEP = IQ(KQSP+LCDIR+LKEEP+KPPCYC)
89 IF(LKEEP.NE.0)GO TO 12
94 CALL SBYT(LKEEP,IQ(KQSP+LCDIR+LCYC+KPPCYC),1,16)
96 IQ(KQSP+LCDIR+LCYC+KPPCYC) = LKEEP
100 IF(JBIT(IQ(KQSP+LCDIR+LCYC+KFLCYC),5).NE.0)THEN
101 IF (KVSCYC.EQ.0) THEN
102 CALL SBYT(LKEEP,IQ(KQSP+LCDIR+LCYC+KPPCYC),1,16)
104 IQ(KQSP+LCDIR+LCYC+KPPCYC) = LKEEP
108 IF (KVSCYC.EQ.0) THEN
109 IR1 = JBYT(IQ(KQSP+LCDIR+LCYC+KFRCYC),17,16)
110 IP1 = JBYT(IQ(KQSP+LCDIR+LCYC+KORCYC), 1,16)
111 NW = JBYT(IQ(KQSP+LCDIR+LCYC+KNWCYC), 1,20)
112 IR2 = JBYT(IQ(KQSP+LCDIR+LCYC+KSRCYC),17,16)
114 IR1 = IQ(KQSP+LCDIR+LCYC+KFRCYC)
115 IP1 = JBYT(IQ(KQSP+LCDIR+LCYC+KORCYC), 1,20)
116 NW = IQ(KQSP+LCDIR+LCYC+KNWCYC)
117 IR2 = IQ(KQSP+LCDIR+LCYC+KSRCYC)
122 * Mark all records that can be purged in first pass
126 IF(NW1.GE.NLEFT)NW1=NLEFT
130 CALL RZPURF(NR-1,IR2)
133 NWL=NW-NW1-(NR-1)*LREC
143 IRLOUT=IQ(KQSP+LCDIR+KRLOUT)
144 IF(IRL.EQ.IRLOUT.AND.NWL+1.EQ.IQ(KQSP+LCDIR+KIP1))THEN
147 IQ(KQSP+LCDIR+LCYC )=-1
148 IQ(KQSP+LCDIR+LCYC+1)=IR1
149 IQ(KQSP+LCDIR+LCYC+2)=IRL
152 15 IF(LCOLD.NE.0.AND.LCOLD.NE.LCYC)THEN
158 * Now loop on all purged cycles to find complete records
161 DO 70 LKC=LC,LE-KLCYCL+1,KLCYCL
162 IF(IQ(KQSP+LCDIR+LKC).NE.-1)GO TO 70
163 IR1=IQ(KQSP+LCDIR+LKC+1)
164 IRL=IQ(KQSP+LCDIR+LKC+2)
166 DO 30 LKC1=LC,LE-KLCYCL+1,KLCYCL
167 IF(IQ(KQSP+LCDIR+LKC1).EQ.-1)GO TO 30
168 IF (KVSCYC.EQ.0) THEN
169 KR1 = JBYT(IQ(KQSP+LCDIR+LKC1+KFRCYC),17,16)
170 KP1 = JBYT(IQ(KQSP+LCDIR+LKC1+KORCYC), 1,16)
171 NW = JBYT(IQ(KQSP+LCDIR+LKC1+KNWCYC), 1,20)
172 KR2 = JBYT(IQ(KQSP+LCDIR+LKC1+KSRCYC),17,16)
174 KR1 = IQ(KQSP+LCDIR+LKC1+KFRCYC)
175 KP1 = JBYT(IQ(KQSP+LCDIR+LKC1+KORCYC), 1,20)
176 NW = IQ(KQSP+LCDIR+LKC1+KNWCYC)
177 KR2 = IQ(KQSP+LCDIR+LKC1+KSRCYC)
182 IF(NW1.GE.NLEFT)NW1=NLEFT
187 IF(KR1.EQ.IR1.OR.KRL.EQ.IR1)GO TO 40
193 DO 50 LKC1=LC,LE-KLCYCL+1,KLCYCL
194 IF(IQ(KQSP+LCDIR+LKC1).EQ.-1)GO TO 50
195 IF (KVSCYC.EQ.0) THEN
196 KR1 = JBYT(IQ(KQSP+LCDIR+LKC1+KFRCYC),17,16)
197 KP1 = JBYT(IQ(KQSP+LCDIR+LKC1+KORCYC), 1,16)
198 NW = JBYT(IQ(KQSP+LCDIR+LKC1+KNWCYC), 1,20)
199 KR2 = JBYT(IQ(KQSP+LCDIR+LKC1+KSRCYC),17,16)
201 KR1 = IQ(KQSP+LCDIR+LKC1+KFRCYC)
202 KP1 = JBYT(IQ(KQSP+LCDIR+LKC1+KORCYC), 1,20)
203 NW = IQ(KQSP+LCDIR+LKC1+KNWCYC)
204 KR2 = IQ(KQSP+LCDIR+LKC1+KSRCYC)
209 IF(NW1.GE.NLEFT)NW1=NLEFT
214 IF(KR1.EQ.IRL.OR.KRL.EQ.IRL)GO TO 70
220 * Garbage collection on cycles area + relocation
223 80 IF(LKC3.LT.LC)GO TO 200
224 IF(IQ(KQSP+LCDIR+LKC3).EQ.-1)THEN
227 90 IF(IQ(KQSP+LCDIR+LKC2).NE.-1)THEN
230 IF(LKC1.LT.LC)LKC1=LC
231 100 IF(IQ(KQSP+LCDIR+LKC1).EQ.-1)THEN
232 IF(LKC1.GT.LC)LKC1=LKC1+KLCYCL
241 DO 110 LKC=LC,LKC2-KLCYCL,KLCYCL
242 IF(IQ(KQSP+LCDIR+LKC).NE.-1)THEN
243 IF (KVSCYC.EQ.0) THEN
244 LCOLD = JBYT(IQ(KQSP+LCDIR+LKC+KPPCYC),1,16)
246 LCOLD = IQ(KQSP+LCDIR+LKC+KPPCYC)
248 IF(LCOLD.GE.LKC1.AND.LCOLD.LT.LKC2)THEN
250 IF (KVSCYC.EQ.0) THEN
251 CALL SBYT(LCOLD,IQ(KQSP+LCDIR+LKC+KPPCYC),1,16)
253 IQ(KQSP+LCDIR+LKC+KPPCYC) = LCOLD
260 LCYC=IQ(KQSP+LCDIR+LK+(NWKEY+1)*(IK-1))
261 IF(LCYC.GE.LKC1.AND.LCYC.LT.LKC2)THEN
262 IQ(KQSP+LCDIR+LK+(NWKEY+1)*(IK-1))=
263 + IQ(KQSP+LCDIR+LK+(NWKEY+1)*(IK-1))+NPUSH
267 CALL UCOPY2(IQ(KQSP+LCDIR+LKC1),IQ(KQSP+LCDIR+LKC1+NPUSH),
271 IF(LKC1.NE.LC)GO TO 90
277 IF(LKC2.GE.LC)GO TO 90
284 * Reset internal pointers
290 NPURG=IQ(KQSP+LPURG+1)
292 NPUNEW=NPUNEW+IQ(KQSP+LPURG+2*I+1)-IQ(KQSP+LPURG+2*I)+1
296 IQUEST( 9)=IQ(KQSP+LCDIR+KQUOTA)-IQ(KQSP+LCDIR+KRUSED)+NPU
297 IQUEST(11)=(LC-IQ(KQSP+LCDIR+KLC))/KLCYCL
301 IQ(KQSP+LCDIR+KRUSED)=IQ(KQSP+LCDIR+KRUSED)-NPU
304 IQ(KQSP+LCDIR+KMEGA)=IQ(KQSP+LCDIR+KMEGA)-NMEGA
305 NWP=NWP-1000000*NMEGA
306 IQ(KQSP+LCDIR+KWUSED)=IQ(KQSP+LCDIR+KWUSED)-NWP
307 IQ(KQSP+LCDIR+KNFREE)=IQ(KQSP+LCDIR+KNFREE)+LC-IQ(KQSP+LCDIR+KLC)
308 IQ(KQSP+LCDIR+KLC)=LC