Force fork/join during lucene commits and search

Change-Id: I79d4d941dde7bc37f5b7aea9890469074a5041b7
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java
index 3f6f675..9f4e3d0 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/IndexContainer.java
@@ -173,17 +173,18 @@
 
 	public SearcherManager getTimestampsSearcher() {
 		try {
+			boolean refresh = true;
 			if (fTimestampsSearcher == null) {
 				synchronized (this) {
 					if (fTimestampsSearcher == null) {
 						fTimestampsSearcher = new SearcherManager(
 								getTimestampsWriter(), true, false,
 								new SearcherFactory());
-					} else {
-						fTimestampsSearcher.maybeRefresh();
+						refresh = false;
 					}
 				}
-			} else {
+			}
+			if (refresh) {
 				fTimestampsSearcher.maybeRefresh();
 			}
 
@@ -201,7 +202,7 @@
 	public IndexWriter getIndexWriter(IndexType dataType, int elementType) {
 		IndexWriter writer = fIndexWriters.get(dataType).get(elementType);
 		if (writer == null) {
-			synchronized (this) {
+			synchronized (fIndexWriters) {
 				writer = fIndexWriters.get(dataType).get(elementType);
 				if (writer == null) {
 					Path writerPath = getPath(dataType, elementType);
@@ -220,8 +221,9 @@
 		SearcherManager searcher = fIndexSearchers.get(dataType)
 				.get(elementType);
 		try {
+			boolean refresh = true;
 			if (searcher == null) {
-				synchronized (this) {
+				synchronized (fIndexSearchers) {
 					searcher = fIndexSearchers.get(dataType).get(elementType);
 					if (searcher == null) {
 						searcher = new SearcherManager(
@@ -229,15 +231,14 @@
 								new SearcherFactory());
 						fIndexSearchers.get(dataType).put(elementType,
 								searcher);
-					} else {
-						searcher.maybeRefreshBlocking();
+						refresh = false;
 					}
 
 				}
-			} else {
+			}
+			if (refresh) {
 				searcher.maybeRefreshBlocking();
 			}
-
 		} catch (IndexNotFoundException e) {
 			return null;
 		} catch (IOException e) {
@@ -309,7 +310,7 @@
 
 	void commit() {
 		List<IndexWriter> writers = new LinkedList<>();
-		synchronized (this) {
+		synchronized (fIndexWriters) {
 			for (Map<Integer, IndexWriter> dataWriters : fIndexWriters
 					.values()) {
 				for (IndexWriter writer : dataWriters.values()) {
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneManager.java b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneManager.java
index 5fd2d88..8f72b45 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneManager.java
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneManager.java
@@ -19,7 +19,6 @@
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -100,17 +99,10 @@
 				if (subMonitor.isCanceled()) {
 					return Status.CANCEL_STATUS;
 				}
-				List<ForkJoinTask> tasks = new LinkedList<>();
-				if (dirtyContainers.size() == 1) {
-					dirtyContainers.get(0).commit();
-				} else {
-					for (IndexContainer indexContainer : dirtyContainers) {
-						tasks.add(ForkJoinTask.adapt(() -> {
-							indexContainer.commit();
-						}));
-					}
-					ForkJoinTask.invokeAll(tasks).stream()
-							.forEach(t -> t.join());
+				for (IndexContainer indexContainer : dirtyContainers) {
+					ForkJoinTask.adapt(() -> {
+						indexContainer.commit();
+					}).fork();
 				}
 			} catch (Exception e) {
 				Logger.logException(e);
@@ -168,12 +160,11 @@
 
 		@Override
 		public void aboutToBeIdle() {
-			// run directly without special job
-			fCommitter.run(new NullProgressMonitor());
 		}
 
 		@Override
 		public void aboutToBeRun(long idlingTime) {
+			fCommitter.run(new NullProgressMonitor());
 		}
 
 	}
@@ -277,11 +268,14 @@
 
 	private List<IndexContainer> getDirtyContainers() {
 		List<IndexContainer> uncommittedContainers = new ArrayList<>();
-		for (IndexContainer indexContainer : fIndexContainers.values()) {
-			if (indexContainer.hasChanges()) {
-				uncommittedContainers.add(indexContainer);
+		synchronized (fIndexContainers) {
+			for (IndexContainer indexContainer : fIndexContainers.values()) {
+				if (indexContainer.hasChanges()) {
+					uncommittedContainers.add(indexContainer);
+				}
 			}
 		}
+
 		return uncommittedContainers;
 	}
 
@@ -315,7 +309,7 @@
 		}
 	}
 
-	private synchronized void startup() {
+	private void startup() {
 		loadProperties();
 		boolean purgeIndexRoot = false;
 		boolean resetProperties = false;
diff --git a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java
index 30b5806..efd826b 100644
--- a/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java
+++ b/core/plugins/org.eclipse.dltk.core.index.lucene/src/org/eclipse/dltk/internal/core/index/lucene/LuceneSearchEngine.java
@@ -253,7 +253,7 @@
 						parent, trueFlags, falseFlags, true, matchRule, scripts,
 						container));
 			}
-			ForkJoinTask.invokeAll(tasks).stream().forEach(t -> t.join()
+			tasks.stream().map(ForkJoinTask::fork).forEach(t -> t.join()
 					.stream().forEach(m -> searchMatchHandler.handle(m, true)));
 
 		}
@@ -263,7 +263,7 @@
 						parent, trueFlags, falseFlags, false, matchRule,
 						scripts, container));
 			}
-			ForkJoinTask.invokeAll(tasks).stream().forEach(t -> t.join()
+			tasks.stream().map(ForkJoinTask::fork).forEach(t -> t.join()
 					.stream().forEach(m -> searchMatchHandler.handle(m, true)));
 		}
 	}
diff --git a/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/internal/core/search/processing/JobManager.java b/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/internal/core/search/processing/JobManager.java
index a36369a..885928f 100644
--- a/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/internal/core/search/processing/JobManager.java
+++ b/core/plugins/org.eclipse.dltk.core/search/org/eclipse/dltk/internal/core/search/processing/JobManager.java
@@ -412,6 +412,7 @@
 								delaySignal.wait(50);
 							}
 						}
+
 						continue;
 					}
 					if (VERBOSE) {