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