1cfd74d65d832137e20e193c960802afba73b5d38sm/* 23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project 3cfd74d65d832137e20e193c960802afba73b5d38sm * 4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License"); 5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License. 6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at 7cfd74d65d832137e20e193c960802afba73b5d38sm * 8cfd74d65d832137e20e193c960802afba73b5d38sm * http://www.apache.org/licenses/LICENSE-2.0 9cfd74d65d832137e20e193c960802afba73b5d38sm * 10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software 11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS, 12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and 14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License. 15cfd74d65d832137e20e193c960802afba73b5d38sm */ 16cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland; 17cfd74d65d832137e20e193c960802afba73b5d38sm 18cfd74d65d832137e20e193c960802afba73b5d38sm/** 19cfd74d65d832137e20e193c960802afba73b5d38sm * A general-purpose pool of objects. Objects in the pool are allocated up front and then 20cfd74d65d832137e20e193c960802afba73b5d38sm * passed out to requesting objects until the pool is exhausted (at which point an error is thrown). 21cfd74d65d832137e20e193c960802afba73b5d38sm * Code that requests objects from the pool should return them to the pool when they are finished. 22cfd74d65d832137e20e193c960802afba73b5d38sm * This class is abstract; derivations need to implement the fill() function to fill the pool, and 23cfd74d65d832137e20e193c960802afba73b5d38sm * may wish to override release() to clear state on objects as they are returned to the pool. 24cfd74d65d832137e20e193c960802afba73b5d38sm */ 25cfd74d65d832137e20e193c960802afba73b5d38smpublic abstract class ObjectPool extends BaseObject { 26cfd74d65d832137e20e193c960802afba73b5d38sm private FixedSizeArray<Object> mAvailable; 27cfd74d65d832137e20e193c960802afba73b5d38sm private int mSize; 28cfd74d65d832137e20e193c960802afba73b5d38sm 29cfd74d65d832137e20e193c960802afba73b5d38sm private static final int DEFAULT_SIZE = 32; 30cfd74d65d832137e20e193c960802afba73b5d38sm 31cfd74d65d832137e20e193c960802afba73b5d38sm public ObjectPool() { 32cfd74d65d832137e20e193c960802afba73b5d38sm super(); 33cfd74d65d832137e20e193c960802afba73b5d38sm setSize(DEFAULT_SIZE); 34cfd74d65d832137e20e193c960802afba73b5d38sm } 35cfd74d65d832137e20e193c960802afba73b5d38sm 36cfd74d65d832137e20e193c960802afba73b5d38sm public ObjectPool(int size) { 37cfd74d65d832137e20e193c960802afba73b5d38sm super(); 38cfd74d65d832137e20e193c960802afba73b5d38sm setSize(size); 39cfd74d65d832137e20e193c960802afba73b5d38sm } 40cfd74d65d832137e20e193c960802afba73b5d38sm 41cfd74d65d832137e20e193c960802afba73b5d38sm @Override 42cfd74d65d832137e20e193c960802afba73b5d38sm public void reset() { 43cfd74d65d832137e20e193c960802afba73b5d38sm } 44cfd74d65d832137e20e193c960802afba73b5d38sm 45cfd74d65d832137e20e193c960802afba73b5d38sm /** Allocates an object from the pool */ 46cfd74d65d832137e20e193c960802afba73b5d38sm protected Object allocate() { 47cfd74d65d832137e20e193c960802afba73b5d38sm Object result = mAvailable.removeLast(); 48cfd74d65d832137e20e193c960802afba73b5d38sm assert result != null : "Object pool of type " + this.getClass().getSimpleName() 49cfd74d65d832137e20e193c960802afba73b5d38sm + " exhausted!!"; 50cfd74d65d832137e20e193c960802afba73b5d38sm return result; 51cfd74d65d832137e20e193c960802afba73b5d38sm } 52cfd74d65d832137e20e193c960802afba73b5d38sm 53cfd74d65d832137e20e193c960802afba73b5d38sm /** Returns an object to the pool. */ 54cfd74d65d832137e20e193c960802afba73b5d38sm public void release(Object entry) { 55cfd74d65d832137e20e193c960802afba73b5d38sm mAvailable.add(entry); 56cfd74d65d832137e20e193c960802afba73b5d38sm } 57cfd74d65d832137e20e193c960802afba73b5d38sm 58cfd74d65d832137e20e193c960802afba73b5d38sm /** Returns the number of pooled elements that have been allocated but not released. */ 59cfd74d65d832137e20e193c960802afba73b5d38sm public int getAllocatedCount() { 60cfd74d65d832137e20e193c960802afba73b5d38sm return mAvailable.getCapacity() - mAvailable.getCount(); 61cfd74d65d832137e20e193c960802afba73b5d38sm } 62cfd74d65d832137e20e193c960802afba73b5d38sm 63cfd74d65d832137e20e193c960802afba73b5d38sm private void setSize(int size) { 64cfd74d65d832137e20e193c960802afba73b5d38sm mSize = size; 65cfd74d65d832137e20e193c960802afba73b5d38sm mAvailable = new FixedSizeArray<Object>(mSize); 66cfd74d65d832137e20e193c960802afba73b5d38sm 67cfd74d65d832137e20e193c960802afba73b5d38sm fill(); 68cfd74d65d832137e20e193c960802afba73b5d38sm } 69cfd74d65d832137e20e193c960802afba73b5d38sm 70cfd74d65d832137e20e193c960802afba73b5d38sm protected abstract void fill(); 71cfd74d65d832137e20e193c960802afba73b5d38sm 72cfd74d65d832137e20e193c960802afba73b5d38sm protected FixedSizeArray<Object> getAvailable() { 73cfd74d65d832137e20e193c960802afba73b5d38sm return mAvailable; 74cfd74d65d832137e20e193c960802afba73b5d38sm } 75cfd74d65d832137e20e193c960802afba73b5d38sm 76cfd74d65d832137e20e193c960802afba73b5d38sm protected int getSize() { 77cfd74d65d832137e20e193c960802afba73b5d38sm return mSize; 78cfd74d65d832137e20e193c960802afba73b5d38sm } 79cfd74d65d832137e20e193c960802afba73b5d38sm 80cfd74d65d832137e20e193c960802afba73b5d38sm 81cfd74d65d832137e20e193c960802afba73b5d38sm} 82