You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@commons.apache.org by gg...@apache.org on 2019/08/10 22:26:46 UTC

svn commit: r1048500 [7/39] - in /websites/production/commons/content/proper: commons-pool/ commons-pool/apidocs/ commons-pool/apidocs/org/apache/commons/pool2/ commons-pool/apidocs/org/apache/commons/pool2/class-use/ commons-pool/apidocs/org/apache/co...

Modified: websites/production/commons/content/proper/commons-pool/apidocs/src-html/org/apache/commons/pool2/impl/GenericObjectPool.html
==============================================================================
--- websites/production/commons/content/proper/commons-pool/apidocs/src-html/org/apache/commons/pool2/impl/GenericObjectPool.html (original)
+++ websites/production/commons/content/proper/commons-pool/apidocs/src-html/org/apache/commons/pool2/impl/GenericObjectPool.html Sat Aug 10 22:26:44 2019
@@ -473,7 +473,7 @@
 <span class="sourceLineNo">465</span>                        throw nsee;<a name="line.465"></a>
 <span class="sourceLineNo">466</span>                    }<a name="line.466"></a>
 <span class="sourceLineNo">467</span>                }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>                if (p != null &amp;&amp; (getTestOnBorrow() || create &amp;&amp; getTestOnCreate())) {<a name="line.468"></a>
+<span class="sourceLineNo">468</span>                if (p != null &amp;&amp; getTestOnBorrow()) {<a name="line.468"></a>
 <span class="sourceLineNo">469</span>                    boolean validate = false;<a name="line.469"></a>
 <span class="sourceLineNo">470</span>                    Throwable validationThrowable = null;<a name="line.470"></a>
 <span class="sourceLineNo">471</span>                    try {<a name="line.471"></a>
@@ -693,7 +693,7 @@
 <span class="sourceLineNo">685</span><a name="line.685"></a>
 <span class="sourceLineNo">686</span>            // Stop the evictor before the pool is closed since evict() calls<a name="line.686"></a>
 <span class="sourceLineNo">687</span>            // assertOpen()<a name="line.687"></a>
-<span class="sourceLineNo">688</span>            stopEvitor();<a name="line.688"></a>
+<span class="sourceLineNo">688</span>            stopEvictor();<a name="line.688"></a>
 <span class="sourceLineNo">689</span><a name="line.689"></a>
 <span class="sourceLineNo">690</span>            closed = true;<a name="line.690"></a>
 <span class="sourceLineNo">691</span>            // This clear removes any idle objects<a name="line.691"></a>
@@ -895,331 +895,332 @@
 <span class="sourceLineNo">887</span>        final PooledObject&lt;T&gt; p;<a name="line.887"></a>
 <span class="sourceLineNo">888</span>        try {<a name="line.888"></a>
 <span class="sourceLineNo">889</span>            p = factory.makeObject();<a name="line.889"></a>
-<span class="sourceLineNo">890</span>        } catch (final Throwable e) {<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            createCount.decrementAndGet();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>            throw e;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>        } finally {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>            synchronized (makeObjectCountLock) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>                makeObjectCount--;<a name="line.895"></a>
-<span class="sourceLineNo">896</span>                makeObjectCountLock.notifyAll();<a name="line.896"></a>
-<span class="sourceLineNo">897</span>            }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>        }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>        final AbandonedConfig ac = this.abandonedConfig;<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        if (ac != null &amp;&amp; ac.getLogAbandoned()) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>            p.setLogAbandoned(true);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>            // TODO: in 3.0, this can use the method defined on PooledObject<a name="line.903"></a>
-<span class="sourceLineNo">904</span>            if (p instanceof DefaultPooledObject&lt;?&gt;) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>                ((DefaultPooledObject&lt;T&gt;) p).setRequireFullStackTrace(ac.getRequireFullStackTrace());<a name="line.905"></a>
-<span class="sourceLineNo">906</span>            }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>        }<a name="line.907"></a>
-<span class="sourceLineNo">908</span><a name="line.908"></a>
-<span class="sourceLineNo">909</span>        createdCount.incrementAndGet();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        allObjects.put(new IdentityWrapper&lt;&gt;(p.getObject()), p);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        return p;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    /**<a name="line.914"></a>
-<span class="sourceLineNo">915</span>     * Destroys a wrapped pooled object.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>     *<a name="line.916"></a>
-<span class="sourceLineNo">917</span>     * @param toDestroy The wrapped pooled object to destroy<a name="line.917"></a>
-<span class="sourceLineNo">918</span>     *<a name="line.918"></a>
-<span class="sourceLineNo">919</span>     * @throws Exception If the factory fails to destroy the pooled object<a name="line.919"></a>
-<span class="sourceLineNo">920</span>     *                   cleanly<a name="line.920"></a>
-<span class="sourceLineNo">921</span>     */<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    private void destroy(final PooledObject&lt;T&gt; toDestroy) throws Exception {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>        toDestroy.invalidate();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>        idleObjects.remove(toDestroy);<a name="line.924"></a>
-<span class="sourceLineNo">925</span>        allObjects.remove(new IdentityWrapper&lt;&gt;(toDestroy.getObject()));<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        try {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>            factory.destroyObject(toDestroy);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        } finally {<a name="line.928"></a>
-<span class="sourceLineNo">929</span>            destroyedCount.incrementAndGet();<a name="line.929"></a>
-<span class="sourceLineNo">930</span>            createCount.decrementAndGet();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>        }<a name="line.931"></a>
-<span class="sourceLineNo">932</span><a name="line.932"></a>
-<span class="sourceLineNo">933</span>        if (idleObjects.isEmpty() &amp;&amp; idleObjects.hasTakeWaiters()) {<a name="line.933"></a>
-<span class="sourceLineNo">934</span>            // POOL-356.<a name="line.934"></a>
-<span class="sourceLineNo">935</span>            // In case there are already threads waiting on something in the pool<a name="line.935"></a>
-<span class="sourceLineNo">936</span>            // (e.g. idleObjects.takeFirst(); then we need to provide them a fresh instance.<a name="line.936"></a>
-<span class="sourceLineNo">937</span>            // Otherwise they will be stuck forever (or until timeout)<a name="line.937"></a>
-<span class="sourceLineNo">938</span>            final PooledObject&lt;T&gt; freshPooled = create();<a name="line.938"></a>
-<span class="sourceLineNo">939</span>            idleObjects.put(freshPooled);<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        }<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    void ensureMinIdle() throws Exception {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        ensureIdle(getMinIdle(), true);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
-<span class="sourceLineNo">947</span><a name="line.947"></a>
-<span class="sourceLineNo">948</span>    /**<a name="line.948"></a>
-<span class="sourceLineNo">949</span>     * Tries to ensure that {@code idleCount} idle instances exist in the pool.<a name="line.949"></a>
-<span class="sourceLineNo">950</span>     * &lt;p&gt;<a name="line.950"></a>
-<span class="sourceLineNo">951</span>     * Creates and adds idle instances until either {@link #getNumIdle()} reaches {@code idleCount}<a name="line.951"></a>
-<span class="sourceLineNo">952</span>     * or the total number of objects (idle, checked out, or being created) reaches<a name="line.952"></a>
-<span class="sourceLineNo">953</span>     * {@link #getMaxTotal()}. If {@code always} is false, no instances are created unless<a name="line.953"></a>
-<span class="sourceLineNo">954</span>     * there are threads waiting to check out instances from the pool.<a name="line.954"></a>
-<span class="sourceLineNo">955</span>     * &lt;/p&gt;<a name="line.955"></a>
-<span class="sourceLineNo">956</span>     *<a name="line.956"></a>
-<span class="sourceLineNo">957</span>     * @param idleCount the number of idle instances desired<a name="line.957"></a>
-<span class="sourceLineNo">958</span>     * @param always true means create instances even if the pool has no threads waiting<a name="line.958"></a>
-<span class="sourceLineNo">959</span>     * @throws Exception if the factory's makeObject throws<a name="line.959"></a>
-<span class="sourceLineNo">960</span>     */<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    private void ensureIdle(final int idleCount, final boolean always) throws Exception {<a name="line.961"></a>
-<span class="sourceLineNo">962</span>        if (idleCount &lt; 1 || isClosed() || (!always &amp;&amp; !idleObjects.hasTakeWaiters())) {<a name="line.962"></a>
-<span class="sourceLineNo">963</span>            return;<a name="line.963"></a>
-<span class="sourceLineNo">964</span>        }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>        while (idleObjects.size() &lt; idleCount) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>            final PooledObject&lt;T&gt; p = create();<a name="line.967"></a>
-<span class="sourceLineNo">968</span>            if (p == null) {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>                // Can't create objects, no reason to think another call to<a name="line.969"></a>
-<span class="sourceLineNo">970</span>                // create will work. Give up.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>                break;<a name="line.971"></a>
-<span class="sourceLineNo">972</span>            }<a name="line.972"></a>
-<span class="sourceLineNo">973</span>            if (getLifo()) {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>                idleObjects.addFirst(p);<a name="line.974"></a>
-<span class="sourceLineNo">975</span>            } else {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>                idleObjects.addLast(p);<a name="line.976"></a>
-<span class="sourceLineNo">977</span>            }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>        }<a name="line.978"></a>
-<span class="sourceLineNo">979</span>        if (isClosed()) {<a name="line.979"></a>
-<span class="sourceLineNo">980</span>            // Pool closed while object was being added to idle objects.<a name="line.980"></a>
-<span class="sourceLineNo">981</span>            // Make sure the returned object is destroyed rather than left<a name="line.981"></a>
-<span class="sourceLineNo">982</span>            // in the idle object pool (which would effectively be a leak)<a name="line.982"></a>
-<span class="sourceLineNo">983</span>            clear();<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        }<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>    /**<a name="line.987"></a>
-<span class="sourceLineNo">988</span>     * Creates an object, and place it into the pool. addObject() is useful for<a name="line.988"></a>
-<span class="sourceLineNo">989</span>     * "pre-loading" a pool with idle objects.<a name="line.989"></a>
-<span class="sourceLineNo">990</span>     * &lt;p&gt;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>     * If there is no capacity available to add to the pool, this is a no-op<a name="line.991"></a>
-<span class="sourceLineNo">992</span>     * (no exception, no impact to the pool). &lt;/p&gt;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>     */<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    @Override<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    public void addObject() throws Exception {<a name="line.995"></a>
-<span class="sourceLineNo">996</span>        assertOpen();<a name="line.996"></a>
-<span class="sourceLineNo">997</span>        if (factory == null) {<a name="line.997"></a>
-<span class="sourceLineNo">998</span>            throw new IllegalStateException(<a name="line.998"></a>
-<span class="sourceLineNo">999</span>                    "Cannot add objects without a factory.");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>        }<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>        final PooledObject&lt;T&gt; p = create();<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>        addIdleObject(p);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    }<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    /**<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>     * Adds the provided wrapped pooled object to the set of idle objects for<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>     * this pool. The object must already be part of the pool.  If {@code p}<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>     * is null, this is a no-op (no exception, but no impact on the pool).<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>     *<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>     * @param p The object to make idle<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>     *<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>     * @throws Exception If the factory fails to passivate the object<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>     */<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    private void addIdleObject(final PooledObject&lt;T&gt; p) throws Exception {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>        if (p != null) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>            factory.passivateObject(p);<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            if (getLifo()) {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>                idleObjects.addFirst(p);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>            } else {<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>                idleObjects.addLast(p);<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>            }<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>        }<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span><a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    /**<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>     * Calculates the number of objects to test in a run of the idle object<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>     * evictor.<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>     *<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>     * @return The number of objects to test for validity<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>     */<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    private int getNumTests() {<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        final int numTestsPerEvictionRun = getNumTestsPerEvictionRun();<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        if (numTestsPerEvictionRun &gt;= 0) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>            return Math.min(numTestsPerEvictionRun, idleObjects.size());<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        }<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        return (int) (Math.ceil(idleObjects.size() /<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>                Math.abs((double) numTestsPerEvictionRun)));<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    }<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span><a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    /**<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>     * Recovers abandoned objects which have been checked out but<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>     * not used since longer than the removeAbandonedTimeout.<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>     *<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>     * @param ac The configuration to use to identify abandoned objects<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>     */<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    private void removeAbandoned(final AbandonedConfig ac) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        // Generate a list of abandoned objects to remove<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>        final long now = System.currentTimeMillis();<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>        final long timeout =<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>                now - (ac.getRemoveAbandonedTimeout() * 1000L);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>        final ArrayList&lt;PooledObject&lt;T&gt;&gt; remove = new ArrayList&lt;&gt;();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>        final Iterator&lt;PooledObject&lt;T&gt;&gt; it = allObjects.values().iterator();<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>        while (it.hasNext()) {<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            final PooledObject&lt;T&gt; pooledObject = it.next();<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            synchronized (pooledObject) {<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>                if (pooledObject.getState() == PooledObjectState.ALLOCATED &amp;&amp;<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>                        pooledObject.getLastUsedTime() &lt;= timeout) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>                    pooledObject.markAbandoned();<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>                    remove.add(pooledObject);<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>                }<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>            }<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        // Now remove the abandoned objects<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        final Iterator&lt;PooledObject&lt;T&gt;&gt; itr = remove.iterator();<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        while (itr.hasNext()) {<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>            final PooledObject&lt;T&gt; pooledObject = itr.next();<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>            if (ac.getLogAbandoned()) {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>                pooledObject.printStackTrace(ac.getLogWriter());<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>            }<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>            try {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>                invalidateObject(pooledObject.getObject());<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>            } catch (final Exception e) {<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>                e.printStackTrace();<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>            }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        }<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    }<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">890</span>            if (getTestOnCreate() &amp;&amp; !factory.validateObject(p)) {<a name="line.890"></a>
+<span class="sourceLineNo">891</span>                createCount.decrementAndGet();<a name="line.891"></a>
+<span class="sourceLineNo">892</span>                return null;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>            }<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        } catch (final Throwable e) {<a name="line.894"></a>
+<span class="sourceLineNo">895</span>            createCount.decrementAndGet();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>            throw e;<a name="line.896"></a>
+<span class="sourceLineNo">897</span>        } finally {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>            synchronized (makeObjectCountLock) {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>                makeObjectCount--;<a name="line.899"></a>
+<span class="sourceLineNo">900</span>                makeObjectCountLock.notifyAll();<a name="line.900"></a>
+<span class="sourceLineNo">901</span>            }<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
+<span class="sourceLineNo">903</span><a name="line.903"></a>
+<span class="sourceLineNo">904</span>        final AbandonedConfig ac = this.abandonedConfig;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        if (ac != null &amp;&amp; ac.getLogAbandoned()) {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>            p.setLogAbandoned(true);<a name="line.906"></a>
+<span class="sourceLineNo">907</span>            p.setRequireFullStackTrace(ac.getRequireFullStackTrace());<a name="line.907"></a>
+<span class="sourceLineNo">908</span>        }<a name="line.908"></a>
+<span class="sourceLineNo">909</span><a name="line.909"></a>
+<span class="sourceLineNo">910</span>        createdCount.incrementAndGet();<a name="line.910"></a>
+<span class="sourceLineNo">911</span>        allObjects.put(new IdentityWrapper&lt;&gt;(p.getObject()), p);<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        return p;<a name="line.912"></a>
+<span class="sourceLineNo">913</span>    }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>    /**<a name="line.915"></a>
+<span class="sourceLineNo">916</span>     * Destroys a wrapped pooled object.<a name="line.916"></a>
+<span class="sourceLineNo">917</span>     *<a name="line.917"></a>
+<span class="sourceLineNo">918</span>     * @param toDestroy The wrapped pooled object to destroy<a name="line.918"></a>
+<span class="sourceLineNo">919</span>     *<a name="line.919"></a>
+<span class="sourceLineNo">920</span>     * @throws Exception If the factory fails to destroy the pooled object<a name="line.920"></a>
+<span class="sourceLineNo">921</span>     *                   cleanly<a name="line.921"></a>
+<span class="sourceLineNo">922</span>     */<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    private void destroy(final PooledObject&lt;T&gt; toDestroy) throws Exception {<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        toDestroy.invalidate();<a name="line.924"></a>
+<span class="sourceLineNo">925</span>        idleObjects.remove(toDestroy);<a name="line.925"></a>
+<span class="sourceLineNo">926</span>        allObjects.remove(new IdentityWrapper&lt;&gt;(toDestroy.getObject()));<a name="line.926"></a>
+<span class="sourceLineNo">927</span>        try {<a name="line.927"></a>
+<span class="sourceLineNo">928</span>            factory.destroyObject(toDestroy);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>        } finally {<a name="line.929"></a>
+<span class="sourceLineNo">930</span>            destroyedCount.incrementAndGet();<a name="line.930"></a>
+<span class="sourceLineNo">931</span>            createCount.decrementAndGet();<a name="line.931"></a>
+<span class="sourceLineNo">932</span>        }<a name="line.932"></a>
+<span class="sourceLineNo">933</span><a name="line.933"></a>
+<span class="sourceLineNo">934</span>        if (idleObjects.isEmpty() &amp;&amp; idleObjects.hasTakeWaiters()) {<a name="line.934"></a>
+<span class="sourceLineNo">935</span>            // POOL-356.<a name="line.935"></a>
+<span class="sourceLineNo">936</span>            // In case there are already threads waiting on something in the pool<a name="line.936"></a>
+<span class="sourceLineNo">937</span>            // (e.g. idleObjects.takeFirst(); then we need to provide them a fresh instance.<a name="line.937"></a>
+<span class="sourceLineNo">938</span>            // Otherwise they will be stuck forever (or until timeout)<a name="line.938"></a>
+<span class="sourceLineNo">939</span>            final PooledObject&lt;T&gt; freshPooled = create();<a name="line.939"></a>
+<span class="sourceLineNo">940</span>            idleObjects.put(freshPooled);<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        }<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    }<a name="line.942"></a>
+<span class="sourceLineNo">943</span><a name="line.943"></a>
+<span class="sourceLineNo">944</span>    @Override<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    void ensureMinIdle() throws Exception {<a name="line.945"></a>
+<span class="sourceLineNo">946</span>        ensureIdle(getMinIdle(), true);<a name="line.946"></a>
+<span class="sourceLineNo">947</span>    }<a name="line.947"></a>
+<span class="sourceLineNo">948</span><a name="line.948"></a>
+<span class="sourceLineNo">949</span>    /**<a name="line.949"></a>
+<span class="sourceLineNo">950</span>     * Tries to ensure that {@code idleCount} idle instances exist in the pool.<a name="line.950"></a>
+<span class="sourceLineNo">951</span>     * &lt;p&gt;<a name="line.951"></a>
+<span class="sourceLineNo">952</span>     * Creates and adds idle instances until either {@link #getNumIdle()} reaches {@code idleCount}<a name="line.952"></a>
+<span class="sourceLineNo">953</span>     * or the total number of objects (idle, checked out, or being created) reaches<a name="line.953"></a>
+<span class="sourceLineNo">954</span>     * {@link #getMaxTotal()}. If {@code always} is false, no instances are created unless<a name="line.954"></a>
+<span class="sourceLineNo">955</span>     * there are threads waiting to check out instances from the pool.<a name="line.955"></a>
+<span class="sourceLineNo">956</span>     * &lt;/p&gt;<a name="line.956"></a>
+<span class="sourceLineNo">957</span>     *<a name="line.957"></a>
+<span class="sourceLineNo">958</span>     * @param idleCount the number of idle instances desired<a name="line.958"></a>
+<span class="sourceLineNo">959</span>     * @param always true means create instances even if the pool has no threads waiting<a name="line.959"></a>
+<span class="sourceLineNo">960</span>     * @throws Exception if the factory's makeObject throws<a name="line.960"></a>
+<span class="sourceLineNo">961</span>     */<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    private void ensureIdle(final int idleCount, final boolean always) throws Exception {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>        if (idleCount &lt; 1 || isClosed() || (!always &amp;&amp; !idleObjects.hasTakeWaiters())) {<a name="line.963"></a>
+<span class="sourceLineNo">964</span>            return;<a name="line.964"></a>
+<span class="sourceLineNo">965</span>        }<a name="line.965"></a>
+<span class="sourceLineNo">966</span><a name="line.966"></a>
+<span class="sourceLineNo">967</span>        while (idleObjects.size() &lt; idleCount) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>            final PooledObject&lt;T&gt; p = create();<a name="line.968"></a>
+<span class="sourceLineNo">969</span>            if (p == null) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>                // Can't create objects, no reason to think another call to<a name="line.970"></a>
+<span class="sourceLineNo">971</span>                // create will work. Give up.<a name="line.971"></a>
+<span class="sourceLineNo">972</span>                break;<a name="line.972"></a>
+<span class="sourceLineNo">973</span>            }<a name="line.973"></a>
+<span class="sourceLineNo">974</span>            if (getLifo()) {<a name="line.974"></a>
+<span class="sourceLineNo">975</span>                idleObjects.addFirst(p);<a name="line.975"></a>
+<span class="sourceLineNo">976</span>            } else {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>                idleObjects.addLast(p);<a name="line.977"></a>
+<span class="sourceLineNo">978</span>            }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>        }<a name="line.979"></a>
+<span class="sourceLineNo">980</span>        if (isClosed()) {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>            // Pool closed while object was being added to idle objects.<a name="line.981"></a>
+<span class="sourceLineNo">982</span>            // Make sure the returned object is destroyed rather than left<a name="line.982"></a>
+<span class="sourceLineNo">983</span>            // in the idle object pool (which would effectively be a leak)<a name="line.983"></a>
+<span class="sourceLineNo">984</span>            clear();<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        }<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    }<a name="line.986"></a>
+<span class="sourceLineNo">987</span><a name="line.987"></a>
+<span class="sourceLineNo">988</span>    /**<a name="line.988"></a>
+<span class="sourceLineNo">989</span>     * Creates an object, and place it into the pool. addObject() is useful for<a name="line.989"></a>
+<span class="sourceLineNo">990</span>     * "pre-loading" a pool with idle objects.<a name="line.990"></a>
+<span class="sourceLineNo">991</span>     * &lt;p&gt;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>     * If there is no capacity available to add to the pool, this is a no-op<a name="line.992"></a>
+<span class="sourceLineNo">993</span>     * (no exception, no impact to the pool). &lt;/p&gt;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>     */<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    @Override<a name="line.995"></a>
+<span class="sourceLineNo">996</span>    public void addObject() throws Exception {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>        assertOpen();<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        if (factory == null) {<a name="line.998"></a>
+<span class="sourceLineNo">999</span>            throw new IllegalStateException(<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>                    "Cannot add objects without a factory.");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>        }<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>        final PooledObject&lt;T&gt; p = create();<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>        addIdleObject(p);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    }<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    /**<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>     * Adds the provided wrapped pooled object to the set of idle objects for<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>     * this pool. The object must already be part of the pool.  If {@code p}<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>     * is null, this is a no-op (no exception, but no impact on the pool).<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>     *<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>     * @param p The object to make idle<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>     *<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>     * @throws Exception If the factory fails to passivate the object<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>     */<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    private void addIdleObject(final PooledObject&lt;T&gt; p) throws Exception {<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>        if (p != null) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>            factory.passivateObject(p);<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>            if (getLifo()) {<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>                idleObjects.addFirst(p);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>            } else {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>                idleObjects.addLast(p);<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>            }<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>        }<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    }<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span><a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    /**<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>     * Calculates the number of objects to test in a run of the idle object<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>     * evictor.<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>     *<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>     * @return The number of objects to test for validity<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>     */<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    private int getNumTests() {<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        final int numTestsPerEvictionRun = getNumTestsPerEvictionRun();<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>        if (numTestsPerEvictionRun &gt;= 0) {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>            return Math.min(numTestsPerEvictionRun, idleObjects.size());<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        }<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        return (int) (Math.ceil(idleObjects.size() /<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>                Math.abs((double) numTestsPerEvictionRun)));<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span><a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    /**<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>     * Recovers abandoned objects which have been checked out but<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>     * not used since longer than the removeAbandonedTimeout.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>     *<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>     * @param ac The configuration to use to identify abandoned objects<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>     */<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    private void removeAbandoned(final AbandonedConfig ac) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>        // Generate a list of abandoned objects to remove<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>        final long now = System.currentTimeMillis();<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>        final long timeout =<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>                now - (ac.getRemoveAbandonedTimeout() * 1000L);<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>        final ArrayList&lt;PooledObject&lt;T&gt;&gt; remove = new ArrayList&lt;&gt;();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>        final Iterator&lt;PooledObject&lt;T&gt;&gt; it = allObjects.values().iterator();<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>        while (it.hasNext()) {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            final PooledObject&lt;T&gt; pooledObject = it.next();<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            synchronized (pooledObject) {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>                if (pooledObject.getState() == PooledObjectState.ALLOCATED &amp;&amp;<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>                        pooledObject.getLastUsedTime() &lt;= timeout) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>                    pooledObject.markAbandoned();<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>                    remove.add(pooledObject);<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>                }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>        }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>        // Now remove the abandoned objects<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>        final Iterator&lt;PooledObject&lt;T&gt;&gt; itr = remove.iterator();<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        while (itr.hasNext()) {<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>            final PooledObject&lt;T&gt; pooledObject = itr.next();<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>            if (ac.getLogAbandoned()) {<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>                pooledObject.printStackTrace(ac.getLogWriter());<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>            }<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>            try {<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>                invalidateObject(pooledObject.getObject());<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>            } catch (final Exception e) {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>                e.printStackTrace();<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>            }<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        }<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>    }<a name="line.1078"></a>
 <span class="sourceLineNo">1079</span><a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    //--- Usage tracking support -----------------------------------------------<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span><a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    @Override<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    public void use(final T pooledObject) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>        final AbandonedConfig ac = this.abandonedConfig;<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>        if (ac != null &amp;&amp; ac.getUseUsageTracking()) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>            final PooledObject&lt;T&gt; wrapper = allObjects.get(new IdentityWrapper&lt;&gt;(pooledObject));<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            wrapper.use();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>        }<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span><a name="line.1090"></a>
+<span class="sourceLineNo">1080</span><a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    //--- Usage tracking support -----------------------------------------------<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    @Override<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    public void use(final T pooledObject) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        final AbandonedConfig ac = this.abandonedConfig;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>        if (ac != null &amp;&amp; ac.getUseUsageTracking()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>            final PooledObject&lt;T&gt; wrapper = allObjects.get(new IdentityWrapper&lt;&gt;(pooledObject));<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            wrapper.use();<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        }<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
 <span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    //--- JMX support ----------------------------------------------------------<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span><a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>    private volatile String factoryType = null;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span><a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    /**<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>     * Returns an estimate of the number of threads currently blocked waiting for<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>     * an object from the pool. This is intended for monitoring only, not for<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>     * synchronization control.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>     *<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>     * @return The estimate of the number of threads currently blocked waiting<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>     *         for an object from the pool<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>     */<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    @Override<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    public int getNumWaiters() {<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>        if (getBlockWhenExhausted()) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>            return idleObjects.getTakeQueueLength();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        return 0;<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span><a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    /**<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>     * Returns the type - including the specific type rather than the generic -<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>     * of the factory.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>     *<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>     * @return A string representation of the factory type<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>     */<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    @Override<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    public String getFactoryType() {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        // Not thread safe. Accept that there may be multiple evaluations.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>        if (factoryType == null) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            final StringBuilder result = new StringBuilder();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            result.append(factory.getClass().getName());<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>            result.append('&lt;');<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>            final Class&lt;?&gt; pooledObjectType =<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>                    PoolImplUtils.getFactoryType(factory.getClass());<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>            result.append(pooledObjectType.getName());<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>            result.append('&gt;');<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>            factoryType = result.toString();<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>        return factoryType;<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    }<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span><a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    /**<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>     * Provides information on all the objects in the pool, both idle (waiting<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>     * to be borrowed) and active (currently borrowed).<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>     * &lt;p&gt;<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>     * Note: This is named listAllObjects so it is presented as an operation via<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>     * JMX. That means it won't be invoked unless the explicitly requested<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>     * whereas all attributes will be automatically requested when viewing the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>     * attributes for an object in a tool like JConsole.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>     * &lt;/p&gt;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>     *<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>     * @return Information grouped on all the objects in the pool<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>     */<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>    @Override<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>    public Set&lt;DefaultPooledObjectInfo&gt; listAllObjects() {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        final Set&lt;DefaultPooledObjectInfo&gt; result =<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>                new HashSet&lt;&gt;(allObjects.size());<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        for (final PooledObject&lt;T&gt; p : allObjects.values()) {<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>            result.add(new DefaultPooledObjectInfo(p));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>        }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>        return result;<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    }<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span><a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // --- configuration attributes --------------------------------------------<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    private volatile int maxIdle = GenericObjectPoolConfig.DEFAULT_MAX_IDLE;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    private volatile int minIdle = GenericObjectPoolConfig.DEFAULT_MIN_IDLE;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>    private final PooledObjectFactory&lt;T&gt; factory;<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span><a name="line.1161"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    //--- JMX support ----------------------------------------------------------<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span><a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>    private volatile String factoryType = null;<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span><a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    /**<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>     * Returns an estimate of the number of threads currently blocked waiting for<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>     * an object from the pool. This is intended for monitoring only, not for<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>     * synchronization control.<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>     *<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>     * @return The estimate of the number of threads currently blocked waiting<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>     *         for an object from the pool<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>     */<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    @Override<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    public int getNumWaiters() {<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>        if (getBlockWhenExhausted()) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>            return idleObjects.getTakeQueueLength();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>        return 0;<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    }<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span><a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    /**<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>     * Returns the type - including the specific type rather than the generic -<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>     * of the factory.<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>     *<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>     * @return A string representation of the factory type<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>     */<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    @Override<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    public String getFactoryType() {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        // Not thread safe. Accept that there may be multiple evaluations.<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>        if (factoryType == null) {<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>            final StringBuilder result = new StringBuilder();<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>            result.append(factory.getClass().getName());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>            result.append('&lt;');<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>            final Class&lt;?&gt; pooledObjectType =<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>                    PoolImplUtils.getFactoryType(factory.getClass());<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>            result.append(pooledObjectType.getName());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>            result.append('&gt;');<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>            factoryType = result.toString();<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        }<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        return factoryType;<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>    }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span><a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>    /**<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>     * Provides information on all the objects in the pool, both idle (waiting<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>     * to be borrowed) and active (currently borrowed).<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>     * &lt;p&gt;<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>     * Note: This is named listAllObjects so it is presented as an operation via<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>     * JMX. That means it won't be invoked unless the explicitly requested<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>     * whereas all attributes will be automatically requested when viewing the<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>     * attributes for an object in a tool like JConsole.<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>     * &lt;/p&gt;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>     *<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>     * @return Information grouped on all the objects in the pool<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>     */<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    @Override<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>    public Set&lt;DefaultPooledObjectInfo&gt; listAllObjects() {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>        final Set&lt;DefaultPooledObjectInfo&gt; result =<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>                new HashSet&lt;&gt;(allObjects.size());<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>        for (final PooledObject&lt;T&gt; p : allObjects.values()) {<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>            result.add(new DefaultPooledObjectInfo(p));<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>        }<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>        return result;<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span><a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // --- configuration attributes --------------------------------------------<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span><a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    private volatile int maxIdle = GenericObjectPoolConfig.DEFAULT_MAX_IDLE;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    private volatile int minIdle = GenericObjectPoolConfig.DEFAULT_MIN_IDLE;<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    private final PooledObjectFactory&lt;T&gt; factory;<a name="line.1161"></a>
 <span class="sourceLineNo">1162</span><a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>    // --- internal attributes -------------------------------------------------<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>    /*<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>     * All of the objects currently associated with this pool in any state. It<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>     * excludes objects that have been destroyed. The size of<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>     * {@link #allObjects} will always be less than or equal to {@link<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>     * #_maxActive}. Map keys are pooled objects, values are the PooledObject<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>     * wrappers used internally by the pool.<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>     */<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    private final Map&lt;IdentityWrapper&lt;T&gt;, PooledObject&lt;T&gt;&gt; allObjects =<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        new ConcurrentHashMap&lt;&gt;();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    /*<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>     * The combined count of the currently created objects and those in the<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>     * process of being created. Under load, it may exceed {@link #_maxActive}<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>     * if multiple threads try and create a new object at the same time but<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>     * {@link #create()} will ensure that there are never more than<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>     * {@link #_maxActive} objects created at any one time.<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>     */<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    private final AtomicLong createCount = new AtomicLong(0);<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    private long makeObjectCount = 0;<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>    private final Object makeObjectCountLock = new Object();<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    private final LinkedBlockingDeque&lt;PooledObject&lt;T&gt;&gt; idleObjects;<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    // JMX specific attributes<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>    private static final String ONAME_BASE =<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>        "org.apache.commons.pool2:type=GenericObjectPool,name=";<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span><a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>    // Additional configuration properties for abandoned object tracking<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    private volatile AbandonedConfig abandonedConfig = null;<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span><a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    @Override<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    protected void toStringAppendFields(final StringBuilder builder) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        super.toStringAppendFields(builder);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        builder.append(", factoryType=");<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        builder.append(factoryType);<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>        builder.append(", maxIdle=");<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        builder.append(maxIdle);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>        builder.append(", minIdle=");<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>        builder.append(minIdle);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>        builder.append(", factory=");<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>        builder.append(factory);<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        builder.append(", allObjects=");<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>        builder.append(allObjects);<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>        builder.append(", createCount=");<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>        builder.append(createCount);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>        builder.append(", idleObjects=");<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>        builder.append(idleObjects);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>        builder.append(", abandonedConfig=");<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        builder.append(abandonedConfig);<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>}<a name="line.1214"></a>
+<span class="sourceLineNo">1163</span><a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    // --- internal attributes -------------------------------------------------<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>    /*<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>     * All of the objects currently associated with this pool in any state. It<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>     * excludes objects that have been destroyed. The size of<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>     * {@link #allObjects} will always be less than or equal to {@link<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>     * #_maxActive}. Map keys are pooled objects, values are the PooledObject<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>     * wrappers used internally by the pool.<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>     */<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    private final Map&lt;IdentityWrapper&lt;T&gt;, PooledObject&lt;T&gt;&gt; allObjects =<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>        new ConcurrentHashMap&lt;&gt;();<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>    /*<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>     * The combined count of the currently created objects and those in the<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>     * process of being created. Under load, it may exceed {@link #_maxActive}<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>     * if multiple threads try and create a new object at the same time but<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>     * {@link #create()} will ensure that there are never more than<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>     * {@link #_maxActive} objects created at any one time.<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>     */<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    private final AtomicLong createCount = new AtomicLong(0);<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    private long makeObjectCount = 0;<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    private final Object makeObjectCountLock = new Object();<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    private final LinkedBlockingDeque&lt;PooledObject&lt;T&gt;&gt; idleObjects;<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span><a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    // JMX specific attributes<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    private static final String ONAME_BASE =<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        "org.apache.commons.pool2:type=GenericObjectPool,name=";<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span><a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>    // Additional configuration properties for abandoned object tracking<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>    private volatile AbandonedConfig abandonedConfig = null;<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span><a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    @Override<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>    protected void toStringAppendFields(final StringBuilder builder) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>        super.toStringAppendFields(builder);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>        builder.append(", factoryType=");<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        builder.append(factoryType);<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        builder.append(", maxIdle=");<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        builder.append(maxIdle);<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>        builder.append(", minIdle=");<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        builder.append(minIdle);<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        builder.append(", factory=");<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>        builder.append(factory);<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        builder.append(", allObjects=");<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        builder.append(allObjects);<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        builder.append(", createCount=");<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>        builder.append(createCount);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>        builder.append(", idleObjects=");<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        builder.append(idleObjects);<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        builder.append(", abandonedConfig=");<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>        builder.append(abandonedConfig);<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    }<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>}<a name="line.1215"></a>
 
 
 

Modified: websites/production/commons/content/proper/commons-pool/apidocs/src-html/org/apache/commons/pool2/impl/NoOpCallStack.html
==============================================================================
--- websites/production/commons/content/proper/commons-pool/apidocs/src-html/org/apache/commons/pool2/impl/NoOpCallStack.html (original)
+++ websites/production/commons/content/proper/commons-pool/apidocs/src-html/org/apache/commons/pool2/impl/NoOpCallStack.html Sat Aug 10 22:26:44 2019
@@ -39,24 +39,27 @@
 <span class="sourceLineNo">031</span>     */<a name="line.31"></a>
 <span class="sourceLineNo">032</span>    public static final CallStack INSTANCE = new NoOpCallStack();<a name="line.32"></a>
 <span class="sourceLineNo">033</span><a name="line.33"></a>
-<span class="sourceLineNo">034</span>    private NoOpCallStack() {<a name="line.34"></a>
-<span class="sourceLineNo">035</span>    }<a name="line.35"></a>
-<span class="sourceLineNo">036</span><a name="line.36"></a>
-<span class="sourceLineNo">037</span>    @Override<a name="line.37"></a>
-<span class="sourceLineNo">038</span>    public boolean printStackTrace(final PrintWriter writer) {<a name="line.38"></a>
-<span class="sourceLineNo">039</span>        return false;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>    }<a name="line.40"></a>
-<span class="sourceLineNo">041</span><a name="line.41"></a>
-<span class="sourceLineNo">042</span>    @Override<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    public void fillInStackTrace() {<a name="line.43"></a>
-<span class="sourceLineNo">044</span>        // no-op<a name="line.44"></a>
-<span class="sourceLineNo">045</span>    }<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>    @Override<a name="line.47"></a>
-<span class="sourceLineNo">048</span>    public void clear() {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>        // no-op<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    }<a name="line.50"></a>
-<span class="sourceLineNo">051</span>}<a name="line.51"></a>
+<span class="sourceLineNo">034</span>    /**<a name="line.34"></a>
+<span class="sourceLineNo">035</span>     * Constructs the singleton instance.<a name="line.35"></a>
+<span class="sourceLineNo">036</span>     */<a name="line.36"></a>
+<span class="sourceLineNo">037</span>    private NoOpCallStack() {<a name="line.37"></a>
+<span class="sourceLineNo">038</span>    }<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>    @Override<a name="line.40"></a>
+<span class="sourceLineNo">041</span>    public boolean printStackTrace(final PrintWriter writer) {<a name="line.41"></a>
+<span class="sourceLineNo">042</span>        return false;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>    }<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>    @Override<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    public void fillInStackTrace() {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>        // no-op<a name="line.47"></a>
+<span class="sourceLineNo">048</span>    }<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>    @Override<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    public void clear() {<a name="line.51"></a>
+<span class="sourceLineNo">052</span>        // no-op<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    }<a name="line.53"></a>
+<span class="sourceLineNo">054</span>}<a name="line.54"></a>