/** * Creates off-heap map based on {@code Unsafe} implementation. * * @param concurrency Concurrency. * @param initCap Initial capacity. * @return Off-heap map. */ public static GridOffHeapMap unsafeMap(int concurrency, long initCap) { return new GridUnsafeMap(concurrency, 0.75f, initCap, 0, (short)0, null); }
/** {@inheritDoc} */ @Override public void destruct() { for (GridUnsafeMap m : partMap) m.destruct(); if (lru != null) lru.destruct(); }
/** {@inheritDoc} */ @Override public boolean eventListener(GridOffHeapEventListener evtLsnr) { if (this.evtLsnr != null) return false; this.evtLsnr = evtLsnr; for (GridUnsafeMap m : partMap) m.eventListener(evtLsnr); mem.listen(evtLsnr); return true; }
/** {@inheritDoc} */ @Override public void enableEviction(int hash, byte[] keyBytes) { assert lru != null; segmentFor(hash).enableEviction(hash, keyBytes); }
@Override public void lruPoll(int size) { if (lru == null) return; int left = size; while (left > 0) { // Pre-poll outside of lock. long qAddr = lru.prePoll(); if (qAddr == 0) return; // LRU is empty. short order = lru.order(qAddr); int released = freeSpace(order, qAddr); if (released == 0) return; left -= released; } } };
init(initCap, size);
/** {@inheritDoc} */ @Override public boolean evictListener(GridOffHeapEvictListener evictLsnr) { if (this.evictLsnr != null) return false; this.evictLsnr = evictLsnr; for (GridUnsafeMap m : partMap) m.evictListener(evictLsnr); return true; }
assertEquals(0, ((GridUnsafeMap)map).lruSize());
/** {@inheritDoc} */ @Override public byte[] get(int hash, byte[] keyBytes) { return segmentFor(hash).get(hash, keyBytes); }
@Override public void lruPoll(int size) { if (lru == null) return; int left = size; while (left > 0) { // Pre-poll outside of lock. long qAddr = lru.prePoll(); if (qAddr == 0) return; // LRU is empty. short order = lru.order(qAddr); int part = lru.partition(order, qAddr); int released = partMap[part].freeSpace(order, qAddr); if (released == 0) return; left -= released; } } }
init(initCap, size);
/** {@inheritDoc} */ @Override public boolean evictListener(GridOffHeapEvictListener evictLsnr) { if (this.evictLsnr != null) return false; this.evictLsnr = evictLsnr; for (GridUnsafeMap m : partMap) m.evictListener(evictLsnr); return true; }
/** {@inheritDoc} */ @Override public boolean contains(int hash, byte[] keyBytes) { return segmentFor(hash).contains(hash, keyBytes); }
/** * Creates off-heap map based on {@code Unsafe} implementation with limited * memory and LRU-based eviction. * * @param initCap Initial capacity. * @param totalMem Total memory. * @param lruStripes Number of LRU stripes. * @return Off-heap map. */ public static GridOffHeapMap unsafeMap(long initCap, long totalMem, short lruStripes) { return new GridUnsafeMap(128, 0.75f, initCap, totalMem, lruStripes, null); }
/** * @param initCap Initial capacity. * @param size Size. */ private void init(long initCap, int size) { long c = initCap / size; if (c < MIN_SIZE) c = MIN_SIZE; if (c * size < initCap) ++c; int cap = 1; while (cap < c) cap <<= 1; for (int i = 0; i < size; i++) { try { segs[i] = new Segment(i, cap); } catch (GridOffHeapOutOfMemoryException e) { destruct(); throw e; } } }
@Override public void lruPoll(int size) { if (lru == null) return; int left = size; while (left > 0) { // Pre-poll outside of lock. long qAddr = lru.prePoll(); if (qAddr == 0) return; // LRU is empty. short order = lru.order(qAddr); int released = freeSpace(order, qAddr); if (released == 0) return; left -= released; } } };
init(initCap, size);
/** {@inheritDoc} */ @Override public boolean eventListener(GridOffHeapEventListener evtLsnr) { if (this.evtLsnr != null) return false; this.evtLsnr = evtLsnr; for (GridUnsafeMap m : partMap) m.eventListener(evtLsnr); mem.listen(evtLsnr); return true; }
/** {@inheritDoc} */ @Override public boolean removex(int hash, byte[] keyBytes) { return segmentFor(hash).removex(hash, keyBytes); }
/** * Creates off-heap map based on {@code Unsafe} implementation with * unlimited memory. * * @param initCap Initial capacity. * @return Off-heap map. */ public static GridOffHeapMap unsafeMap(long initCap) { return new GridUnsafeMap(128, 0.75f, initCap, 0, (short)0, null); }