Initial arena cleanup...
This commit is contained in:
106
library/arena.h
106
library/arena.h
@ -2,53 +2,46 @@
|
||||
#define ARENA_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
typedef struct {
|
||||
char * buffer;
|
||||
size_t count;
|
||||
size_t capacity;
|
||||
} arena_block;
|
||||
|
||||
typedef struct {
|
||||
size_t block_count;
|
||||
size_t block_limit;
|
||||
arena_block * * block_array;
|
||||
} arena_data;
|
||||
|
||||
//~typedef struct {
|
||||
//~char * buffer;
|
||||
//~size_t count;
|
||||
//~size_t capacity;
|
||||
//~} arena_data;
|
||||
|
||||
extern arena_block * arena_init(size_t limit);
|
||||
|
||||
extern void arena_deinit(void);
|
||||
|
||||
extern void * arena_allocate(size_t size);
|
||||
|
||||
//~extern void * arena_deallocate(void * data);
|
||||
|
||||
//~extern void * arena_reallocate(void * data, size_t size);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef ARENA_IMPLEMENTATION
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#ifndef AREA_BLOCK_ALLOCATION_MAX_CHUNK_SIZE
|
||||
#define AREA_BLOCK_ALLOCATION_MAX_CHUNK_SIZE (4096)
|
||||
#endif
|
||||
|
||||
//~typedef struct {
|
||||
//~char * buffer;
|
||||
//~size_t count;
|
||||
//~size_t capacity;
|
||||
//~void * next;
|
||||
//~} arena_block;
|
||||
|
||||
//~typedef struct {
|
||||
//~size_t block_count;
|
||||
//~size_t block_limit;
|
||||
//~arena_block * * block_array;
|
||||
//~} arena_data;
|
||||
|
||||
#ifndef ARENA_BLOCK_ALLOCATION_SIZE
|
||||
#define ARENA_BLOCK_ALLOCATION_SIZE (1024)
|
||||
#endif
|
||||
//~static arena_data * arena;
|
||||
|
||||
static struct {
|
||||
size_t block_count;
|
||||
size_t block_limit;
|
||||
struct {
|
||||
char * buffer;
|
||||
size_t count;
|
||||
size_t capacity;
|
||||
} * * block_array;
|
||||
} * arena;
|
||||
|
||||
static arena_data * arena;
|
||||
static int open_arena = 0;
|
||||
|
||||
static
|
||||
void arena_deinit(void) {
|
||||
for (size_t index = 0; index < arena->block_count; ++index) {
|
||||
free(arena->block_array[index]->buffer);
|
||||
@ -59,60 +52,35 @@ void arena_deinit(void) {
|
||||
free(arena);
|
||||
}
|
||||
|
||||
arena_block * arena_init(size_t limit) {
|
||||
arena_block * block = NULL;
|
||||
static
|
||||
void * arena_init(size_t limit) {
|
||||
void * block = NULL;
|
||||
|
||||
block = calloc(1, sizeof(arena_block));
|
||||
|
||||
//~arena->block_count++;
|
||||
|
||||
//~arena->block_array = realloc(arena->block_array, arena->block_count * sizeof(*arena->block_array));
|
||||
block = calloc(1, 24);
|
||||
|
||||
arena->block_array[arena->block_count - 1] = block;
|
||||
|
||||
//~*(arena->block_array[arena->block_count - 1]) = calloc(1, sizeof (arena_block));
|
||||
|
||||
arena->block_array[arena->block_count - 1]->buffer = calloc(limit, 1);
|
||||
arena->block_array[arena->block_count - 1]->count = 0;
|
||||
arena->block_array[arena->block_count - 1]->buffer = calloc(limit, 1);
|
||||
arena->block_array[arena->block_count - 1]->count = 0;
|
||||
arena->block_array[arena->block_count - 1]->capacity = limit;
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
void * arena_allocate(size_t size) {
|
||||
//~if (arena->count + size >= arena->limit) {
|
||||
//~return NULL;
|
||||
//~}
|
||||
|
||||
//~if (arena->count + size >= arena->limit) {
|
||||
//~arena->limit *= 2;
|
||||
|
||||
//~arena->array = realloc(arena->array, arena->limit);
|
||||
|
||||
//~memset((void *)&arena->array[arena->limit / 2], 0, arena->limit / 2);
|
||||
//~}
|
||||
|
||||
//~char * current = (char*)arena->next;
|
||||
|
||||
//~while (current != NULL) {
|
||||
//~current = (char*)arena->next;
|
||||
//~}
|
||||
|
||||
//~;
|
||||
|
||||
if (open_arena == 0) {
|
||||
atexit(arena_deinit);
|
||||
open_arena = 1;
|
||||
arena = calloc(1, sizeof(*arena));
|
||||
arena->block_count++;
|
||||
arena->block_array = realloc(arena->block_array, arena->block_count * sizeof(*arena->block_array));
|
||||
arena->block_array[arena->block_count - 1] = arena_init(ARENA_BLOCK_ALLOCATION_SIZE);
|
||||
arena->block_array[arena->block_count - 1] = arena_init(AREA_BLOCK_ALLOCATION_MAX_CHUNK_SIZE);
|
||||
}
|
||||
|
||||
if (arena->block_array[arena->block_count - 1]->count + size >= arena->block_array[arena->block_count - 1]->capacity) {
|
||||
arena->block_count++;
|
||||
arena->block_array = realloc(arena->block_array, arena->block_count * sizeof(*arena->block_array));
|
||||
arena->block_array[arena->block_count - 1] = arena_init(ARENA_BLOCK_ALLOCATION_SIZE);
|
||||
arena->block_array[arena->block_count - 1] = arena_init(AREA_BLOCK_ALLOCATION_MAX_CHUNK_SIZE);
|
||||
}
|
||||
|
||||
size_t spot = arena->block_array[arena->block_count - 1]->count;
|
||||
@ -122,12 +90,4 @@ void * arena_allocate(size_t size) {
|
||||
return (void*)&arena->block_array[arena->block_count - 1]->buffer[spot];
|
||||
}
|
||||
|
||||
//~void * arena_deallocate(void * data) {
|
||||
|
||||
//~}
|
||||
|
||||
//~void * arena_reallocate(void * data, size_t size) {
|
||||
|
||||
//~}
|
||||
|
||||
#endif
|
||||
|
BIN
library/test
BIN
library/test
Binary file not shown.
@ -1,5 +1,5 @@
|
||||
#define ARENA_IMPLEMENTATION
|
||||
#define ARENA_BLOCK_ALLOCATION_SIZE (13)
|
||||
#define AREA_BLOCK_ALLOCATION_MAX_CHUNK_SIZE (13)
|
||||
|
||||
#include "arena.h"
|
||||
#include <stdio.h>
|
||||
|
Reference in New Issue
Block a user