Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions src/arena.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
#pragma once

// Diagnostics for debugging
struct ArenaDiagnostics {
u64 totalUsed; // Accumulated used
u64 maxUsed; // Updated at every push
u64 totalFreed;
u64 maxFreed;

// Counts
u64 initCount;
u64 pushCount; // Includes pushZeroCount as well
u64 pushZeroCount;
u64 popCount;
u64 clearCount;
u64 setPosCount;
};

struct Arena {
u8* base;
u64 used;
u64 size;

ArenaDiagnostics diagn;
};

static void
ArenaInit(Arena* arena, void* base, u64 size) {
*arena = {};

arena->base = static_cast<u8*>(base);
arena->size = size;

++arena->diagn.initCount;
}

static void*
ArenaPush(Arena* arena, u64 size) {
ASSERT(arena->used + size <= arena->size);
//if (arena->used + size > arena->size) {
//DEBUG_PRINT("ArenaPush: Out of memory!\n");
//PrintArena(arena); nocheckin
//ExitProcess(1);
//}

void* result = arena->base + arena->used;
arena->used += size;

// Debug
arena->diagn.totalUsed += size;
arena->diagn.maxUsed = MAX(arena->used, arena->diagn.maxUsed);
++arena->diagn.pushCount;
ASSERT(arena->diagn.pushCount >= arena->diagn.pushZeroCount);

return result;
}

static void*
ArenaPushZero(Arena* arena, u64 size) {
++arena->diagn.pushZeroCount;

void* result = ArenaPush(arena, size);
ZeroMemory(result, size);
return result;
}

static void
ArenaPop(Arena* arena, u64 size) {
ASSERT(arena->used >= size);

arena->diagn.totalFreed += size;
arena->diagn.maxFreed = MAX(size, arena->diagn.maxFreed);
++arena->diagn.popCount;

arena->used -= size;
}

static void
ArenaClear(Arena* arena) {
arena->diagn.totalFreed += arena->used;
arena->diagn.maxFreed = MAX(arena->used, arena->diagn.maxFreed);
++arena->diagn.clearCount;

arena->used = 0;
}

static u64
ArenaGetPos(Arena* arena) {
return arena->used;
}

static void
ArenaSetPos(Arena* arena, u64 pos) {
// It would be a programmer error to set equal to size
ASSERT( //pos >= 0 && // unsigned...
pos < arena->size);
arena->used = pos;

++arena->diagn.setPosCount;
}

#define PushArray(arena, type, count) (type*)ArenaPush((arena), sizeof(type) * (count))
#define PushArrayZero(arena, type, count) (type*)ArenaPushZero((arena), sizeof(type) * (count))
#define PushStruct(arena, type) PushArray((arena), type, 1)
#define PushStructZero(arena, type) PushArrayZero((arena), type, 1)
9 changes: 9 additions & 0 deletions src/compressor.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,15 @@ typedef wchar_t wchar;

// clang-format on

#define KB(x) ((x) * 1024ULL)
#define MB(x) (KB(x) * 1024ULL)
#define GB(x) (MB(x) * 1024ULL)
#define TB(x) (GB(x) * 1024ULL)

// The compiler warns about implicit conversion at /W4 at least
#define MIN(a, b) ((a) <= (b) ? (a) : (b))
#define MAX(a, b) ((a) <= (b) ? (b) : (a))

/**
* Returns number of bytes, NOT the number of "real" characters
*/
Expand Down
Loading
Loading