static void close(final OffHeapStore<?, ?> resource) { EhcacheConcurrentOffHeapClockCache<?, ?> localMap = resource.map; if (localMap != null) { resource.map = null; localMap.destroy(); } }
@Override public long nextIdFor(final K key) { return counters[getIndexFor(key.hashCode())].getAndIncrement(); } }
@Override protected int getMetadata(String key, int mask, EhcacheOffHeapBackingMap<String, String> segment) { return ((EhcacheConcurrentOffHeapClockCache<String, String>) segment).getMetadata(key, mask); } }
private EhcacheConcurrentOffHeapClockCache<K, OffHeapValueHolder<V>> createBackingMap(long size, Serializer<K> keySerializer, Serializer<V> valueSerializer, SwitchableEvictionAdvisor<K, OffHeapValueHolder<V>> evictionAdvisor) { HeuristicConfiguration config = new HeuristicConfiguration(size); PageSource source = new UpfrontAllocatingPageSource(getBufferSource(), config.getMaximumSize(), config.getMaximumChunkSize(), config.getMinimumChunkSize()); Portability<K> keyPortability = new SerializerPortability<>(keySerializer); Portability<OffHeapValueHolder<V>> elementPortability = new OffHeapValueHolderPortability<>(valueSerializer); Factory<OffHeapBufferStorageEngine<K, OffHeapValueHolder<V>>> storageEngineFactory = OffHeapBufferStorageEngine.createFactory(PointerSize.INT, source, config .getSegmentDataPageSize(), keyPortability, elementPortability, false, true); Factory<? extends PinnableSegment<K, OffHeapValueHolder<V>>> segmentFactory = new EhcacheSegmentFactory<>( source, storageEngineFactory, config.getInitialSegmentTableSize(), evictionAdvisor, mapEvictionListener); return new EhcacheConcurrentOffHeapClockCache<>(evictionAdvisor, segmentFactory, config.getConcurrency()); }
@Override public boolean computeIfPinned(final K key, final BiFunction<K,V,V> remappingFunction, final Function<V,Boolean> unpinFunction) { final AtomicBoolean unpin = new AtomicBoolean(); computeIfPresentWithMetadata(key, (k, current) -> { if ((current.metadata() & Metadata.PINNED) != 0) { V oldValue = current.value(); V newValue = remappingFunction.apply(k, oldValue); Boolean unpinLocal = unpinFunction.apply(oldValue); if (newValue == null) { unpin.set(true); return null; } else if (oldValue == newValue) { unpin.set(unpinLocal); return metadataTuple(oldValue, current.metadata() & (unpinLocal ? ~Metadata.PINNED : -1)); } else { unpin.set(false); return metadataTuple(newValue, (evictionAdvisor.adviseAgainstEviction(k, newValue) ? ADVISED_AGAINST_EVICTION : 0)); } } else { return current; } }); return unpin.get(); }
@Override public V compute(K key, final BiFunction<K, V, V> mappingFunction, final boolean pin) { MetadataTuple<V> result = computeWithMetadata(key, (k, current) -> { V oldValue = current == null ? null : current.value(); V newValue = mappingFunction.apply(k, oldValue); if (newValue == null) { return null; } else if (oldValue == newValue) { return metadataTuple(newValue, (pin ? PINNED : 0) | current.metadata()); } else { return metadataTuple(newValue, (pin ? PINNED : 0) | (evictionAdvisor.adviseAgainstEviction(k, newValue) ? ADVISED_AGAINST_EVICTION : 0)); } }); return result == null ? null : result.value(); }
@Override protected void putPinned(String key, String value, EhcacheOffHeapBackingMap<String, String> segment) { ((EhcacheConcurrentOffHeapClockCache<String, String>) segment).putPinned(key, value); }
@Override protected boolean isPinned(String key, EhcacheOffHeapBackingMap<String, String> segment) { return ((EhcacheConcurrentOffHeapClockCache<String, String>) segment).isPinned(key); }
return new EhcacheConcurrentOffHeapClockCache<>(evictionPredicate, segmentFactory, 1); } catch (UnsupportedTypeException e) { throw new AssertionError(e);
@Override public V computeIfPresent(K key, final BiFunction<? super K, ? super V, ? extends V> mappingFunction) { MetadataTuple<V> result = computeIfPresentWithMetadata(key, (k, current) -> { V oldValue = current.value(); V newValue = mappingFunction.apply(k, oldValue); if (newValue == null) { return null; } else if (oldValue == newValue) { return current; } else { return metadataTuple(newValue, (evictionAdvisor.adviseAgainstEviction(k, newValue) ? ADVISED_AGAINST_EVICTION : 0)); } }); return result == null ? null : result.value(); }
@Override public V compute(K key, final BiFunction<K, V, V> mappingFunction, final boolean pin) { MetadataTuple<V> result = computeWithMetadata(key, (k, current) -> { V oldValue = current == null ? null : current.value(); V newValue = mappingFunction.apply(k, oldValue); if (newValue == null) { return null; } else if (oldValue == newValue) { return metadataTuple(newValue, (pin ? PINNED : 0) | current.metadata()); } else { return metadataTuple(newValue, (pin ? PINNED : 0) | (evictionAdvisor.adviseAgainstEviction(k, newValue) ? ADVISED_AGAINST_EVICTION : 0)); } }); return result == null ? null : result.value(); }
@Override protected void destroySegment(EhcacheOffHeapBackingMap<String, String> segment) { ((EhcacheConcurrentOffHeapClockCache<String, String>)segment).destroy(); }
private EhcacheConcurrentOffHeapClockCache<K, OffHeapValueHolder<V>> createBackingMap(long size, Serializer<K> keySerializer, Serializer<V> valueSerializer, SwitchableEvictionAdvisor<K, OffHeapValueHolder<V>> evictionAdvisor) { HeuristicConfiguration config = new HeuristicConfiguration(size); PageSource source = new UpfrontAllocatingPageSource(getBufferSource(), config.getMaximumSize(), config.getMaximumChunkSize(), config.getMinimumChunkSize()); Portability<K> keyPortability = new SerializerPortability<>(keySerializer); Portability<OffHeapValueHolder<V>> elementPortability = new OffHeapValueHolderPortability<>(valueSerializer); Factory<OffHeapBufferStorageEngine<K, OffHeapValueHolder<V>>> storageEngineFactory = OffHeapBufferStorageEngine.createFactory(PointerSize.INT, source, config .getSegmentDataPageSize(), keyPortability, elementPortability, false, true); Factory<? extends PinnableSegment<K, OffHeapValueHolder<V>>> segmentFactory = new EhcacheSegmentFactory<>( source, storageEngineFactory, config.getInitialSegmentTableSize(), evictionAdvisor, mapEvictionListener); return new EhcacheConcurrentOffHeapClockCache<>(evictionAdvisor, segmentFactory, config.getConcurrency()); }
@Override public V computeIfPresentAndPin(final K key, final BiFunction<K, V, V> mappingFunction) { MetadataTuple<V> result = computeIfPresentWithMetadata(key, (k, current) -> { V oldValue = current.value(); V newValue = mappingFunction.apply(k, oldValue); if (newValue == null) { return null; } else if (oldValue == newValue) { return metadataTuple(newValue, PINNED | current.metadata()); } else { return metadataTuple(newValue, PINNED | (evictionAdvisor.adviseAgainstEviction(k, newValue) ? ADVISED_AGAINST_EVICTION : 0)); } }); return result == null ? null : result.value(); }
@Override public long nextIdFor(final K key) { return counters[getIndexFor(key.hashCode())].getAndIncrement(); } }
static void close(final OffHeapStore<?, ?> resource) { EhcacheConcurrentOffHeapClockCache<?, ?> localMap = resource.map; if (localMap != null) { resource.map = null; localMap.destroy(); } }
@Override public boolean computeIfPinned(final K key, final BiFunction<K,V,V> remappingFunction, final Function<V,Boolean> unpinFunction) { final AtomicBoolean unpin = new AtomicBoolean(); computeIfPresentWithMetadata(key, (k, current) -> { if ((current.metadata() & Metadata.PINNED) != 0) { V oldValue = current.value(); V newValue = remappingFunction.apply(k, oldValue); Boolean unpinLocal = unpinFunction.apply(oldValue); if (newValue == null) { unpin.set(true); return null; } else if (oldValue == newValue) { unpin.set(unpinLocal); return metadataTuple(oldValue, current.metadata() & (unpinLocal ? ~Metadata.PINNED : -1)); } else { unpin.set(false); return metadataTuple(newValue, (evictionAdvisor.adviseAgainstEviction(k, newValue) ? ADVISED_AGAINST_EVICTION : 0)); } } else { return current; } }); return unpin.get(); }
@Override public V computeIfPresent(K key, final BiFunction<? super K, ? super V, ? extends V> mappingFunction) { MetadataTuple<V> result = computeIfPresentWithMetadata(key, (k, current) -> { V oldValue = current.value(); V newValue = mappingFunction.apply(k, oldValue); if (newValue == null) { return null; } else if (oldValue == newValue) { return current; } else { return metadataTuple(newValue, (evictionAdvisor.adviseAgainstEviction(k, newValue) ? ADVISED_AGAINST_EVICTION : 0)); } }); return result == null ? null : result.value(); }
@Override public V computeIfPresentAndPin(final K key, final BiFunction<K, V, V> mappingFunction) { MetadataTuple<V> result = computeIfPresentWithMetadata(key, (k, current) -> { V oldValue = current.value(); V newValue = mappingFunction.apply(k, oldValue); if (newValue == null) { return null; } else if (oldValue == newValue) { return metadataTuple(newValue, PINNED | current.metadata()); } else { return metadataTuple(newValue, PINNED | (evictionAdvisor.adviseAgainstEviction(k, newValue) ? ADVISED_AGAINST_EVICTION : 0)); } }); return result == null ? null : result.value(); }