From 858de5699baacfa0de0810cf8da631f83d6f3e87 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Mon, 22 Sep 2014 10:56:17 +0200 Subject: [PATCH] [#2924] Correctly update head in MemoryRegionCache.trim() Motivation: When MemoryRegionCache.trim() is called, some unused cache entries will be freed (started from head). However, in MeoryRegionCache.trim() the head is not updated, which make entry list's head point to an entry whose chunk is null now and following allocate of MeoryRegionCache will return false immediately. In other word, cache is no longer usable once trim happen. Modifications: Update head to correct idx after free entries in trim(). Result: MemoryRegionCache behaves correctly even after calling trim(). --- buffer/src/main/java/io/netty/buffer/PoolThreadCache.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/buffer/src/main/java/io/netty/buffer/PoolThreadCache.java b/buffer/src/main/java/io/netty/buffer/PoolThreadCache.java index 37eea127c2..4eb0daf346 100644 --- a/buffer/src/main/java/io/netty/buffer/PoolThreadCache.java +++ b/buffer/src/main/java/io/netty/buffer/PoolThreadCache.java @@ -445,10 +445,14 @@ final class PoolThreadCache { for (; free > 0; free--) { if (!freeEntry(entries[i])) { // all freed - return; + break; } i = nextIdx(i); } + + // Update head to point to te correct entry + // See https://github.com/netty/netty/issues/2924 + head = i; } @SuppressWarnings({ "unchecked", "rawtypes" })