001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.tomcat.util.collections;
019:
020: /**
021: * Simple object pool. Based on ThreadPool and few other classes
022: *
023: * The pool will ignore overflow and return null if empty.
024: *
025: * @author Gal Shachor
026: * @author Costin Manolache
027: */
028: public final class SimplePool {
029:
030: private static org.apache.juli.logging.Log log = org.apache.juli.logging.LogFactory
031: .getLog(SimplePool.class);
032:
033: /*
034: * Where the threads are held.
035: */
036: private Object pool[];
037:
038: private int max;
039: private int last;
040: private int current = -1;
041:
042: private Object lock;
043: public static final int DEFAULT_SIZE = 32;
044: static final int debug = 0;
045:
046: public SimplePool() {
047: this (DEFAULT_SIZE, DEFAULT_SIZE);
048: }
049:
050: public SimplePool(int size) {
051: this (size, size);
052: }
053:
054: public SimplePool(int size, int max) {
055: this .max = max;
056: pool = new Object[size];
057: this .last = size - 1;
058: lock = new Object();
059: }
060:
061: public void set(Object o) {
062: put(o);
063: }
064:
065: /**
066: * Add the object to the pool, silent nothing if the pool is full
067: */
068: public void put(Object o) {
069: synchronized (lock) {
070: if (current < last) {
071: current++;
072: pool[current] = o;
073: } else if (current < max) {
074: // realocate
075: int newSize = pool.length * 2;
076: if (newSize > max)
077: newSize = max + 1;
078: Object tmp[] = new Object[newSize];
079: last = newSize - 1;
080: System.arraycopy(pool, 0, tmp, 0, pool.length);
081: pool = tmp;
082: current++;
083: pool[current] = o;
084: }
085: if (debug > 0)
086: log("put " + o + " " + current + " " + max);
087: }
088: }
089:
090: /**
091: * Get an object from the pool, null if the pool is empty.
092: */
093: public Object get() {
094: Object item = null;
095: synchronized (lock) {
096: if (current >= 0) {
097: item = pool[current];
098: pool[current] = null;
099: current -= 1;
100: }
101: if (debug > 0)
102: log("get " + item + " " + current + " " + max);
103: }
104: return item;
105: }
106:
107: /**
108: * Return the size of the pool
109: */
110: public int getMax() {
111: return max;
112: }
113:
114: /**
115: * Number of object in the pool
116: */
117: public int getCount() {
118: return current + 1;
119: }
120:
121: public void shutdown() {
122: }
123:
124: private void log(String s) {
125: if (log.isDebugEnabled())
126: log.debug("SimplePool: " + s);
127: }
128: }
|