Author: markt Date: Wed Jul 9 22:04:44 2014 New Revision: 1609326 URL: http://svn.apache.org/r1609326 Log: Merge changes from Pool 2 to r1609323.
Modified: tomcat/trunk/java/org/apache/tomcat/buildutil/SignCode.java tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/ (props changed) tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java (contents, props changed) tomcat/trunk/res/checkstyle/org-import-control.xml tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/tomcat/buildutil/SignCode.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/buildutil/SignCode.java?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/buildutil/SignCode.java (original) +++ tomcat/trunk/java/org/apache/tomcat/buildutil/SignCode.java Wed Jul 9 22:04:44 2014 @@ -16,14 +16,34 @@ */ package org.apache.tomcat.buildutil; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import javax.xml.soap.MessageFactory; +import javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPConnection; +import javax.xml.soap.SOAPConnectionFactory; +import javax.xml.soap.SOAPConstants; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPEnvelope; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPMessage; +import javax.xml.soap.SOAPPart; + +import org.apache.tomcat.util.codec.binary.Base64; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.FileSet; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; /** * Ant task that submits a file to the Symantec code-signing service. @@ -32,6 +52,9 @@ public class SignCode extends Task { private final List<FileSet> filesets = new ArrayList<>(); + private static String USERNAME = "AOOAPI"; + private static String PASSWORD = "Demo1234!"; + private static String PARTNERCODE = "4615797APA95264"; public void addFileset(FileSet fileset) { filesets.add(fileset); @@ -53,9 +76,151 @@ public class SignCode extends Task { for (int i = 0; i < files.length; i++) { File file = new File(basedir, files[i]); filesToSign.add(file); - log("TODO: Sign " + file.getAbsolutePath()); } } } + + try { + // Construct the signing request + log("Constructing the code signing request"); + + // Create the SOAP message + MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); + SOAPMessage message = factory.createMessage(); + + // Populate envelope + SOAPPart soapPart = message.getSOAPPart(); + SOAPEnvelope envelope = soapPart.getEnvelope(); + envelope.addNamespaceDeclaration("soapenv","http://schemas.xmlsoap.org/soap/envelope/"); + envelope.addNamespaceDeclaration("cod","http://api.ws.symantec.com/webtrust/codesigningservice"); + + SOAPBody body = envelope.getBody(); + + SOAPElement requestSigning = + body.addChildElement("requestSigning", "cod"); + + SOAPElement requestSigningRequest = + requestSigning.addChildElement("requestSigningRequest", "cod"); + + SOAPElement authToken = requestSigningRequest.addChildElement("authToken", "cod"); + SOAPElement userName = authToken.addChildElement("userName", "cod"); + userName.addTextNode(USERNAME); + SOAPElement password = authToken.addChildElement("password", "cod"); + password.addTextNode(PASSWORD); + SOAPElement partnerCode = authToken.addChildElement("partnerCode", "cod"); + partnerCode.addTextNode(PARTNERCODE); + + SOAPElement applicationName = + requestSigningRequest.addChildElement("applicationName", "cod"); + applicationName.addTextNode("Apache Tomcat"); + + SOAPElement applicationVersion = + requestSigningRequest.addChildElement("applicationVersion", "cod"); + applicationVersion.addTextNode("8.0.x trunk"); + + SOAPElement signingServiceName = + requestSigningRequest.addChildElement("signingServiceName", "cod"); + signingServiceName.addTextNode("Microsoft Signing"); + + SOAPElement commaDelimitedFileNames = + requestSigningRequest.addChildElement("commaDelimitedFileNames", "cod"); + commaDelimitedFileNames.addTextNode(getFileNames(filesToSign.size())); + + SOAPElement application = + requestSigningRequest.addChildElement("application", "cod"); + application.addTextNode(getApplicationString(filesToSign)); + + // Send the message + SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); + SOAPConnection connection = soapConnectionFactory.createConnection(); + java.net.URL endpoint = new URL("https://test-api.ws.symantec.com:443/webtrust/SigningService"); + + log("Sending siging request to server and waiting for reponse"); + SOAPMessage response = connection.call(message, endpoint); + + log("Processing response"); + SOAPElement responseBody = response.getSOAPBody(); + log(responseBody.getTextContent()); + + // Should come back signed + NodeList bodyNodes = responseBody.getChildNodes(); + NodeList requestSigningResponseNodes = bodyNodes.item(0).getChildNodes(); + NodeList returnNodes = requestSigningResponseNodes.item(0).getChildNodes(); + + String signingSetID = null; + String signingSetStatus = null; + + for (int i = 0; i < returnNodes.getLength(); i++) { + Node returnNode = returnNodes.item(i); + if (returnNode.getLocalName().equals("signingSetID")) { + signingSetID = returnNode.getTextContent(); + } else if (returnNode.getLocalName().equals("signingSetStatus")) { + signingSetStatus = returnNode.getTextContent(); + } + } + + if (!"SIGNED".equals(signingSetStatus)) { + throw new BuildException("Signing failed. Status was: " + signingSetStatus); + } + + log("TODO: Download signingSet: " + signingSetID); + + + } catch (SOAPException | IOException e) { + throw new BuildException(e); + } + } + + /** + * Signing service requires unique files names. Since files will be returned + * in order, use dummy names that we know are unique. + */ + private String getFileNames(int fileCount) { + StringBuilder sb = new StringBuilder(); + + boolean first = true; + + for (int i = 0; i < fileCount; i++) { + if (first) { + first = false; + } else { + sb.append(','); + } + sb.append(Integer.toString(i)); + } + return sb.toString(); + } + + /** + * Zips the files, base 64 encodes the resulting zip and then returns the + * string. It would be far more efficient to stream this directly to the + * signing server but the files that need to be signed are relatively small + * and this simpler to write. + * + * @param files Files to be signed + */ + private String getApplicationString(List<File> files) throws IOException { + // 10 MB should be more than enough for Tomcat + ByteArrayOutputStream baos = new ByteArrayOutputStream(10 * 1024 * 1024); + try (ZipOutputStream zos = new ZipOutputStream(baos)) { + + byte[] buf = new byte[32 * 1024]; + + for (int i = 0; i < files.size() ; i++) { + try (FileInputStream fis = new FileInputStream(files.get(i))) { + ZipEntry zipEntry = new ZipEntry(Integer.toString(i)); + zos.putNextEntry(zipEntry); + + int numRead; + while ( (numRead = fis.read(buf) ) >= 0) { + zos.write(buf, 0, numRead); + } + } + } + } + + log("" + baos.size()); + + return Base64.encodeBase64String(baos.toByteArray()); } } Propchange: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/ ------------------------------------------------------------------------------ Merged /commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2:r1593564-1609323 Modified: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java (original) +++ tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java Wed Jul 9 22:04:44 2014 @@ -63,6 +63,7 @@ public abstract class BaseGenericObjectP private volatile long maxWaitMillis = BaseObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS; private volatile boolean lifo = BaseObjectPoolConfig.DEFAULT_LIFO; + private final boolean fairness; private volatile boolean testOnCreate = BaseObjectPoolConfig.DEFAULT_TEST_ON_CREATE; private volatile boolean testOnBorrow = @@ -135,6 +136,7 @@ public abstract class BaseGenericObjectP // save the current CCL to be used later by the evictor Thread factoryClassLoader = Thread.currentThread().getContextClassLoader(); + fairness = config.getFairness(); } @@ -247,6 +249,17 @@ public abstract class BaseGenericObjectP public final boolean getLifo() { return lifo; } + + /** + * Returns whether or not the pool serves threads waiting to borrow objects fairly. + * True means that waiting threads are served as if waiting in a FIFO queue. + * + * @return <code>true</code> if waiting threads are to be served + * by the pool in arrival order + */ + public final boolean getFairness() { + return fairness; + } /** * Sets whether the pool has LIFO (last in, first out) behaviour with Modified: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java (original) +++ tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java Wed Jul 9 22:04:44 2014 @@ -33,6 +33,13 @@ public abstract class BaseObjectPoolConf * @see GenericKeyedObjectPool#getLifo() */ public static final boolean DEFAULT_LIFO = true; + + /** + * The default value for the {@code fairness} configuration attribute. + * @see GenericObjectPool#getFairness() + * @see GenericKeyedObjectPool#getFairness() + */ + public static final boolean DEFAULT_FAIRNESS = false; /** * The default value for the {@code maxWait} configuration attribute. @@ -146,6 +153,8 @@ public abstract class BaseObjectPoolConf private boolean lifo = DEFAULT_LIFO; + + private boolean fairness = DEFAULT_FAIRNESS; private long maxWaitMillis = DEFAULT_MAX_WAIT_MILLIS; @@ -194,6 +203,20 @@ public abstract class BaseObjectPoolConf public boolean getLifo() { return lifo; } + + /** + * Get the value for the {@code fairness} configuration attribute for pools + * created with this configuration instance. + * + * @return The current setting of {@code fairness} for this configuration + * instance + * + * @see GenericObjectPool#getFairness() + * @see GenericKeyedObjectPool#getFairness() + */ + public boolean getFairness() { + return fairness; + } /** * Set the value for the {@code lifo} configuration attribute for pools @@ -208,6 +231,20 @@ public abstract class BaseObjectPoolConf public void setLifo(boolean lifo) { this.lifo = lifo; } + + /** + * Set the value for the {@code fairness} configuration attribute for pools + * created with this configuration instance. + * + * @param fairness The new setting of {@code fairness} + * for this configuration instance + * + * @see GenericObjectPool#getFairness() + * @see GenericKeyedObjectPool#getFairness() + */ + public void setFairness(boolean fairness) { + this.fairness = fairness; + } /** * Get the value for the {@code maxWait} configuration attribute for pools Modified: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java (original) +++ tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java Wed Jul 9 22:04:44 2014 @@ -103,6 +103,7 @@ public class GenericKeyedObjectPool<K,T> throw new IllegalArgumentException("factory may not be null"); } this.factory = factory; + this.fairness = config.getFairness(); setConfig(config); @@ -340,7 +341,7 @@ public class GenericKeyedObjectPool<K,T> boolean blockWhenExhausted = getBlockWhenExhausted(); boolean create; - long waitTime = 0; + long waitTime = System.currentTimeMillis(); ObjectDeque<T> objectDeque = register(key); try { @@ -356,10 +357,8 @@ public class GenericKeyedObjectPool<K,T> if (borrowMaxWaitMillis < 0) { p = objectDeque.getIdleObjects().takeFirst(); } else { - waitTime = System.currentTimeMillis(); p = objectDeque.getIdleObjects().pollFirst( borrowMaxWaitMillis, TimeUnit.MILLISECONDS); - waitTime = System.currentTimeMillis() - waitTime; } } if (p == null) { @@ -431,7 +430,7 @@ public class GenericKeyedObjectPool<K,T> deregister(key); } - updateStatsBorrow(p, waitTime); + updateStatsBorrow(p, System.currentTimeMillis() - waitTime); return p.getObject(); } @@ -534,6 +533,12 @@ public class GenericKeyedObjectPool<K,T> } else { idleObjects.addLast(p); } + if (isClosed()) { + // Pool closed while object was being added to idle objects. + // Make sure the returned object is destroyed rather than left + // in the idle object pool (which would effectively be a leak) + clear(key); + } } if (hasBorrowWaiters()) { @@ -1083,7 +1088,7 @@ public class GenericKeyedObjectPool<K,T> lock.lock(); objectDeque = poolMap.get(k); if (objectDeque == null) { - objectDeque = new ObjectDeque<>(); + objectDeque = new ObjectDeque<>(fairness); objectDeque.getNumInterested().incrementAndGet(); // NOTE: Keys must always be added to both poolMap and // poolKeyList at the same time while protected by @@ -1399,8 +1404,7 @@ public class GenericKeyedObjectPool<K,T> */ private class ObjectDeque<S> { - private final LinkedBlockingDeque<PooledObject<S>> idleObjects = - new LinkedBlockingDeque<>(); + private final LinkedBlockingDeque<PooledObject<S>> idleObjects; /* * Number of instances created - number destroyed. @@ -1425,6 +1429,15 @@ public class GenericKeyedObjectPool<K,T> private final AtomicLong numInterested = new AtomicLong(0); /** + * Create a new ObjecDeque with the given fairness policy. + * @param fairness true means client threads waiting to borrow / return instances + * will be served as if waiting in a FIFO queue. + */ + public ObjectDeque(boolean fairness) { + idleObjects = new LinkedBlockingDeque<>(fairness); + } + + /** * Obtain the idle objects for the current key. * * @return The idle objects @@ -1470,6 +1483,7 @@ public class GenericKeyedObjectPool<K,T> private volatile int maxTotalPerKey = GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY; private final KeyedPooledObjectFactory<K,T> factory; + private final boolean fairness; //--- internal attributes -------------------------------------------------- Modified: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java (original) +++ tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java Wed Jul 9 22:04:44 2014 @@ -41,6 +41,11 @@ public interface GenericKeyedObjectPoolM */ boolean getBlockWhenExhausted(); /** + * See {@link GenericKeyedObjectPool#getFairness()} + * @return See {@link GenericKeyedObjectPool#getFairness()} + */ + boolean getFairness(); + /** * See {@link GenericKeyedObjectPool#getLifo()} * @return See {@link GenericKeyedObjectPool#getLifo()} */ Modified: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java (original) +++ tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java Wed Jul 9 22:04:44 2014 @@ -109,6 +109,8 @@ public class GenericObjectPool<T> extend } this.factory = factory; + idleObjects = new LinkedBlockingDeque<>(config.getFairness()); + setConfig(config); startEvictor(getTimeBetweenEvictionRunsMillis()); @@ -420,7 +422,7 @@ public class GenericObjectPool<T> extend boolean blockWhenExhausted = getBlockWhenExhausted(); boolean create; - long waitTime = 0; + long waitTime = System.currentTimeMillis(); while (p == null) { create = false; @@ -434,10 +436,8 @@ public class GenericObjectPool<T> extend if (borrowMaxWaitMillis < 0) { p = idleObjects.takeFirst(); } else { - waitTime = System.currentTimeMillis(); p = idleObjects.pollFirst(borrowMaxWaitMillis, TimeUnit.MILLISECONDS); - waitTime = System.currentTimeMillis() - waitTime; } } if (p == null) { @@ -506,7 +506,7 @@ public class GenericObjectPool<T> extend } } - updateStatsBorrow(p, waitTime); + updateStatsBorrow(p, System.currentTimeMillis() - waitTime); return p.getObject(); } @@ -607,6 +607,12 @@ public class GenericObjectPool<T> extend } else { idleObjects.addLast(p); } + if (isClosed()) { + // Pool closed while object was being added to idle objects. + // Make sure the returned object is destroyed rather than left + // in the idle object pool (which would effectively be a leak) + clear(); + } } updateStatsReturn(activeTime); } @@ -903,6 +909,12 @@ public class GenericObjectPool<T> extend idleObjects.addLast(p); } } + if (isClosed()) { + // Pool closed while object was being added to idle objects. + // Make sure the returned object is destroyed rather than left + // in the idle object pool (which would effectively be a leak) + clear(); + } } /** @@ -1097,8 +1109,7 @@ public class GenericObjectPool<T> extend * {@link #_maxActive} objects created at any one time. */ private final AtomicLong createCount = new AtomicLong(0); - private final LinkedBlockingDeque<PooledObject<T>> idleObjects = - new LinkedBlockingDeque<>(); + private final LinkedBlockingDeque<PooledObject<T>> idleObjects; // JMX specific attributes private static final String ONAME_BASE = Modified: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java (original) +++ tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java Wed Jul 9 22:04:44 2014 @@ -41,6 +41,11 @@ public interface GenericObjectPoolMXBean * See {@link GenericObjectPool#getLifo()} * @return See {@link GenericObjectPool#getLifo()} */ + boolean getFairness(); + /** + * See {@link GenericObjectPool#getFairness()} + * @return See {@link GenericObjectPool#getFairness()} + */ boolean getLifo(); /** * See {@link GenericObjectPool#getMaxIdle()} Modified: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java (original) +++ tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java Wed Jul 9 22:04:44 2014 @@ -34,6 +34,16 @@ class InterruptibleReentrantLock extends private static final long serialVersionUID = 1L; /** + * Create a new InterruptibleReentrantLock with the given fairness policy. + * + * @param fairness true means threads should acquire contended locks as if + * waiting in a FIFO queue + */ + public InterruptibleReentrantLock(boolean fairness) { + super(fairness); + } + + /** * Interrupt the threads that are waiting on a specific condition * * @param condition the condition on which the threads are waiting. Modified: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java (original) +++ tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java Wed Jul 9 22:04:44 2014 @@ -146,14 +146,13 @@ class LinkedBlockingDeque<E> extends Abs private final int capacity; /** Main lock guarding all access */ - private final InterruptibleReentrantLock lock = - new InterruptibleReentrantLock(); + private final InterruptibleReentrantLock lock; /** Condition for waiting takes */ - private final Condition notEmpty = lock.newCondition(); + private final Condition notEmpty; /** Condition for waiting puts */ - private final Condition notFull = lock.newCondition(); + private final Condition notFull; /** * Creates a {@code LinkedBlockingDeque} with a capacity of @@ -162,6 +161,16 @@ class LinkedBlockingDeque<E> extends Abs public LinkedBlockingDeque() { this(Integer.MAX_VALUE); } + + /** + * Creates a {@code LinkedBlockingDeque} with a capacity of + * {@link Integer#MAX_VALUE} and the given fairness policy. + * @param fairness true means threads waiting on the deque should be served + * as if waiting in a FIFO request queue + */ + public LinkedBlockingDeque(boolean fairness) { + this(Integer.MAX_VALUE, fairness); + } /** * Creates a {@code LinkedBlockingDeque} with the given (fixed) capacity. @@ -170,8 +179,24 @@ class LinkedBlockingDeque<E> extends Abs * @throws IllegalArgumentException if {@code capacity} is less than 1 */ public LinkedBlockingDeque(int capacity) { + this(capacity, false); + } + + /** + * Creates a {@code LinkedBlockingDeque} with the given (fixed) capacity + * and fairness policy. + * + * @param capacity the capacity of this deque + * @param fairness true means threads waiting on the deque should be served + * as if waiting in a FIFO request queue + * @throws IllegalArgumentException if {@code capacity} is less than 1 + */ + public LinkedBlockingDeque(int capacity, boolean fairness) { if (capacity <= 0) throw new IllegalArgumentException(); this.capacity = capacity; + lock = new InterruptibleReentrantLock(fairness); + notEmpty = lock.newCondition(); + notFull = lock.newCondition(); } /** Propchange: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java ('svn:mergeinfo' removed) Modified: tomcat/trunk/res/checkstyle/org-import-control.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/res/checkstyle/org-import-control.xml?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/res/checkstyle/org-import-control.xml (original) +++ tomcat/trunk/res/checkstyle/org-import-control.xml Wed Jul 9 22:04:44 2014 @@ -124,6 +124,7 @@ <allow pkg="javax.servlet"/> <subpackage name="buildutil"> <allow pkg="org.apache.tools.ant"/> + <allow pkg="org.apache.tomcat.util"/> </subpackage> <subpackage name="dbcp"> <allow pkg="org.apache.juli"/> Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1609326&r1=1609325&r2=1609326&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Wed Jul 9 22:04:44 2014 @@ -217,6 +217,10 @@ <bug>56685</bug>: Add quotes necessary for <code>daemon.sh</code> to work correctly on Solaris. Based on a suggesiton by lfuka. (markt) </fix> + <update> + Update package renamed Apache Commons Pool2 to r1609323 to pick various + bug fixes. (markt) + </update> </changelog> </subsection> </section> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org