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 && (getTestOnBorrow() || create && getTestOnCreate())) {<a name="line.468"></a>
+<span class="sourceLineNo">468</span> if (p != null && 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<T> 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 && 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<?>) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span> ((DefaultPooledObject<T>) 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<>(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<T> 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<>(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() && 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<T> 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> * <p><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> * </p><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 < 1 || isClosed() || (!always && !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() < idleCount) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span> final PooledObject<T> 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> * <p><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). </p><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<T> 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<T> 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 >= 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<PooledObject<T>> remove = new ArrayList<>();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span> final Iterator<PooledObject<T>> 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<T> 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 &&<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span> pooledObject.getLastUsedTime() <= 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<PooledObject<T>> 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<T> 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() && !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 && 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<>(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<T> 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<>(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() && 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<T> 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> * <p><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> * </p><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 < 1 || isClosed() || (!always && !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() < idleCount) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span> final PooledObject<T> 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> * <p><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). </p><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<T> 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<T> 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 >= 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<PooledObject<T>> remove = new ArrayList<>();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span> final Iterator<PooledObject<T>> 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<T> 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 &&<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span> pooledObject.getLastUsedTime() <= 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<PooledObject<T>> 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<T> 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 && ac.getUseUsageTracking()) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span> final PooledObject<T> wrapper = allObjects.get(new IdentityWrapper<>(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 && ac.getUseUsageTracking()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span> final PooledObject<T> wrapper = allObjects.get(new IdentityWrapper<>(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('<');<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span> final Class<?> 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('>');<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> * <p><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> * </p><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<DefaultPooledObjectInfo> listAllObjects() {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span> final Set<DefaultPooledObjectInfo> result =<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span> new HashSet<>(allObjects.size());<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span> for (final PooledObject<T> 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<T> 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('<');<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span> final Class<?> 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('>');<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> * <p><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> * </p><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<DefaultPooledObjectInfo> listAllObjects() {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span> final Set<DefaultPooledObjectInfo> result =<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span> new HashSet<>(allObjects.size());<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span> for (final PooledObject<T> 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<T> 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<IdentityWrapper<T>, PooledObject<T>> allObjects =<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span> new ConcurrentHashMap<>();<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<PooledObject<T>> 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<IdentityWrapper<T>, PooledObject<T>> allObjects =<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span> new ConcurrentHashMap<>();<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<PooledObject<T>> 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>