From 4478b25ede0129b1572145737627db7297dcc89f Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Wed, 5 Oct 2011 18:32:19 +0000 Subject: [PATCH] core_alloc: Provide a tiny test allocation, which can be freed for debug purposes. This allocation can be freed in the buflib debug menu (select it to free). Doing a another allocation, e.g. by selecting another item in this debug menu will cause compaction (all allocs move). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30719 a1c6a512-1295-4272-9138-f99709370657 --- apps/debug_menu.c | 23 +++++++++++++++-------- firmware/core_alloc.c | 14 ++++++++++++++ firmware/include/core_alloc.h | 4 ++++ 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/apps/debug_menu.c b/apps/debug_menu.c index 7c2e6c7870..e96b8c553f 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c @@ -429,14 +429,21 @@ static int bf_action_cb(int action, struct gui_synclist* list) { if (action == ACTION_STD_OK) { - splash(HZ/1, "Attempting a 64k allocation"); - int handle = core_alloc("test", 64<<10); - splash(HZ/2, (handle > 0) ? "Success":"Fail"); - /* for some reason simplelist doesn't allow adding items here if - * info.get_name is given, so use normal list api */ - gui_synclist_set_nb_items(list, core_get_num_blocks()); - if (handle > 0) - core_free(handle); + if (gui_synclist_get_sel_pos(list) == 0 && core_test_free()) + { + splash(HZ, "Freed test handle. New alloc should trigger compact"); + } + else + { + splash(HZ/1, "Attempting a 64k allocation"); + int handle = core_alloc("test", 64<<10); + splash(HZ/2, (handle > 0) ? "Success":"Fail"); + /* for some reason simplelist doesn't allow adding items here if + * info.get_name is given, so use normal list api */ + gui_synclist_set_nb_items(list, core_get_num_blocks()); + if (handle > 0) + core_free(handle); + } action = ACTION_REDRAW; } else if (action == ACTION_NONE) diff --git a/firmware/core_alloc.c b/firmware/core_alloc.c index 2250f5c664..21dd1319dd 100644 --- a/firmware/core_alloc.c +++ b/firmware/core_alloc.c @@ -6,6 +6,9 @@ /* not static so it can be discovered by core_get_data() */ struct buflib_context core_ctx; + +/* debug test alloc */ +static int test_alloc; void core_allocator_init(void) { buffer_init(); @@ -13,6 +16,17 @@ void core_allocator_init(void) void *start = buffer_get_buffer(&size); buflib_init(&core_ctx, start, size); buffer_release_buffer(size); + + test_alloc = core_alloc("test", 112); +} + +bool core_test_free(void) +{ + bool ret = test_alloc > 0; + if (ret) + test_alloc = core_free(test_alloc); + + return ret; } int core_alloc(const char* name, size_t size) diff --git a/firmware/include/core_alloc.h b/firmware/include/core_alloc.h index b2edec5377..0ac7e5b73d 100644 --- a/firmware/include/core_alloc.h +++ b/firmware/include/core_alloc.h @@ -28,6 +28,10 @@ int core_get_num_blocks(void); void core_print_block_at(int block_num, char* buf, size_t bufsize); #endif +/* frees the debug test alloc created at initialization, + * since this is the first any further alloc should force a compaction run */ +bool core_test_free(void); + static inline void* core_get_data(int handle) { extern struct buflib_context core_ctx;