1
0
Fork 0
forked from len0rd/rockbox

chunk_alloc

chunk_alloc allows arrays (or any data) to be allocated in smaller chunks

you have to save the indices..
 variable data will have variable indices you need to
 store these as [chunk_alloc] doesn't keep track
 if you have a fixed size for each
 alloc you can do indice / sizeof(data)
 or index * sizeof(data) to convert

Lots of debug stuff still in and it needs optimization

User provides chunk_size and max_chunks
max_chunks * struct chunk will be allocated at start
with (1) chunk_size allocation initially

alloc_chunk() with size = 0 shrinks the last allocation to the size of the data used

add OOM checks on buflib_alloc -- oops

move bytes available to the header -- less memory per chunk & better alignment
keep track of the current in use chunk index -- should speed things up a bit

Now allows:
realloc chunk header
larger allocations than chunk size

reallocs smaller than existing will shrink the current array
rather than alloc a new and copy data

Comments welcome :)

Change-Id: I8ed170eef73da95da19430a80b32e5debf0c8276
This commit is contained in:
William Wilgus 2023-01-08 01:42:27 -05:00 committed by William Wilgus
parent a513cee822
commit 7faf6be35f
4 changed files with 377 additions and 0 deletions

View file

@ -5,6 +5,7 @@
#include <stdbool.h>
#include "config.h"
#include "buflib.h"
#include "chunk_alloc.h"
/* All functions below are wrappers for functions in buflib.h, except
* they have a predefined context
@ -43,4 +44,11 @@ static inline void* core_get_data(int handle)
return buflib_get_data(&core_ctx, handle);
}
/* core context chunk_alloc */
static inline bool core_chunk_alloc_init(struct chunk_alloc_header *hdr,
size_t chunk_size, size_t max_chunks)
{
extern struct buflib_context core_ctx;
return chunk_alloc_init(hdr, &core_ctx, chunk_size, max_chunks);
}
#endif /* __CORE_ALLOC_H__ */