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

Reply via email to