summaryrefslogtreecommitdiff
path: root/src/smrt_arena.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/smrt_arena.c')
-rw-r--r--src/smrt_arena.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/smrt_arena.c b/src/smrt_arena.c
index cf6418e..055877d 100644
--- a/src/smrt_arena.c
+++ b/src/smrt_arena.c
@@ -6,6 +6,7 @@
#include "common.h"
#include "smrt_arena.h"
+#include "log.h"
#include <string.h>
@@ -20,6 +21,7 @@ smrt_arena_t *smrt_arena_create(u64 reserve_size, u64 commit_size, b32 auto_deco
smrt_arena_t *arena = plat_mem_reserve(reserve_size);
if (!plat_mem_commit(arena, commit_size)) {
+ log_error("Failed to acquire virtual memory for smrt_arena");
return NULL;
}
@@ -30,6 +32,11 @@ smrt_arena_t *smrt_arena_create(u64 reserve_size, u64 commit_size, b32 auto_deco
arena->mark_pos = 0;
arena->auto_decommit = auto_decommit;
+ #ifndef NLOG_TRACE
+ log_trace("Created smrt_arena; Total %lu bytes, Commit size %lu bytes",
+ reserve_size, commit_size);
+ #endif /* ifndef NLOG_TRACE */
+
return arena;
}
@@ -58,7 +65,10 @@ void *smrt_arena_push(smrt_arena_t *arena, u64 alloc_amount, b32 zero_out) {
u64 pos_aligned = ALIGN_UP_POW2(arena->pos, ARENA_ALIGN);
u64 new_pos = pos_aligned + alloc_amount;
- if (new_pos > arena->reserve_size) { return NULL; }
+ if (new_pos > arena->reserve_size) {
+ log_warn("Allocation on smrt_arena exceeds reserve size");
+ return NULL;
+ }
if (new_pos > arena->commit_pos) {
u64 new_commit_pos = new_pos;
@@ -70,6 +80,7 @@ void *smrt_arena_push(smrt_arena_t *arena, u64 alloc_amount, b32 zero_out) {
u64 commit_size = new_commit_pos - arena->commit_pos;
if (!plat_mem_commit(mem, commit_size)) {
+ log_error("Failed to commit smrt_arena virtual memory");
return NULL;
}
@@ -111,14 +122,15 @@ void smrt_arena_pop_to(smrt_arena_t *arena, u64 pos) {
smrt_arena_pop(arena, size);
}
-b32 smrt_arena_pop_to_mark(smrt_arena_t *arena) {
+i32 smrt_arena_pop_to_mark(smrt_arena_t *arena) {
if (arena->mark_pos == 0) {
- return false;
+ log_debug("Tried to pop to mark but no mark was set");
+ return -1;
}
smrt_arena_pop_to(arena, arena->mark_pos);
- return true;
+ return 0;
}
void smrt_arena_clear(smrt_arena_t *arena, b32 zero_out) {
@@ -137,9 +149,17 @@ void smrt_arena_mark(smrt_arena_t *arena) {
void smrt_arena_destroy(smrt_arena_t *arena) {
plat_mem_release(arena, arena->reserve_size);
+
+ #ifndef NLOG_TRACE
+ log_trace("Destroyed smrt_arena");
+ #endif /* ifndef NLOG_TRACE */
}
smrta_temp_t smrta_temp_start(smrt_arena_t *arena) {
+ #ifndef NLOG_TRACE
+ log_trace("Starting temp arena");
+ #endif /* ifndef NLOG_TRACE */
+
return (smrta_temp_t){
.arena=arena,
.start_pos=arena->pos
@@ -148,6 +168,9 @@ smrta_temp_t smrta_temp_start(smrt_arena_t *arena) {
void smrta_temp_end(smrta_temp_t temp) {
smrt_arena_pop_to(temp.arena, temp.start_pos);
+ #ifndef NLOG_TRACE
+ log_trace("Ending temp arena");
+ #endif /* ifndef NLOG_TRACE */
}
smrta_temp_t smrta_scratch_start(smrt_arena_t **conflicts, u32 num_conflicts) {
@@ -226,6 +249,7 @@ u32 plat_get_pagesize(void) {
void* plat_mem_reserve(u64 size) {
void* out = mmap(NULL, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (out == MAP_FAILED) {
+ log_error("Failed to reserve virtual memory");
return NULL;
}
return out;