speedup: call force() only at the end of the build, between chunk builds drop only...
authorEugene Zhuravlev <jeka@intellij.com>
Sat, 28 Jan 2012 15:59:16 +0000 (16:59 +0100)
committerEugene Zhuravlev <jeka@intellij.com>
Sat, 28 Jan 2012 15:59:16 +0000 (16:59 +0100)
13 files changed:
jps/jps-builders/src/org/jetbrains/jps/incremental/CompileContext.java
jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java
jps/jps-builders/src/org/jetbrains/jps/incremental/storage/AbstractStateStorage.java
jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildDataManager.java
jps/jps-builders/src/org/jetbrains/jps/server/ProjectDescriptor.java
jps/model/src/org/jetbrains/ether/dependencyView/Maplet.java
jps/model/src/org/jetbrains/ether/dependencyView/Mappings.java
jps/model/src/org/jetbrains/ether/dependencyView/MultiMaplet.java
jps/model/src/org/jetbrains/ether/dependencyView/PersistentMaplet.java
jps/model/src/org/jetbrains/ether/dependencyView/PersistentMultiMaplet.java
jps/model/src/org/jetbrains/ether/dependencyView/TransientMaplet.java
jps/model/src/org/jetbrains/ether/dependencyView/TransientMultiMaplet.java
platform/util/src/com/intellij/util/io/PersistentHashMap.java

