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

Method LocalCache

corpus/java/training/guava/cache/LocalCache.java:235–310  ·  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

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

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