blob: f89d5ff3bfac20d91eb6a2f06807dc862041364c [file] [log] [blame]
package com.bumptech.glide.util;
import android.util.Log;
import java.util.Queue;
/**
* A pool for reusing byte arrays that produces and contains byte arrays of a fixed size.
*/
public final class ByteArrayPool {
private static final String TAG = "ByteArrayPool";
// 64 KB.
private static final int TEMP_BYTES_SIZE = 64 * 1024;
// 512 KB.
private static final int MAX_SIZE = 2 * 1048 * 1024;
private static final int MAX_BYTE_ARRAY_COUNT = MAX_SIZE / TEMP_BYTES_SIZE;
private final Queue<byte[]> tempQueue = Util.createQueue(0);
private static final ByteArrayPool BYTE_ARRAY_POOL = new ByteArrayPool();
/**
* Returns a constant singleton byte array pool.
*/
public static ByteArrayPool get() {
return BYTE_ARRAY_POOL;
}
private ByteArrayPool() { }
/**
* Removes all byte arrays from the pool.
*/
public void clear() {
synchronized (tempQueue) {
tempQueue.clear();
}
}
/**
* Returns a byte array by retrieving one from the pool if the pool is non empty or otherwise by creating a new
* byte array.
*/
public byte[] getBytes() {
byte[] result;
synchronized (tempQueue) {
result = tempQueue.poll();
}
if (result == null) {
result = new byte[TEMP_BYTES_SIZE];
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Created temp bytes");
}
}
return result;
}
/**
* Adds the given byte array to the pool if it is the correct size and the pool is not full and returns true if
* the byte array was added and false otherwise.
*
* @param bytes The bytes to try to add to the pool.
*/
public boolean releaseBytes(byte[] bytes) {
if (bytes.length != TEMP_BYTES_SIZE) {
return false;
}
boolean accepted = false;
synchronized (tempQueue) {
if (tempQueue.size() < MAX_BYTE_ARRAY_COUNT) {
accepted = true;
tempQueue.offer(bytes);
}
}
return accepted;
}
}