]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MINICERN/packlib/zebra/rz/rzpurg.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / MINICERN / packlib / zebra / rz / rzpurg.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
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.
8*
9* Revision 1.1.1.1 1996/03/06 10:47:26 mclareni
10* Zebra
11*
12*
13#include "zebra/pilot.h"
14 SUBROUTINE RZPURG(NKEEP)
15*
16************************************************************************
17*
18* Purge cycles in the CWD
19* Input:
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
22* cycle is kept
23*
24* Called by <USER>
25*
26* Author : R.Brun DD/US/PD
27* Written : 06.04.86
28* Last mod: 11.12.88
29* : 04.03.94 S.Banerjee (Change in cycle structure)
30*
31************************************************************************
32#include "zebra/rzcl.inc"
33#include "zebra/rzclun.inc"
34#include "zebra/rzk.inc"
35#include "zebra/rzcycle.inc"
36*
37*-----------------------------------------------------------------------
38*
39#include "zebra/q_jbit.inc"
40#include "zebra/q_jbyt.inc"
41
42 IQUEST(1)=0
43 NK=NKEEP
44 IF(NK.LT.1)NK=1
45*
46* Check if write permission
47*
48 IF(LQRS.EQ.0)GO TO 999
49 IFLAG=1
50 CALL RZMODS('RZPURG',IFLAG)
51 IF(IFLAG.NE.0)GO TO 999
52*
53 LK=IQ(KQSP+LCDIR+KLK)
54 LC=IQ(KQSP+LCDIR+KLC)
55 LE=IQ(KQSP+LCDIR+KLE)
56 NKEYS =IQ(KQSP+LCDIR+KNKEYS)
57 NWKEY =IQ(KQSP+LCDIR+KNWKEY)
58 IF(NKEYS.EQ.0)GO TO 999
59*
60 NPUOLD=0
61 IF(LPURG.NE.0)THEN
62 NPURG=IQ(KQSP+LPURG+1)
63 DO 5 I=1,NPURG
64 NPUOLD=NPUOLD+IQ(KQSP+LPURG+2*I+1)-IQ(KQSP+LPURG+2*I)+1
65 5 CONTINUE
66 ENDIF
67*
68 DO 20 IK=1,NKEYS
69 LKC=LK+(NWKEY+1)*(IK-1)
70 LCYC=IQ(KQSP+LCDIR+LKC)
71 NC=0
72 10 NC=NC+1
73 IF (KVSCYC.EQ.0) THEN
74 LCOLD = JBYT(IQ(KQSP+LCDIR+LCYC+KPPCYC), 1,16)
75 ELSE
76 LCOLD = IQ(KQSP+LCDIR+LCYC+KPPCYC)
77 ENDIF
78*
79* Check for first cycle to be kept
80*
81 LKEEP=LCOLD
82 IF(LKEEP.NE.0)THEN
83 12 IF(JBIT(IQ(KQSP+LCDIR+LKEEP+KFLCYC),5).EQ.0)THEN
84 IF (KVSCYC.EQ.0) THEN
85 LKEEP = JBYT(IQ(KQSP+LCDIR+LKEEP+KPPCYC),1,16)
86 ELSE
87 LKEEP = IQ(KQSP+LCDIR+LKEEP+KPPCYC)
88 ENDIF
89 IF(LKEEP.NE.0)GO TO 12
90 ENDIF
91 ENDIF
92 IF(NC.EQ.NK)THEN
93 IF (KVSCYC.EQ.0) THEN
94 CALL SBYT(LKEEP,IQ(KQSP+LCDIR+LCYC+KPPCYC),1,16)
95 ELSE
96 IQ(KQSP+LCDIR+LCYC+KPPCYC) = LKEEP
97 ENDIF
98 ENDIF
99 IF(NC.GT.NK)THEN
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)
103 ELSE
104 IQ(KQSP+LCDIR+LCYC+KPPCYC) = LKEEP
105 ENDIF
106 GO TO 15
107 ENDIF
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)
113 ELSE
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)
118 ENDIF
119 IRL =0
120 NWL =0
121*
122* Mark all records that can be purged in first pass
123*
124 NLEFT=LREC-IP1+1
125 NW1=NW
126 IF(NW1.GE.NLEFT)NW1=NLEFT
127 IF(IR2.NE.0)THEN
128 NR=(NW-NW1-1)/LREC+1
129 IF(NR.GT.1)THEN
130 CALL RZPURF(NR-1,IR2)
131 ENDIF
132 IRL=IR2+NR-1
133 NWL=NW-NW1-(NR-1)*LREC
134 ENDIF
135 IF(NW1.EQ.LREC)THEN
136 CALL RZPURF(1,IR1)
137 IR1=0
138 ENDIF
139 IF(NWL.EQ.LREC)THEN
140 CALL RZPURF(1,IRL)
141 IRL=0
142 ENDIF
143 IRLOUT=IQ(KQSP+LCDIR+KRLOUT)
144 IF(IRL.EQ.IRLOUT.AND.NWL+1.EQ.IQ(KQSP+LCDIR+KIP1))THEN
145 CALL RZPURF(1,IRL)
146 ENDIF
147 IQ(KQSP+LCDIR+LCYC )=-1
148 IQ(KQSP+LCDIR+LCYC+1)=IR1
149 IQ(KQSP+LCDIR+LCYC+2)=IRL
150 ENDIF
151*
152 15 IF(LCOLD.NE.0.AND.LCOLD.NE.LCYC)THEN
153 LCYC=LCOLD
154 GO TO 10
155 ENDIF
156 20 CONTINUE
157*
158* Now loop on all purged cycles to find complete records
159* purged
160*
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)
165 IF(IR1.NE.0)THEN
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)
173 ELSE
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)
178 ENDIF
179 KRL =0
180 NLEFT=LREC-KP1+1
181 NW1=NW
182 IF(NW1.GE.NLEFT)NW1=NLEFT
183 IF(KR2.NE.0)THEN
184 NR=(NW-NW1-1)/LREC+1
185 KRL=KR2+NR-1
186 ENDIF
187 IF(KR1.EQ.IR1.OR.KRL.EQ.IR1)GO TO 40
188 30 CONTINUE
189 CALL RZPURF(1,IR1)
190 ENDIF
191*
192 40 IF(IRL.NE.0)THEN
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)
200 ELSE
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)
205 ENDIF
206 KRL =0
207 NLEFT=LREC-KP1+1
208 NW1=NW
209 IF(NW1.GE.NLEFT)NW1=NLEFT
210 IF(KR2.NE.0)THEN
211 NR=(NW-NW1-1)/LREC+1
212 KRL=KR2+NR-1
213 ENDIF
214 IF(KR1.EQ.IRL.OR.KRL.EQ.IRL)GO TO 70
215 50 CONTINUE
216 CALL RZPURF(1,IRL)
217 ENDIF
218 70 CONTINUE
219*
220* Garbage collection on cycles area + relocation
221*
222 LKC3=LE-KLCYCL+1
223 80 IF(LKC3.LT.LC)GO TO 200
224 IF(IQ(KQSP+LCDIR+LKC3).EQ.-1)THEN
225 LKC3=LKC3+KLCYCL
226 LKC2=LKC3-2*KLCYCL
227 90 IF(IQ(KQSP+LCDIR+LKC2).NE.-1)THEN
228 LKC2=LKC2+KLCYCL
229 LKC1=LKC2-2*KLCYCL
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
233 ELSE
234 IF(LKC1.GT.LC)THEN
235 LKC1=LKC1-KLCYCL
236 GO TO 100
237 ENDIF
238 ENDIF
239*
240 NPUSH=LKC3-LKC2
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)
245 ELSE
246 LCOLD = IQ(KQSP+LCDIR+LKC+KPPCYC)
247 ENDIF
248 IF(LCOLD.GE.LKC1.AND.LCOLD.LT.LKC2)THEN
249 LCOLD=LCOLD+NPUSH
250 IF (KVSCYC.EQ.0) THEN
251 CALL SBYT(LCOLD,IQ(KQSP+LCDIR+LKC+KPPCYC),1,16)
252 ELSE
253 IQ(KQSP+LCDIR+LKC+KPPCYC) = LCOLD
254 ENDIF
255 ENDIF
256 ENDIF
257 110 CONTINUE
258*
259 DO 120 IK=1,NKEYS
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
264 ENDIF
265 120 CONTINUE
266*
267 CALL UCOPY2(IQ(KQSP+LCDIR+LKC1),IQ(KQSP+LCDIR+LKC1+NPUSH),
268 + LKC2-LKC1)
269 LKC3=LKC1+NPUSH
270 LKC2=LKC1-KLCYCL
271 IF(LKC1.NE.LC)GO TO 90
272 LC=LC+NPUSH
273 GO TO 200
274*
275 ELSE
276 LKC2=LKC2-KLCYCL
277 IF(LKC2.GE.LC)GO TO 90
278 ENDIF
279 ELSE
280 LKC3=LKC3-KLCYCL
281 GO TO 80
282 ENDIF
283*
284* Reset internal pointers
285*
286 200 CONTINUE
287*
288 NPUNEW=0
289 IF(LPURG.NE.0)THEN
290 NPURG=IQ(KQSP+LPURG+1)
291 DO 210 I=1,NPURG
292 NPUNEW=NPUNEW+IQ(KQSP+LPURG+2*I+1)-IQ(KQSP+LPURG+2*I)+1
293 210 CONTINUE
294 ENDIF
295 NPU=NPUNEW-NPUOLD
296 IQUEST( 9)=IQ(KQSP+LCDIR+KQUOTA)-IQ(KQSP+LCDIR+KRUSED)+NPU
297 IQUEST(11)=(LC-IQ(KQSP+LCDIR+KLC))/KLCYCL
298 IQUEST(12)=NPU*LREC
299 IQUEST(13)=NPU
300*
301 IQ(KQSP+LCDIR+KRUSED)=IQ(KQSP+LCDIR+KRUSED)-NPU
302 NWP=NPU*LREC
303 NMEGA=NWP/1000000
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
309*
310 999 RETURN
311 END