aboutsummaryrefslogtreecommitdiff
path: root/protobuf-lite
diff options
context:
space:
mode:
authorCarl Mastrangelo <notcarl@google.com>2016-09-21 10:25:50 -0700
committerCarl Mastrangelo <notcarl@google.com>2016-09-21 10:58:59 -0700
commit017f5f88080cfedeff5350a0ef0a37a3e6f6e028 (patch)
tree682bc7e3f935c87b35ffec5a81abd52dc0f5a6c4 /protobuf-lite
parentef4e0f4522a0da7c7c232cf6aeb344c86ffc7c76 (diff)
downloadgrpc-grpc-java-017f5f88080cfedeff5350a0ef0a37a3e6f6e028.tar.gz
protobuf: make buffer cache even weaker
Diffstat (limited to 'protobuf-lite')
-rw-r--r--protobuf-lite/src/main/java/io/grpc/protobuf/lite/ProtoLiteUtils.java20
1 files changed, 9 insertions, 11 deletions
diff --git a/protobuf-lite/src/main/java/io/grpc/protobuf/lite/ProtoLiteUtils.java b/protobuf-lite/src/main/java/io/grpc/protobuf/lite/ProtoLiteUtils.java
index 8cf95115f..05db39db7 100644
--- a/protobuf-lite/src/main/java/io/grpc/protobuf/lite/ProtoLiteUtils.java
+++ b/protobuf-lite/src/main/java/io/grpc/protobuf/lite/ProtoLiteUtils.java
@@ -49,6 +49,8 @@ import io.grpc.internal.GrpcUtil;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
/**
* Utility methods for using protobuf with grpc.
@@ -78,15 +80,11 @@ public class ProtoLiteUtils {
globalRegistry = checkNotNull(newRegistry, "newRegistry");
}
- /**
- * Local cache of buffers to use for parsing. ThreadLocal used a WeakReference internally, so
- * these will not be retained.
- */
- private static final ThreadLocal<byte[]> bufs = new ThreadLocal<byte[]>() {
+ private static final ThreadLocal<Reference<byte[]>> bufs = new ThreadLocal<Reference<byte[]>>() {
@Override
- protected byte[] initialValue() {
- return new byte[4096]; // Picked at random.
+ protected Reference<byte[]> initialValue() {
+ return new WeakReference<byte[]>(new byte[4096]); // Picked at random.
}
};
@@ -141,11 +139,11 @@ public class ProtoLiteUtils {
if (stream instanceof KnownLength) {
int size = stream.available();
if (size > 0 && size <= GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE) {
- // Coded Input stream does not escape, so buf does not escape.
- byte[] buf = bufs.get();
- if (buf.length < size) {
+ // buf should not be used after this method has returned.
+ byte[] buf = bufs.get().get();
+ if (buf == null || buf.length < size) {
buf = new byte[size];
- bufs.set(buf);
+ bufs.set(new WeakReference<byte[]>(buf));
}
int chunkSize;
int position = 0;