/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.gallery3d.data; import com.android.gallery3d.util.ThreadPool.JobContext; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; public class BytesBufferPool { private static final int READ_STEP = 4096; public static class BytesBuffer { public byte[] data; public int offset; public int length; private BytesBuffer(int capacity) { this.data = new byte[capacity]; } // an helper function to read content from FileDescriptor public void readFrom(JobContext jc, FileDescriptor fd) throws IOException { FileInputStream fis = new FileInputStream(fd); length = 0; try { int capacity = data.length; while (true) { int step = Math.min(READ_STEP, capacity - length); int rc = fis.read(data, length, step); if (rc < 0 || jc.isCancelled()) return; length += rc; if (length == capacity) { byte[] newData = new byte[data.length * 2]; System.arraycopy(data, 0, newData, 0, data.length); data = newData; capacity = data.length; } } } finally { fis.close(); } } } private final int mPoolSize; private final int mBufferSize; private final ArrayList mList; public BytesBufferPool(int poolSize, int bufferSize) { mList = new ArrayList(poolSize); mPoolSize = poolSize; mBufferSize = bufferSize; } public synchronized BytesBuffer get() { int n = mList.size(); return n > 0 ? mList.remove(n - 1) : new BytesBuffer(mBufferSize); } public synchronized void recycle(BytesBuffer buffer) { if (buffer.data.length != mBufferSize) return; if (mList.size() < mPoolSize) { buffer.offset = 0; buffer.length = 0; mList.add(buffer); } } public synchronized void clear() { mList.clear(); } }