MCPcopy Create free account
hub / github.com/antlr/codebuff / LocalCache

Method LocalCache

output/java_guava/1.4.13/LocalCache.java:242–304  ·  view source on GitHub ↗

Creates a new, empty map with the specified strategy, initial capacity and concurrency level.

(CacheBuilder<? super K, ? super V> builder, @Nullable CacheLoader<? super K, V> loader)

Source from the content-addressed store, hash-verified

240 */
241
242 LocalCache(CacheBuilder<? super K, ? super V> builder, @Nullable CacheLoader<? super K, V> loader) {
243 concurrencyLevel = Math.min(builder.getConcurrencyLevel(), MAX_SEGMENTS);
244 keyStrength = builder.getKeyStrength();
245 valueStrength = builder.getValueStrength();
246 keyEquivalence = builder.getKeyEquivalence();
247 valueEquivalence = builder.getValueEquivalence();
248 maxWeight = builder.getMaximumWeight();
249 weigher = builder.getWeigher();
250 expireAfterAccessNanos = builder.getExpireAfterAccessNanos();
251 expireAfterWriteNanos = builder.getExpireAfterWriteNanos();
252 refreshNanos = builder.getRefreshNanos();
253 removalListener = builder.getRemovalListener();
254 removalNotificationQueue = (removalListener == NullListener.INSTANCE)
255 ? LocalCache.<RemovalNotification<K, V>>discardingQueue()
256 : new ConcurrentLinkedQueue<RemovalNotification<K, V>>();
257 ticker = builder.getTicker(recordsTime());
258 entryFactory = EntryFactory.getFactory(keyStrength, usesAccessEntries(), usesWriteEntries());
259 globalStatsCounter = builder.getStatsCounterSupplier().get();
260 defaultLoader = loader;
261 int initialCapacity = Math.min(builder.getInitialCapacity(), MAXIMUM_CAPACITY);
262 if (evictsBySize() && !customWeigher()) {
263 initialCapacity = Math.min(initialCapacity, (int) maxWeight);
264 }
265
266 // Find the lowest power-of-two segmentCount that exceeds concurrencyLevel, unless
267 // maximumSize/Weight is specified in which case ensure that each segment gets at least 10
268 // entries. The special casing for size-based eviction is only necessary because that eviction
269 // happens per segment instead of globally, so too many segments compared to the maximum size
270 // will result in random eviction behavior.
271 int segmentShift = 0;
272 int segmentCount = 1;
273 while (segmentCount < concurrencyLevel
274 && (!evictsBySize() || segmentCount * 20 <= maxWeight)) {
275 ++segmentShift;
276 segmentCount <<= 1;
277 }
278 this.segmentShift = 32 - segmentShift;
279 segmentMask = segmentCount - 1;
280 this.segments = newSegmentArray(segmentCount);
281 int segmentCapacity = initialCapacity / segmentCount;
282 if (segmentCapacity * segmentCount < initialCapacity) {
283 ++segmentCapacity;
284 }
285 int segmentSize = 1;
286 while (segmentSize < segmentCapacity) {
287 segmentSize <<= 1;
288 }
289 if (evictsBySize()) {
290 // Ensure sum of segment max weights = overall max weights
291 long maxSegmentWeight = maxWeight / segmentCount + 1;
292 long remainder = maxWeight % segmentCount;
293 for (int i = 0; i < this.segments.length; ++i) {
294 if (i == remainder) {
295 maxSegmentWeight--;
296 }
297 this.segments[i] = createSegment(segmentSize, maxSegmentWeight, builder.getStatsCounterSupplier().get());
298 }
299 } else {

Callers

nothing calls this directly

Calls 15

discardingQueueMethod · 0.95
recordsTimeMethod · 0.95
getFactoryMethod · 0.95
usesAccessEntriesMethod · 0.95
usesWriteEntriesMethod · 0.95
evictsBySizeMethod · 0.95
customWeigherMethod · 0.95
newSegmentArrayMethod · 0.95
createSegmentMethod · 0.95
getMethod · 0.65
minMethod · 0.45
getConcurrencyLevelMethod · 0.45

Tested by

no test coverage detected