/*
* Javolution - Java(TM) Solution for Real-Time and Embedded Systems
* Copyright (C) 2012 - Javolution (http://javolution.org/)
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software is
* freely granted, provided that this notice is preserved.
*/
package javolution.util.internal.map;
import java.util.Iterator;
import javolution.context.ConcurrentContext;
import javolution.util.function.Consumer;
import javolution.util.function.Equality;
import javolution.util.service.MapService;
/**
* A parallel view over a map.
*/
public class ParallelMapImpl<K, V> extends MapView<K, V> {
private static final long serialVersionUID = 0x600L; // Version.
public ParallelMapImpl(MapService<K, V> target) {
super(target);
}
@Override
public void clear() {
target().clear();
}
@Override
public boolean containsKey(Object key) {
return target().containsKey(key);
}
@Override
public V get(Object key) {
return target().get(key);
}
@Override
public boolean isEmpty() {
return target().isEmpty();
}
@Override
public Iterator<java.util.Map.Entry<K, V>> iterator() {
return target().iterator();
}
@Override
public Equality<? super K> keyComparator() {
return target().keyComparator();
}
@Override
public void perform(final Consumer<MapService<K, V>> action,
MapService<K, V> view) {
ConcurrentContext ctx = ConcurrentContext.enter();
try {
int concurrency = ctx.getConcurrency();
MapService<K, V>[] subViews = view.split(concurrency + 1, false);
for (int i = 1; i < subViews.length; i++) {
final MapService<K, V> subView = subViews[i];
ctx.execute(new Runnable() {
@Override
public void run() {
target().perform(action, subView);
}
});
}
target().perform(action, subViews[0]); // This thread works too !
} finally {
// Any exception raised during parallel iterations will be re-raised here.
ctx.exit();
}
}
@Override
public V put(K key, V value) {
return target().put(key, value);
}
@Override
public V remove(Object key) {
return target().remove(key);
}
@Override
public int size() {
return target().size();
}
@Override
public void update(final Consumer<MapService<K, V>> action,
MapService<K, V> view) {
ConcurrentContext ctx = ConcurrentContext.enter();
try {
int concurrency = ctx.getConcurrency();
MapService<K, V>[] subViews = view.split(concurrency + 1, true);
for (int i = 1; i < subViews.length; i++) {
final MapService<K, V> subView = subViews[i];
ctx.execute(new Runnable() {
@Override
public void run() {
target().update(action, subView);
}
});
}
target().perform(action, subViews[0]); // This thread works too !
} finally {
// Any exception raised during parallel iterations will be re-raised here.
ctx.exit();
}
}
@Override
public Equality<? super V> valueComparator() {
return target().valueComparator();
}
@Override
public MapService<K, V>[] split(int n, boolean threadsafe) {
return target().split(n, threadsafe); // Forwards.
}
}