Author: markt
Date: Tue Aug 12 08:10:23 2008
New Revision: 685177
URL: http://svn.apache.org/viewvc?rev=685177&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=45608
Use AtomicInteger for countAllocated to prevent race conditions.
Modified:
tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java?rev=685177&r1=685176&r2=685177&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java Tue Aug 12
08:10:23 2008
@@ -25,6 +25,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Stack;
+import java.util.concurrent.atomic.AtomicInteger;
import javax.management.ListenerNotFoundException;
import javax.management.MBeanNotificationInfo;
@@ -114,7 +115,7 @@
* The count of allocations that are currently active (even if they
* are for the same instance, as will be true on a non-STM servlet).
*/
- protected int countAllocated = 0;
+ protected AtomicInteger countAllocated = new AtomicInteger(0);
/**
@@ -314,7 +315,7 @@
*/
public int getCountAllocated() {
- return (this.countAllocated);
+ return (this.countAllocated.get());
}
@@ -784,7 +785,7 @@
// condition with unload. Bug 43683, test case #3
if (!singleThreadModel) {
newInstance = true;
- countAllocated++;
+ countAllocated.incrementAndGet();
}
} catch (ServletException e) {
throw e;
@@ -802,7 +803,7 @@
// For new instances, count will have been incremented at the
// time of creation
if (!newInstance) {
- countAllocated++;
+ countAllocated.incrementAndGet();
}
return (instance);
}
@@ -810,7 +811,7 @@
synchronized (instancePool) {
- while (countAllocated >= nInstances) {
+ while (countAllocated.get() >= nInstances) {
// Allocate a new instance if possible, or else wait
if (nInstances < maxInstances) {
try {
@@ -832,7 +833,7 @@
}
if (log.isTraceEnabled())
log.trace(" Returning allocated STM instance");
- countAllocated++;
+ countAllocated.incrementAndGet();
return (Servlet) instancePool.pop();
}
@@ -853,13 +854,13 @@
// If not SingleThreadModel, no action is required
if (!singleThreadModel) {
- countAllocated--;
+ countAllocated.decrementAndGet();
return;
}
// Unlock and free this instance
synchronized (instancePool) {
- countAllocated--;
+ countAllocated.decrementAndGet();
instancePool.push(servlet);
instancePool.notify();
}
@@ -1250,13 +1251,13 @@
// Loaf a while if the current instance is allocated
// (possibly more than once if non-STM)
- if (countAllocated > 0) {
+ if (countAllocated.get() > 0) {
int nRetries = 0;
long delay = unloadDelay / 20;
- while ((nRetries < 21) && (countAllocated > 0)) {
+ while ((nRetries < 21) && (countAllocated.get() > 0)) {
if ((nRetries % 10) == 0) {
log.info(sm.getString("standardWrapper.waiting",
- new Integer(countAllocated)));
+ countAllocated.toString()));
}
try {
Thread.sleep(delay);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]