1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.buildcache.hash;
20
21 import java.nio.ByteBuffer;
22 import java.util.concurrent.ConcurrentHashMap;
23 import java.util.concurrent.ConcurrentMap;
24
25
26
27
28 public class ThreadLocalBuffer {
29
30 private static final ConcurrentMap<CloseableBuffer, Boolean> LOCALS = new ConcurrentHashMap<>();
31
32 public static ByteBuffer get(ThreadLocal<CloseableBuffer> local, int capacity) {
33 final CloseableBuffer buffer = local.get();
34 if (buffer == null) {
35 return create(local, capacity);
36 }
37
38 if (capacity(buffer) < capacity) {
39 close(buffer);
40 return create(local, capacity * 2);
41 }
42
43 return clear(buffer);
44 }
45
46 @Override
47 public void finalize() {
48 for (CloseableBuffer buffer : LOCALS.keySet()) {
49 buffer.close();
50 }
51 }
52
53 private static ByteBuffer create(ThreadLocal<CloseableBuffer> local, int capacity) {
54 final CloseableBuffer buffer = CloseableBuffer.directBuffer(capacity);
55 local.set(buffer);
56 LOCALS.put(buffer, false);
57 return buffer.getBuffer();
58 }
59
60 private static int capacity(CloseableBuffer buffer) {
61 return buffer.getBuffer().capacity();
62 }
63
64 private static ByteBuffer clear(CloseableBuffer buffer) {
65 return (ByteBuffer) buffer.getBuffer().clear();
66 }
67
68 private static void close(CloseableBuffer buffer) {
69 LOCALS.remove(buffer);
70 buffer.close();
71 }
72
73 private ThreadLocalBuffer() {}
74 }