1
2
3
4
5
6
7
8
9
10
11 package org.eclipse.jgit.internal.storage.pack;
12
13 import java.lang.ref.ReferenceQueue;
14 import java.lang.ref.SoftReference;
15
16 import org.eclipse.jgit.storage.pack.PackConfig;
17
18 class DeltaCache {
19 private final long size;
20
21 private final int entryLimit;
22
23 private final ReferenceQueue<byte[]> queue;
24
25 private long used;
26
27 DeltaCache(PackConfig pc) {
28 size = pc.getDeltaCacheSize();
29 entryLimit = pc.getDeltaCacheLimit();
30 queue = new ReferenceQueue<>();
31 }
32
33 boolean canCache(int length, ObjectToPack src, ObjectToPack res) {
34
35
36 if (0 < size && size < used + length) {
37 checkForGarbageCollectedObjects();
38 if (0 < size && size < used + length)
39 return false;
40 }
41
42 if (length < entryLimit) {
43 used += length;
44 return true;
45 }
46
47
48
49
50
51 if (length >> 10 < (src.getWeight() >> 20) + (res.getWeight() >> 21)) {
52 used += length;
53 return true;
54 }
55
56 return false;
57 }
58
59 void credit(int reservedSize) {
60 used -= reservedSize;
61 }
62
63 Ref cache(byte[] data, int actLen, int reservedSize) {
64
65
66
67 data = resize(data, actLen);
68
69
70
71
72
73 if (reservedSize != data.length) {
74 used -= reservedSize;
75 used += data.length;
76 }
77 return new Ref(data, queue);
78 }
79
80 byte[] resize(byte[] data, int actLen) {
81 if (data.length != actLen) {
82 byte[] nbuf = new byte[actLen];
83 System.arraycopy(data, 0, nbuf, 0, actLen);
84 data = nbuf;
85 }
86 return data;
87 }
88
89 private void checkForGarbageCollectedObjects() {
90 Ref r;
91 while ((r = (Ref) queue.poll()) != null)
92 used -= r.cost;
93 }
94
95 static class Ref extends SoftReference<byte[]> {
96 final int cost;
97
98 Ref(byte[] array, ReferenceQueue<byte[]> queue) {
99 super(array, queue);
100 cost = array.length;
101 }
102 }
103 }