/* * Copyright (C) 2009 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 android.util; /** * @hide */ class FinitePool> implements Pool { private static final String LOG_TAG = "FinitePool"; /** * Factory used to create new pool objects */ private final PoolableManager mManager; /** * Maximum number of objects in the pool */ private final int mLimit; /** * If true, mLimit is ignored */ private final boolean mInfinite; /** * Next object to acquire */ private T mRoot; /** * Number of objects in the pool */ private int mPoolCount; FinitePool(PoolableManager manager) { mManager = manager; mLimit = 0; mInfinite = true; } FinitePool(PoolableManager manager, int limit) { if (limit <= 0) throw new IllegalArgumentException("The pool limit must be > 0"); mManager = manager; mLimit = limit; mInfinite = false; } public T acquire() { T element; if (mRoot != null) { element = mRoot; mRoot = element.getNextPoolable(); mPoolCount--; } else { element = mManager.newInstance(); } if (element != null) { element.setNextPoolable(null); element.setPooled(false); mManager.onAcquired(element); } return element; } public void release(T element) { if (!element.isPooled()) { if (mInfinite || mPoolCount < mLimit) { mPoolCount++; element.setNextPoolable(mRoot); element.setPooled(true); mRoot = element; } mManager.onReleased(element); } else { Log.w(LOG_TAG, "Element is already in pool: " + element); } } }