User: starksm
Date: 01/12/27 12:50:40
Modified: src/main/org/jboss/pool Tag: Branch_2_4 ObjectPool.java
Log:
Apply patch #495959 to fix race conditions in ObjectPool
Revision Changes Path
No revision
No revision
1.2.2.3 +64 -50 jbosspool/src/main/org/jboss/pool/ObjectPool.java
Index: ObjectPool.java
===================================================================
RCS file: /cvsroot/jboss/jbosspool/src/main/org/jboss/pool/ObjectPool.java,v
retrieving revision 1.2.2.2
retrieving revision 1.2.2.3
diff -u -r1.2.2.2 -r1.2.2.3
--- ObjectPool.java 2001/11/20 09:38:02 1.2.2.2
+++ ObjectPool.java 2001/12/27 20:50:40 1.2.2.3
@@ -562,10 +562,13 @@
for(Iterator it = localObjects.values().iterator(); it.hasNext();)
{
ObjectRecord rec = (ObjectRecord)it.next();
- if(rec.isInUse())
- factory.returnObject(rec.getClientObject());
- factory.deleteObject(rec.getObject());
- rec.close();
+ if (null != rec)
+ {
+ if(rec.isInUse())
+ factory.returnObject(rec.getClientObject());
+ factory.deleteObject(rec.getObject());
+ rec.close();
+ }
}
localObjects.clear();
@@ -609,7 +612,7 @@
while(it.hasNext())
{
ObjectRecord rec = (ObjectRecord)it.next();
- if(!rec.isInUse() && factory.checkValidObject(rec.getObject(),
parameters))
+ if(null != rec && !rec.isInUse() &&
factory.checkValidObject(rec.getObject(), parameters))
{
try
{
@@ -796,7 +799,10 @@
{
if(objects == null) return 0;
int total = 0;
- Iterator it = new HashSet(objects.values()).iterator();
+ Iterator it;
+ synchronized (resizeLock) {
+ it = new HashSet(objects.values()).iterator();
+ }
while(it.hasNext())
{
ObjectRecord or = (ObjectRecord)it.next();
@@ -859,59 +865,67 @@
void runGCandShrink()
{
- if(runGC)
- { // Garbage collection - return any object that's been out too long with no
use
- Iterator it = new HashSet(objects.values()).iterator();
- while(it.hasNext())
- {
- ObjectRecord rec = (ObjectRecord)it.next();
- if(rec.isInUse() && rec.getMillisSinceLastUse() >= gcMinIdleMillis)
+ if (runGC || idleTimeout)
+ {
+ HashSet objsCopy;
+ synchronized (resizeLock) {
+ objsCopy = new HashSet(objects.values());
+ }
+
+ if(runGC)
+ { // Garbage collection - return any object that's been out too long with
no use
+ Iterator it = objsCopy.iterator();
+ while(it.hasNext())
{
- releaseObject(rec.getClientObject());
+ ObjectRecord rec = (ObjectRecord)it.next();
+ if(rec.isInUse() && rec.getMillisSinceLastUse() >= gcMinIdleMillis)
+ {
+ releaseObject(rec.getClientObject());
+ }
}
- }
- }
- if(idleTimeout)
- { // Shrinking the pool - remove objects from the pool if they have not been
used in a long time
- // Find object eligible for removal
- HashSet eligible = new HashSet();
- Iterator it = new HashSet(objects.values()).iterator();
- while(it.hasNext())
- {
- ObjectRecord rec = (ObjectRecord)it.next();
- if(!rec.isInUse() && rec.getMillisSinceLastUse() > idleTimeoutMillis)
- eligible.add(rec);
}
- // Calculate max number of objects to remove without replacing
- int max = Math.round(eligible.size() * maxIdleShrinkPercent);
- if(max == 0 && eligible.size() > 0) max = 1;
- int count = 0;
- // Attempt to remove that many objects
- it = eligible.iterator();
- while(it.hasNext())
- {
- try
+ if(idleTimeout)
+ { // Shrinking the pool - remove objects from the pool if they have not
been used in a long time
+ // Find object eligible for removal
+ HashSet eligible = new HashSet();
+ Iterator it = objsCopy.iterator();
+ while(it.hasNext())
{
- // Delete the object
ObjectRecord rec = (ObjectRecord)it.next();
- rec.setInUse(true); // Don't let someone use it while we destroy it
- Object pooled = rec.getObject();
- removeObject(pooled);
+ if(!rec.isInUse() && rec.getMillisSinceLastUse() > idleTimeoutMillis)
+ eligible.add(rec);
+ }
+ // Calculate max number of objects to remove without replacing
+ int max = Math.round(eligible.size() * maxIdleShrinkPercent);
+ if(max == 0 && eligible.size() > 0) max = 1;
+ int count = 0;
+ // Attempt to remove that many objects
+ it = eligible.iterator();
+ while(it.hasNext())
+ {
try
{
- factory.deleteObject(pooled);
- }
- catch(Exception e)
+ // Delete the object
+ ObjectRecord rec = (ObjectRecord)it.next();
+ rec.setInUse(true); // Don't let someone use it while we destroy
it
+ Object pooled = rec.getObject();
+ removeObject(pooled);
+ try
+ {
+ factory.deleteObject(pooled);
+ }
+ catch(Exception e)
+ {
+ log.error("Pool "+this+" factory
("+factory.getClass().getName()+" delete error: ", e);
+ }
+ rec.close();
+ ++count;
+
+ if(count > max || objects.size() < minSize)
+ createNewObject(null, false);
+ } catch(ConcurrentModificationException e)
{
- log.error("Pool "+this+" factory
("+factory.getClass().getName()+" delete error: ", e);
}
- rec.close();
- ++count;
-
- if(count > max || objects.size() < minSize)
- createNewObject(null, false);
- } catch(ConcurrentModificationException e)
- {
}
}
}
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development