index bdf35b13e838f8bb0fa41b29304cd8eeb7d0c9db..8d5a286733aa4338b1fad4471f80204666a7cc69 100644 (file)
@@ -170,9 +170,7 @@ public class CompileContext extends UserDataHolderBase implements MessageHandler
   }
 
   void onChunkBuildComplete(@NotNull ModuleChunk chunk) throws Exception {
-    final Mappings mappings = myDataManager.getMappings();
-    mappings.clearMemoryCaches();
-    myDataManager.flush();
+    myDataManager.flush(true);
 
     try {
       if (!myErrorsFound && !myCancelStatus.isCanceled()) {
index 55314ebd1cc6c1c700f08269b0cb971971b79280..769dbd61dbb2d978a62fab70a13216fc7ac0fda9 100644 (file)
@@ -102,9 +102,6 @@ public class IncProjectBuilder {
   }
 
   private static void flushContext(CompileContext context) {
-    if (context != null) {
-      context.getDataManager().flush();
-    }
     final ExternalJavacDescriptor descriptor = ExternalJavacDescriptor.KEY.get(context);
     if (descriptor != null) {
       try {
index 71346299175b54a6a5b6e5e62e23f70ceb317df8..6da5a613e6518ab678e802e2988509c37086747b 100644 (file)
@@ -32,6 +32,12 @@ public abstract class AbstractStateStorage<Key, T> {
     }
   }
 
+  public void dropMemoryCache() {
+    synchronized (myDataLock) {
+      myMap.dropMemoryCaches();
+    }
+  }
+
   public void close() throws IOException {
     synchronized (myDataLock) {
       myMap.close();
index 7e5b7c56ca506730f1913d7498bb973259fc062c..37de0978ae63c40b4b074b9410b793dbde22c475 100644 (file)
@@ -85,20 +85,37 @@ public class BuildDataManager {
     }
   }
 
-  public void flush() {
+  public void flush(boolean memoryCachesOnly) {
     synchronized (mySourceToOutputLock) {
       for (Map.Entry<String, SourceToOutputMapping> entry : myProductionSourceToOutputs.entrySet()) {
-        entry.getValue().force();
+        final SourceToOutputMapping mapping = entry.getValue();
+        if (memoryCachesOnly) {
+          mapping.dropMemoryCache();
+        }
+        else {
+          mapping.force();
+        }
       }
       for (Map.Entry<String, SourceToOutputMapping> entry : myTestSourceToOutputs.entrySet()) {
-        entry.getValue().force();
+        final SourceToOutputMapping mapping = entry.getValue();
+        if (memoryCachesOnly) {
+          mapping.dropMemoryCache();
+        }
+        else {
+          mapping.force();
+        }
       }
     }
-    mySrcToFormMap.force();
+    if (memoryCachesOnly) {
+      mySrcToFormMap.dropMemoryCache();
+    }
+    else {
+      mySrcToFormMap.force();
+    }
     final Mappings mappings = myMappings;
     if (mappings != null) {
       synchronized (mappings) {
-        mappings.flush();
+        mappings.flush(memoryCachesOnly);
       }
     }
   }
index 11ee1a1a5aaafb631e56f9e5f8ae7e1d1ef2e307..8cdce41f81b3cff46664486f70b3485a8f2c399d 100644 (file)
@@ -53,5 +53,9 @@ public final class ProjectDescriptor {
         }
       }
     }
+    else {
+      timestamps.getStorage().force();
+      dataManager.flush(false);
+    }
   }
 }
index 2e45c312a684caefa969c31ca57091758d6fdcf0..9901cadc93616c3646f6cf7c2e6825aa484e1841 100644 (file)
@@ -35,5 +35,5 @@ interface Maplet<K, V> {
   Collection<K> keyCollection();
   Collection<Map.Entry<K, V>> entrySet();
 
-  void flush();
+  void flush(boolean memoryCachesOnly);
 }
index 8163e56cfee6b11a53b08318600ad5e666dfe740..c500c9d1b09a26b848c66da6fc98bec7a8786ba2 100644 (file)
@@ -163,10 +163,6 @@ public class Mappings {
     }
   }
 
-  public void clearMemoryCaches() {
-    myContext.clearMemoryCaches();
-  }
-
   private void compensateRemovedContent(final Collection<File> compiled) {
     for (File file : compiled) {
       final DependencyContext.S key = myContext.get(FileUtil.toSystemIndependentName(file.getAbsolutePath()));
@@ -1663,19 +1659,24 @@ public class Mappings {
     }
   }
 
-  public void flush() {
-    myClassToSubclasses.flush();
-    myClassToClassDependency.flush();
-    mySourceFileToClasses.flush();
-    mySourceFileToAnnotationUsages.flush();
-    mySourceFileToUsages.flush();
-    myClassToSourceFile.flush();
+  public void flush(final boolean memoryCachesOnly) {
+    myClassToSubclasses.flush(memoryCachesOnly);
+    myClassToClassDependency.flush(memoryCachesOnly);
+    mySourceFileToClasses.flush(memoryCachesOnly);
+    mySourceFileToAnnotationUsages.flush(memoryCachesOnly);
+    mySourceFileToUsages.flush(memoryCachesOnly);
+    myClassToSourceFile.flush(memoryCachesOnly);
 
     if (!myIsDelta) {
       // flush if you own the context
       final DependencyContext context = myContext;
       if (context != null) {
-        context.flush();
+        if (memoryCachesOnly) {
+          context.clearMemoryCaches();
+        }
+        else {
+          context.flush();
+        }
       }
     }
   }
index 2bf56eab98de1452d2944148ec1dd0ae15263f41..68b1f350dd681bd7a040034b6454ed9bf95acec7 100644 (file)
@@ -38,5 +38,5 @@ interface MultiMaplet<K, V> {
   Collection<K> keyCollection();
   Collection<Map.Entry<K, Collection<V>>> entrySet();
 
-  void flush();
+  void flush(boolean memoryCachesOnly);
 }
index e76e9c045f3cbc4dbfe68395d6ca44e857ef6235..b60661c8948d25ea1432a415e83451a23855195f 100644 (file)
@@ -106,8 +106,13 @@ public class PersistentMaplet<K, V> implements Maplet<K, V> {
     }
   }
 
-  public void flush() {
-    myMap.force();
+  public void flush(boolean memoryCachesOnly) {
+    if (memoryCachesOnly) {
+      myMap.dropMemoryCaches();
+    }
+    else {
+      myMap.force();
+    }
   }
 
   @Override
index 73d3d68048fe6b5b825501794938c03d6fbb37e8..b62eb72f2b76bed1bbd9f19a56ce8c10df839c84 100644 (file)
@@ -167,8 +167,13 @@ class PersistentMultiMaplet<K, V> implements MultiMaplet<K, V> {
     }
   }
 
-  public void flush() {
-    myMap.force();
+  public void flush(boolean memoryCachesOnly) {
+    if (memoryCachesOnly) {
+      myMap.dropMemoryCaches();
+    }
+    else {
+      myMap.force();
+    }
   }
 
   @Override
index 134839f7eeaf6263d3c0588fd10dc2cea6ba9e02..1521310f5a1de8637ef5a100697ccca8eb73f4ec 100644 (file)
@@ -62,7 +62,7 @@ public class TransientMaplet<K, V> implements Maplet<K, V>{
     myMap.clear();
   }
 
-  public void flush() {
+  public void flush(boolean memoryCachesOnly) {
   }
 
   @Override
index f324638ac5c8941bd09c05bca4e72e750c3d45c6..2177cfdbd44b944431b439796af19f8e29872c8a 100644 (file)
@@ -124,6 +124,6 @@ class TransientMultiMaplet<K, V> implements MultiMaplet<K, V> {
     myMap.clear(); // free memory
   }
 
-  public void flush() {
+  public void flush(boolean memoryCachesOnly) {
   }
 }
index 5e5aba43cd67889501caed6f5d6f4b54e46a816e..297b733d754192a9288cc81abd3cd9620f1657b3 100644 (file)
@@ -124,14 +124,10 @@ public class PersistentHashMap<Key, Value> extends PersistentEnumeratorDelegate<
   private final LowMemoryWatcher myAppendCacheFlusher = LowMemoryWatcher.register(new LowMemoryWatcher.ForceableAdapter() {
     public void force() {
       //System.out.println("Flushing caches: " + myFile.getPath());
-      synchronized (myEnumerator) {
-        synchronized (PersistentEnumerator.ourLock) {
-          clearAppenderCaches();
-        }
-      }
+      dropMemoryCaches();
     }
   });
-  
+
   public PersistentHashMap(final File file, KeyDescriptor<Key> keyDescriptor, DataExternalizer<Value> valueExternalizer) throws IOException {
     this(file, keyDescriptor, valueExternalizer, INITIAL_INDEX_SIZE);
   }
@@ -195,6 +191,14 @@ public class PersistentHashMap<Key, Value> extends PersistentEnumeratorDelegate<
     }
   }
 
+  public void dropMemoryCaches() {
+    synchronized (myEnumerator) {
+      synchronized (PersistentEnumerator.ourLock) {
+        clearAppenderCaches();
+      }
+    }
+  }
+
   public int getGarbageSize() {
     return (int)myLiveAndGarbageKeysCounter;
   }