From 390337f6753a42e858bddfeb8d1511303c8fa9d7 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Wed, 25 May 2011 14:05:57 +0200 Subject: [PATCH] AppCode: caching files, libraries, and frameworks in XcodeMetaData + XcodeProjectModificationTracker + central events about various project modifications --- .../util/DefaultModificationTracker.java | 16 ++++++++++++++++ .../openapi/util/ModificationTracker.java | 1 + .../src/com/intellij/util/CachedValueBase.java | 18 ++++++++++++++++-- 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 platform/platform-api/src/com/intellij/openapi/util/DefaultModificationTracker.java diff --git a/platform/platform-api/src/com/intellij/openapi/util/DefaultModificationTracker.java b/platform/platform-api/src/com/intellij/openapi/util/DefaultModificationTracker.java new file mode 100644 index 000000000000..05f8417e1780 --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/util/DefaultModificationTracker.java @@ -0,0 +1,16 @@ +package com.intellij.openapi.util; + +import java.util.concurrent.atomic.AtomicLong; + +public class DefaultModificationTracker implements ModificationTracker { + private volatile AtomicLong myCount = new AtomicLong(); + + @Override + public long getModificationCount() { + return myCount.get(); + } + + public void incModificationCount() { + myCount.incrementAndGet(); + } +} diff --git a/platform/platform-api/src/com/intellij/openapi/util/ModificationTracker.java b/platform/platform-api/src/com/intellij/openapi/util/ModificationTracker.java index 5fc9b009184b..bcac21adbf86 100644 --- a/platform/platform-api/src/com/intellij/openapi/util/ModificationTracker.java +++ b/platform/platform-api/src/com/intellij/openapi/util/ModificationTracker.java @@ -23,6 +23,7 @@ public interface ModificationTracker { ModificationTracker EVER_CHANGED = new ModificationTracker() { private long myCounter = 0; + public long getModificationCount() { return myCounter++; } diff --git a/platform/platform-impl/src/com/intellij/util/CachedValueBase.java b/platform/platform-impl/src/com/intellij/util/CachedValueBase.java index d8d71dbbef68..c333c2fc9ea5 100644 --- a/platform/platform-impl/src/com/intellij/util/CachedValueBase.java +++ b/platform/platform-impl/src/com/intellij/util/CachedValueBase.java @@ -29,6 +29,7 @@ import org.jetbrains.annotations.Nullable; import java.lang.ref.Reference; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicLong; /** * @author Dmitry Avdeev @@ -80,8 +81,7 @@ public abstract class CachedValueBase { @Nullable private T getUpToDateOrNull(boolean dispose) { - final SoftReference> ref = myData; - final Data data = ref == null ? null : ref.get(); + final Data data = getData(); if (data != null) { T value = data.myValue; @@ -95,6 +95,12 @@ public abstract class CachedValueBase { return null; } + @Nullable + private Data getData() { + final SoftReference> ref = myData; + return ref == null ? null : ref.get(); + } + protected boolean isUpToDate(@NotNull Data data) { if (data.myTimeStamps == null) return true; @@ -129,6 +135,10 @@ public abstract class CachedValueBase { if (dependency instanceof ModificationTracker) { return ((ModificationTracker)dependency).getModificationCount(); } + else if (dependency instanceof CachedValueBase) { + Data data = ((CachedValueBase)dependency).getData(); + return data == null || !isUpToDate(data) ? -1 : data.myTimestamp; + } else if (dependency instanceof Reference){ final Object original = ((Reference)dependency).get(); if(original == null) return -1; @@ -157,11 +167,15 @@ public abstract class CachedValueBase { public abstract boolean isFromMyProject(Project project); protected static class Data implements Disposable { + private static final AtomicLong ourCounter = new AtomicLong(); + + private final long myTimestamp; private final T myValue; private final Object[] myDependencies; private final long[] myTimeStamps; public Data(final T value, final Object[] dependencies, final long[] timeStamps) { + myTimestamp = ourCounter.incrementAndGet(); myValue = value; myDependencies = dependencies; myTimeStamps = timeStamps;