Initial commit

This commit is contained in:
olemorud
2023-05-14 23:50:43 +02:00
commit 9c93b37557
3 changed files with 106 additions and 0 deletions

12
arena.h Normal file
View File

@@ -0,0 +1,12 @@
#include <stddef.h> // ptrdiff_t
struct arena {
void *start,
*next;
ptrdiff_t cap;
} __attribute__((aligned(64)));
struct arena* arena_new();
void arena_reset(struct arena *a);
void* arena_alloc(struct arena *a, size_t len);

63
arena_alloc.c Normal file
View File

@@ -0,0 +1,63 @@
#include "arena.h"
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stddef.h> // ptrdiff_t
#include <sys/mman.h>
#define ARENA_PAGES ((size_t)(128))
#define ALIGN 1
struct arena* arena_new()
{
size_t page_size = sysconf(_SC_PAGE_SIZE);
size_t size = page_size * ARENA_PAGES;
void *p = mmap(
NULL,
size,
PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE,
-1, /* man mmap(2): "[...], some implementations require fd to be
-1 if MAP_ANONYMOUS is specified [...]" */
0
);
if (p == MAP_FAILED) {
return NULL;
}
struct arena a = {
.start = p + sizeof(struct arena),
.next = p + sizeof(struct arena),
.cap = size
};
memcpy(p, &a, sizeof a);
return p;
}
void arena_reset(struct arena *a)
{
a->next = a->start;
}
void* arena_alloc(struct arena *a, size_t len)
{
void *p = a->next;
a->next += len;
if (a->next - a->start >= a->cap) {
errno = ENOMEM;
return NULL;
}
return p;
}

31
test_arena_alloc.c Normal file
View File

@@ -0,0 +1,31 @@
// _start test_arena_alloc.c
#include "arena.h"
#include <err.h>
#include <stdio.h>
#include <errno.h>
static struct arena *default_arena = NULL;
int main()
{
default_arena = arena_new();
if (default_arena == NULL) {
err(errno, "failed to allocate arena");
}
char *p = arena_alloc(default_arena, sizeof p * 11);
for (size_t i=0; i<10; ++i) {
p[i] = 'A';
}
p[10] = '\0';
printf("%s", p);
return 0;
}