1d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy/* 2d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * Copyright (C) 2009 The Android Open Source Project 3d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * 4d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * you may not use this file except in compliance with the License. 6d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * You may obtain a copy of the License at 7d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * 8d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * 10d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * Unless required by applicable law or agreed to in writing, software 11d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * See the License for the specific language governing permissions and 14d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * limitations under the License. 15d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy */ 16d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 17d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guypackage android.util; 18d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 19d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy/** 20d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * @hide 21d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy */ 22d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guyclass FinitePool<T extends Poolable<T>> implements Pool<T> { 23d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy /** 24d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * Factory used to create new pool objects 25d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy */ 26d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy private final PoolableManager<T> mManager; 27d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy /** 28d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * Maximum number of objects in the pool 29d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy */ 30d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy private final int mLimit; 31d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy /** 32d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * If true, mLimit is ignored 33d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy */ 34d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy private final boolean mInfinite; 35d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 36d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy /** 37d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * Next object to acquire 38d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy */ 39d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy private T mRoot; 40d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy /** 41d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy * Number of objects in the pool 42d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy */ 43d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy private int mPoolCount; 44d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 45d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy FinitePool(PoolableManager<T> manager) { 46d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mManager = manager; 47d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mLimit = 0; 48d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mInfinite = true; 49d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy } 50d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 51d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy FinitePool(PoolableManager<T> manager, int limit) { 52d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy if (limit <= 0) throw new IllegalArgumentException("The pool limit must be > 0"); 53d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 54d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mManager = manager; 55d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mLimit = limit; 56d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mInfinite = false; 57d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy } 58d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 59d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy public T acquire() { 60d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy T element; 61d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 62d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy if (mRoot != null) { 63d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy element = mRoot; 64d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mRoot = element.getNextPoolable(); 65d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mPoolCount--; 66d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy } else { 67d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy element = mManager.newInstance(); 68d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy } 69d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 70d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy if (element != null) { 71d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy element.setNextPoolable(null); 72d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mManager.onAcquired(element); 73d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy } 74d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 75d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy return element; 76d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy } 77d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy 78d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy public void release(T element) { 79d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy if (mInfinite || mPoolCount < mLimit) { 80d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mPoolCount++; 81d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy element.setNextPoolable(mRoot); 82d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mRoot = element; 83d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy } 84d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy mManager.onReleased(element); 85d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy } 86d1b3dd058d2015cd1f2a3ef7fb3798f0d7923fe3Romain Guy} 87