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)
{