You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2006/08/30 16:45:14 UTC

svn commit: r438504 - /jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/util/TransientFileFactory.java

Author: stefan
Date: Wed Aug 30 07:45:14 2006
New Revision: 438504

URL: http://svn.apache.org/viewvc?rev=438504&view=rev
Log:
JCR-549: TransientFileFactory may throw ConcurrentModificationException on shutdown

Modified:
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/util/TransientFileFactory.java

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/util/TransientFileFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/util/TransientFileFactory.java?rev=438504&r1=438503&r2=438504&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/util/TransientFileFactory.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/util/TransientFileFactory.java Wed Aug 30 07:45:14 2006
@@ -82,9 +82,15 @@
         // register shutdownhook for final cleaning up
         Runtime.getRuntime().addShutdownHook(new Thread() {
             public void run() {
-                for (Iterator it = trackedRefs.iterator(); it.hasNext();) {
-                    MoribundFileReference fileRef = (MoribundFileReference) it.next();
-                    fileRef.delete();
+                // synchronize on the list before iterating over it in order
+                // to avoid ConcurrentModificationException (JCR-549)
+                // @see java.lang.util.Collections.synchronizedList(java.util.List)
+                synchronized(trackedRefs) {
+                    for (Iterator it = trackedRefs.iterator(); it.hasNext();) {
+                        MoribundFileReference fileRef = (MoribundFileReference) it.next();
+                        fileRef.delete();
+                    }
+
                 }
             }
         });