From a4af6ac78ae526f2ba851832c78c17caee8075fb Mon Sep 17 00:00:00 2001 From: deadwood Date: Sun, 18 May 2014 18:19:03 +0000 Subject: [PATCH] kernel.resource: TLSF - use pool requirements, not first header flags to grow the pool Example: requirement MEMF_ANY, first header MEMF_FAST - previous code required that the pool can only grow with MEMF_FAST memory. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@49016 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- rom/kernel/tlsf.c | 9 ++++++--- rom/kernel/tlsf.h | 1 - 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/rom/kernel/tlsf.c b/rom/kernel/tlsf.c index 1c0e08e3e7..83318d122e 100644 --- a/rom/kernel/tlsf.c +++ b/rom/kernel/tlsf.c @@ -99,6 +99,7 @@ typedef struct { ULONG slbitmap[REAL_FLI]; IPTR autogrow_puddle_size; + ULONG autogrow_requirements; APTR autogrow_data; autogrow_get autogrow_get_fn; autogrow_release autogrow_release_fn; @@ -972,7 +973,7 @@ void * tlsf_init(struct MemHeaderExt * mhe) return tlsf; } -void * tlsf_init_autogrow(struct MemHeaderExt * mhe, IPTR puddle_size, autogrow_get grow_function, autogrow_release release_function, APTR autogrow_data) +static void * tlsf_init_autogrow(struct MemHeaderExt * mhe, IPTR puddle_size, ULONG requirements, autogrow_get grow_function, autogrow_release release_function, APTR autogrow_data) { tlsf_t *tlsf = tlsf_init(mhe); @@ -982,6 +983,7 @@ void * tlsf_init_autogrow(struct MemHeaderExt * mhe, IPTR puddle_size, autogrow_ puddle_size = 4096; tlsf->autogrow_puddle_size = puddle_size; + tlsf->autogrow_requirements = requirements; tlsf->autogrow_data = autogrow_data; tlsf->autogrow_get_fn = grow_function; tlsf->autogrow_release_fn = release_function; @@ -1108,10 +1110,11 @@ static void destroy_Pool(struct MemHeaderExt *mhe) static APTR fetch_more_ram(void * data, IPTR *size) { struct MemHeaderExt *mhe = (struct MemHeaderExt *)data; + tlsf_t *tlsf = (tlsf_t *)mhe->mhe_UserData; D(nbug("[TLSF] fetch_more_ram(%p, %d)\n", mhe, *size)); - APTR ptr = AllocMem(*size, mhe->mhe_MemHeader.mh_Attributes); + APTR ptr = AllocMem(*size, tlsf->autogrow_requirements); return ptr; } @@ -1124,7 +1127,7 @@ static VOID release_ram(void * data, APTR ptr, IPTR size) static void * init_Pool(struct MemHeaderExt *mhe, IPTR puddleSize, IPTR initialSize) { - return tlsf_init_autogrow(mhe, puddleSize, fetch_more_ram, release_ram, mhe); + return tlsf_init_autogrow(mhe, puddleSize, (ULONG)mhe->mhe_MemHeader.mh_First, fetch_more_ram, release_ram, mhe); } void krnCreateTLSFMemHeader(CONST_STRPTR name, BYTE pri, APTR start, IPTR size, ULONG flags) diff --git a/rom/kernel/tlsf.h b/rom/kernel/tlsf.h index d9fc50e201..ebc3d767e5 100644 --- a/rom/kernel/tlsf.h +++ b/rom/kernel/tlsf.h @@ -14,7 +14,6 @@ typedef VOID (*autogrow_release)(APTR, APTR, IPTR); /* Initialization and memory management */ APTR tlsf_init(struct MemHeaderExt * mhe); -APTR tlsf_init_autogrow(struct MemHeaderExt * mhe, IPTR puddle_size, autogrow_get grow_function, autogrow_release release_function, APTR autogrow_data); VOID tlsf_destroy(struct MemHeaderExt * mhe); VOID tlsf_add_memory(struct MemHeaderExt * mhe, APTR memory, IPTR size); VOID tlsf_add_memory_and_merge(struct MemHeaderExt * mhe, APTR memory, IPTR size); -- 2.11.4.GIT