Author: sahoo
Date: Thu Jan 20 11:45:14 2011
New Revision: 1061240

URL: http://svn.apache.org/viewvc?rev=1061240&view=rev
Log:
FELIX-2791: Introduce a barrier to synchronize watcher threads

Modified:
    
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
    
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java

Modified: 
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java?rev=1061240&r1=1061239&r2=1061240&view=diff
==============================================================================
--- 
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
 (original)
+++ 
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java
 Thu Jan 20 11:45:14 2011
@@ -215,6 +215,24 @@ public class DirectoryWatcher extends Th
      */
     public void run()
     {
+        // We must wait for FileInstall to complete initialisation
+        // to avoid race conditions observed in FELIX-2791
+        synchronized (FileInstall.barrier)
+        {
+            while (!FileInstall.initialized)
+            {
+                try
+                {
+                    FileInstall.barrier.wait(0);
+                }
+                catch (InterruptedException e)
+                {
+                    Thread.currentThread().interrupt();
+                    log(Logger.LOG_INFO, "Watcher for " + watchedDirectory + " 
exiting because of interruption.", e);
+                    return;
+                }
+            }
+        }
         log(Logger.LOG_DEBUG,
             "{" + POLL + " (ms) = " + poll + ", "
                 + DIR + " = " + watchedDirectory.getAbsolutePath() + ", "

Modified: 
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java?rev=1061240&r1=1061239&r2=1061240&view=diff
==============================================================================
--- 
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
 (original)
+++ 
felix/trunk/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/FileInstall.java
 Thu Jan 20 11:45:14 2011
@@ -45,6 +45,8 @@ public class FileInstall implements Bund
     BundleContext context;
     Map watchers = new HashMap();
     ServiceTracker listenersTracker;
+    static boolean initialized;
+    static final Object barrier = new Object();
 
     public void start(BundleContext context) throws Exception
     {
@@ -122,6 +124,12 @@ public class FileInstall implements Bund
         {
             updated("initial", ht);
         }
+        // now notify all the directory watchers to proceed
+        // We need this to avoid race conditions observed in FELIX-2791
+        synchronized (barrier) {
+            initialized = true;
+            barrier.notifyAll();
+        }
     }
 
     // Adapted for FELIX-524
@@ -141,6 +149,9 @@ public class FileInstall implements Bund
 
     public void stop(BundleContext context) throws Exception
     {
+        synchronized (barrier) {
+            initialized = false;
+        }
         List /*<DirectoryWatcher>*/ toClose = new ArrayList 
/*<DirectoryWatcher>*/();
         synchronized (watchers)
         {


Reply via email to