From cd7724351e009fd5ec0d7209502a3f1b20378e28 Mon Sep 17 00:00:00 2001 From: deadwood Date: Sun, 31 Mar 2013 15:36:58 +0000 Subject: [PATCH] exec.library: look for best candidates downwards from direct match index git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@47122 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- rom/exec/memory.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/rom/exec/memory.c b/rom/exec/memory.c index e0f89bfec6..164d12ef5b 100644 --- a/rom/exec/memory.c +++ b/rom/exec/memory.c @@ -222,6 +222,18 @@ void mhac_MemChunkClaimed(struct MemChunk * mc, struct MemHeaderAllocatorCtx * m } } +static LONG mhac_CalcIndex(LONG size, ULONG indexsize) +{ + LONG r = 0; + size >>= FIRSTPOTBIT; + while (size >>= 1) + r++; + + if (r > indexsize - 1) r = indexsize - 1; + + return r; +} + void mhac_MemChunkCreated(struct MemChunk * mc, struct MemChunk *mcprev, struct MemHeaderAllocatorCtx * mhac) { LONG i, v = FIRSTPOT; @@ -244,7 +256,6 @@ void mhac_MemChunkCreated(struct MemChunk * mc, struct MemChunk *mcprev, struct mhac->mhac_PrevChunks[i] = mcprev; } } - } /* General idea: @@ -263,15 +274,21 @@ struct MemChunk * mhac_GetBetterPrevMemChunk(struct MemChunk * prev, IPTR size, if (mhac) { - LONG i, v = FIRSTPOT; + LONG i; + LONG ii = mhac_CalcIndex(size, mhac->mhac_IndexSize); - for (i = 0; i < mhac->mhac_IndexSize; i++, v = v << POTSTEP) + if (mhac->mhac_PrevChunks[ii] != NULL) + _return = mhac->mhac_PrevChunks[ii]; + else { - if (size < v) - return _return; /* This index is bigger than requester size */ - - if (mhac->mhac_PrevChunks[i] != NULL) - _return = mhac->mhac_PrevChunks[i]; + for (i = ii - 1; i >= 0; i--) + { + if (mhac->mhac_PrevChunks[i] != NULL) + { + _return = mhac->mhac_PrevChunks[i]; + break; + } + } } } -- 2.11.4.GIT