You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2011/02/16 12:14:54 UTC

svn commit: r1071207 - /sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java

Author: cziegeler
Date: Wed Feb 16 11:14:54 2011
New Revision: 1071207

URL: http://svn.apache.org/viewvc?rev=1071207&view=rev
Log:
SLING-1982 : Potential deadlock if job manager is restarted

Modified:
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java?rev=1071207&r1=1071206&r2=1071207&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/DefaultJobManager.java Wed Feb 16 11:14:54 2011
@@ -213,20 +213,23 @@ public class DefaultJobManager
      * @see java.lang.Runnable#run()
      */
     private void cleanup() {
-        this.schedulerRuns++;
+        // check for unprocessed jobs first
+        for(final AbstractJobQueue jbq : this.queues.values() ) {
+            jbq.checkForUnprocessedJobs();
+        }
+        
         // we only do a full clean up on every fifth run
+        this.schedulerRuns++;
         final boolean doFullCleanUp = (schedulerRuns % 5 == 0);
 
-        // check for idle queue
-        // we synchronize to avoid creating a queue which is about to be removed during cleanup
-        synchronized ( queuesLock ) {
-            final Iterator<Map.Entry<String, AbstractJobQueue>> i = this.queues.entrySet().iterator();
-            while ( i.hasNext() ) {
-                final Map.Entry<String, AbstractJobQueue> current = i.next();
-                // clean up
-                final AbstractJobQueue jbq = current.getValue();
-                jbq.checkForUnprocessedJobs();
-                if ( doFullCleanUp ) {
+        if ( doFullCleanUp ) {
+            // check for idle queue
+           // we synchronize to avoid creating a queue which is about to be removed during cleanup
+            synchronized ( queuesLock ) {
+                final Iterator<Map.Entry<String, AbstractJobQueue>> i = this.queues.entrySet().iterator();
+                while ( i.hasNext() ) {
+                    final Map.Entry<String, AbstractJobQueue> current = i.next();
+                    final AbstractJobQueue jbq = current.getValue();
                     if ( jbq.isMarkedForRemoval() ) {
                         // close
                         jbq.close();