From 787a55874b9e7f38580365f355c38ba10004ee43 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Fri, 8 Apr 2016 11:56:32 +0200 Subject: [PATCH] Cleanup PoolChunk and PoolArena Motivation: To make it easier to understand PoolChunk and PoolArena we should cleanup duplicated code. Modifications: - Move reused code into methods - Use Math.max(...) Result: Cleaner code and easier to understand. --- .../main/java/io/netty/buffer/PoolArena.java | 15 ++++++------ .../main/java/io/netty/buffer/PoolChunk.java | 24 +++++++++++++------ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/buffer/src/main/java/io/netty/buffer/PoolArena.java b/buffer/src/main/java/io/netty/buffer/PoolArena.java index c9e01b2a12..84a2557c0e 100644 --- a/buffer/src/main/java/io/netty/buffer/PoolArena.java +++ b/buffer/src/main/java/io/netty/buffer/PoolArena.java @@ -26,6 +26,8 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import static java.lang.Math.max; + abstract class PoolArena implements PoolArenaMetric { static final boolean HAS_UNSAFE = PlatformDependent.hasUnsafe(); @@ -506,19 +508,17 @@ abstract class PoolArena implements PoolArenaMetric { synchronized (this) { val += allocationsNormal - (deallocationsTiny + deallocationsSmall + deallocationsNormal); } - return val >= 0 ? val : 0; + return max(val, 0); } @Override public long numActiveTinyAllocations() { - long val = numTinyAllocations() - numTinyDeallocations(); - return val >= 0 ? val : 0; + return max(numTinyAllocations() - numTinyDeallocations(), 0); } @Override public long numActiveSmallAllocations() { - long val = numSmallAllocations() - numSmallDeallocations(); - return val >= 0 ? val : 0; + return max(numSmallAllocations() - numSmallDeallocations(), 0); } @Override @@ -527,13 +527,12 @@ abstract class PoolArena implements PoolArenaMetric { synchronized (this) { val = allocationsNormal - deallocationsNormal; } - return val >= 0 ? val : 0; + return max(val, 0); } @Override public long numActiveHugeAllocations() { - long val = numHugeAllocations() - numHugeDeallocations(); - return val >= 0 ? val : 0; + return max(numHugeAllocations() - numHugeDeallocations(), 0); } protected abstract PoolChunk newChunk(int pageSize, int maxOrder, int pageShifts, int chunkSize); diff --git a/buffer/src/main/java/io/netty/buffer/PoolChunk.java b/buffer/src/main/java/io/netty/buffer/PoolChunk.java index 46af3d4e67..18dfd77078 100644 --- a/buffer/src/main/java/io/netty/buffer/PoolChunk.java +++ b/buffer/src/main/java/io/netty/buffer/PoolChunk.java @@ -102,6 +102,8 @@ package io.netty.buffer; */ final class PoolChunk implements PoolChunkMetric { + private static final int INTEGER_SIZE_MINUS_ONE = Integer.SIZE - 1; + final PoolArena arena; final T memory; final boolean unpooled; @@ -342,8 +344,8 @@ final class PoolChunk implements PoolChunkMetric { * @param handle handle to free */ void free(long handle) { - int memoryMapIdx = (int) handle; - int bitmapIdx = (int) (handle >>> Integer.SIZE); + int memoryMapIdx = memoryMapIdx(handle); + int bitmapIdx = bitmapIdx(handle); if (bitmapIdx != 0) { // free a subpage PoolSubpage subpage = subpages[subpageIdx(memoryMapIdx)]; @@ -364,8 +366,8 @@ final class PoolChunk implements PoolChunkMetric { } void initBuf(PooledByteBuf buf, long handle, int reqCapacity) { - int memoryMapIdx = (int) handle; - int bitmapIdx = (int) (handle >>> Integer.SIZE); + int memoryMapIdx = memoryMapIdx(handle); + int bitmapIdx = bitmapIdx(handle); if (bitmapIdx == 0) { byte val = value(memoryMapIdx); assert val == unusable : String.valueOf(val); @@ -377,13 +379,13 @@ final class PoolChunk implements PoolChunkMetric { } void initBufWithSubpage(PooledByteBuf buf, long handle, int reqCapacity) { - initBufWithSubpage(buf, handle, (int) (handle >>> Integer.SIZE), reqCapacity); + initBufWithSubpage(buf, handle, bitmapIdx(handle), reqCapacity); } private void initBufWithSubpage(PooledByteBuf buf, long handle, int bitmapIdx, int reqCapacity) { assert bitmapIdx != 0; - int memoryMapIdx = (int) handle; + int memoryMapIdx = memoryMapIdx(handle); PoolSubpage subpage = subpages[subpageIdx(memoryMapIdx)]; assert subpage.doNotDestroy; @@ -409,7 +411,7 @@ final class PoolChunk implements PoolChunkMetric { private static int log2(int val) { // compute the (0-based, with lsb = 0) position of highest set bit i.e, log2 - return Integer.SIZE - 1 - Integer.numberOfLeadingZeros(val); + return INTEGER_SIZE_MINUS_ONE - Integer.numberOfLeadingZeros(val); } private int runLength(int id) { @@ -427,6 +429,14 @@ final class PoolChunk implements PoolChunkMetric { return memoryMapIdx ^ maxSubpageAllocs; // remove highest set bit, to get offset } + private static int memoryMapIdx(long handle) { + return (int) handle; + } + + private static int bitmapIdx(long handle) { + return (int) (handle >>> Integer.SIZE); + } + @Override public int chunkSize() { return chunkSize;