Replaced glib memory allocation
This commit is contained in:
parent
6101b8c43a
commit
d5729efa1f
33 changed files with 414 additions and 166 deletions
|
|
@ -15,11 +15,13 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <glib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "allocator.h"
|
||||
#include "hammer.h"
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
struct arena_link {
|
||||
// TODO:
|
||||
|
|
@ -36,22 +38,25 @@ struct arena_link {
|
|||
|
||||
struct HArena_ {
|
||||
struct arena_link *head;
|
||||
struct HAllocator_ *mm__;
|
||||
size_t block_size;
|
||||
size_t used;
|
||||
size_t wasted;
|
||||
};
|
||||
|
||||
HArena *h_new_arena(size_t block_size) {
|
||||
HArena *h_new_arena(HAllocator* mm__, size_t block_size) {
|
||||
if (block_size == 0)
|
||||
block_size = 4096;
|
||||
struct HArena_ *ret = g_new(struct HArena_, 1);
|
||||
struct arena_link *link = (struct arena_link*)g_malloc0(sizeof(struct arena_link) + block_size);
|
||||
struct HArena_ *ret = h_new(struct HArena_, 1);
|
||||
struct arena_link *link = (struct arena_link*)mm__->alloc(mm__, sizeof(struct arena_link) + block_size);
|
||||
memset(link, 0, sizeof(struct arena_link) + block_size);
|
||||
link->free = block_size;
|
||||
link->used = 0;
|
||||
link->next = NULL;
|
||||
ret->head = link;
|
||||
ret->block_size = block_size;
|
||||
ret->used = 0;
|
||||
ret->mm__ = mm__;
|
||||
ret->wasted = sizeof(struct arena_link) + sizeof(struct HArena_) + block_size;
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -70,13 +75,15 @@ void* h_arena_malloc(HArena *arena, size_t size) {
|
|||
// This involves some annoying casting...
|
||||
arena->used += size;
|
||||
arena->wasted += sizeof(struct arena_link*);
|
||||
void* link = g_malloc(size + sizeof(struct arena_link*));
|
||||
void* link = arena->mm__->alloc(arena->mm__, size + sizeof(struct arena_link*));
|
||||
memset(link, 0, size + sizeof(struct arena_link*));
|
||||
*(struct arena_link**)link = arena->head->next;
|
||||
arena->head->next = (struct arena_link*)link;
|
||||
return (void*)(((uint8_t*)link) + sizeof(struct arena_link*));
|
||||
} else {
|
||||
// we just need to allocate an ordinary new block.
|
||||
struct arena_link *link = (struct arena_link*)g_malloc0(sizeof(struct arena_link) + arena->block_size);
|
||||
struct arena_link *link = (struct arena_link*)arena->mm__->alloc(arena->mm__, sizeof(struct arena_link) + arena->block_size);
|
||||
memset(link, 0, sizeof(struct arena_link) + arena->block_size);
|
||||
link->free = arena->block_size - size;
|
||||
link->used = size;
|
||||
link->next = arena->head;
|
||||
|
|
@ -92,16 +99,17 @@ void h_arena_free(HArena *arena, void* ptr) {
|
|||
}
|
||||
|
||||
void h_delete_arena(HArena *arena) {
|
||||
HAllocator *mm__ = arena->mm__;
|
||||
struct arena_link *link = arena->head;
|
||||
while (link) {
|
||||
struct arena_link *next = link->next;
|
||||
// Even in the case of a special block, without the full arena
|
||||
// header, this is correct, because the next pointer is the first
|
||||
// in the structure.
|
||||
g_free(link);
|
||||
h_free(link);
|
||||
link = next;
|
||||
}
|
||||
g_free(arena);
|
||||
h_free(arena);
|
||||
}
|
||||
|
||||
void h_allocator_stats(HArena *arena, HArenaStats *stats) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue