Skip to content

dbandstra/zig-hunk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 

Repository files navigation

zig-hunk

A basic "Hunk" memory allocator, based on (and name taken from) the hunk system from id Software's Quake engine. A more descriptive name might be "double-sided stack allocator based on a fixed block of memory".

Requires Zig 0.11.0.

Usage

A new Hunk must be provided with an array of bytes. This block of memory is all there is - hunk allocators will return "out of memory" errors when the block is full.

var mem: [100000]u8 = undefined;
var hunk = Hunk.init(mem);

The Hunk has two "sides", low and high. They're basically stacks which start at opposite ends of the memory buffer and grow inward. When the two stacks collide, you've run out of memory.

The hunk sides act as Zig allocators, but free has no effect. Instead, you free memory using two special methods, getMark and freeToMark.

You call getMark, then allocate some memory using the allocator API, then when you're done, call freeToMark with the value you got from getMark. This "frees" everything you allocated since you called getMark.

Example:

var side = hunk.low(); // or hunk.high()

const mark = side.getMark();
defer side.freeToMark();

var memory = try side.allocator.alloc(u8, 123);
var memory2 = try side.allocator.alloc(u8, 456);
var memory3 = try std.mem.dupe(&side.allocator, u8, "hello");

The two sides can be used independently. You could for example use one side for more persistent allocations, and the other side for temporary allocations.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages