Initial commit
This commit is contained in:
12
arena.h
Normal file
12
arena.h
Normal 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
63
arena_alloc.c
Normal 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
31
test_arena_alloc.c
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user