Skip to content

Commit

Permalink
Created ConstructableWeakRef to refactor reconstructable weak caches.
Browse files Browse the repository at this point in the history
  • Loading branch information
kelemen committed Nov 12, 2016
1 parent a73c1bd commit 250035b
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 40 deletions.
@@ -0,0 +1,30 @@
package org.netbeans.gradle.model.util;

import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicReference;

public final class ConstructableWeakRef<T> implements NbSupplier5<T> {
private final NbSupplier5<? extends T> objFactory;
private final AtomicReference<WeakReference<T>> defaultRefRef;

public ConstructableWeakRef(NbSupplier5<? extends T> objFactory) {
if (objFactory == null) throw new NullPointerException("objFactory");
this.objFactory = objFactory;
this.defaultRefRef = new AtomicReference<WeakReference<T>>();
}

public T get() {
while (true) {
WeakReference<T> defaultRef = defaultRefRef.get();
T defaultCache = defaultRef != null ? defaultRef.get() : null;

if (defaultCache == null) {
defaultCache = objFactory.get();
if (!defaultRefRef.compareAndSet(defaultRef, new WeakReference<T>(defaultCache))) {
continue;
}
}
return defaultCache;
}
}
}
@@ -0,0 +1,5 @@
package org.netbeans.gradle.model.util;

public interface NbSupplier5<ResultType> {
public ResultType get();
}
@@ -1,30 +1,16 @@
package org.netbeans.gradle.model.util;

import java.io.File;
import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicReference;

public final class SerializationCaches {
private static final AtomicReference<WeakReference<SerializationCache>> DEFAULT_REF_REF
= new AtomicReference<WeakReference<SerializationCache>>();

public static SerializationCache getDefault() {
while (true) {
WeakReference<SerializationCache> defaultRef = DEFAULT_REF_REF.get();
SerializationCache defaultCache = defaultRef != null ? defaultRef.get() : null;

if (defaultCache == null) {
defaultCache = createDefault();
if (!DEFAULT_REF_REF.compareAndSet(defaultRef, new WeakReference<SerializationCache>(defaultCache))) {
continue;
}
}
return defaultCache;
private static final NbSupplier5<SerializationCache> DEFAULT_REF = new ConstructableWeakRef<SerializationCache>(new NbSupplier5<SerializationCache>() {
public SerializationCache get() {
return new SharedTypesSerializationCache(File.class);
}
}
});

private static SerializationCache createDefault() {
return new SharedTypesSerializationCache(File.class);
public static SerializationCache getDefault() {
return DEFAULT_REF.get();
}

private SerializationCaches() {
Expand Down
@@ -1,5 +1,8 @@
package org.netbeans.gradle.project.util;

public interface NbSupplier<ResultType> {
import org.netbeans.gradle.model.util.NbSupplier5;

public interface NbSupplier<ResultType> extends NbSupplier5<ResultType> {
@Override
public ResultType get();
}
@@ -1,16 +1,21 @@
package org.netbeans.gradle.project.util;

import java.io.File;
import java.lang.ref.WeakReference;
import java.net.URL;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReference;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.gradle.model.util.ConstructableWeakRef;
import org.netbeans.gradle.model.util.NbSupplier5;
import org.openide.filesystems.FileUtil;

public final class UrlFactory {
private static final AtomicReference<WeakReference<UrlFactory>> DEFAULT_REF_REF = new AtomicReference<>();
private static final NbSupplier5<UrlFactory> DEFAULT_REF = new ConstructableWeakRef<>(new NbSupplier5<UrlFactory>() {
@Override
public UrlFactory get() {
return new UrlFactory();
}
});

private final NbFunction<? super File, ? extends URL> urlCreator;
private final ConcurrentMap<File, URL> cache;
Expand All @@ -36,22 +41,7 @@ public static URL urlForArchiveOrDir(File entry) {
}

public static UrlFactory getDefaultArchiveOrDirFactory() {
while (true) {
WeakReference<UrlFactory> defaultRef = DEFAULT_REF_REF.get();
UrlFactory defaultFactory = defaultRef != null ? defaultRef.get() : null;

if (defaultFactory == null) {
defaultFactory = createDefault();
if (!DEFAULT_REF_REF.compareAndSet(defaultRef, new WeakReference<>(defaultFactory))) {
continue;
}
}
return defaultFactory;
}
}

private static UrlFactory createDefault() {
return new UrlFactory();
return DEFAULT_REF.get();
}

public URL toUrl(File entry) {
Expand Down

0 comments on commit 250035b

Please sign in to comment.