Please do not suggest any external libraries.
This suggests that you want to learn how to implement a simple arena allocator in julia. The short answer is “the obvious way, nothing julia specific here”.
Since you are asking the question anyway, I assume this is not obvious to you. Props to you for learning something new, don’t get annoyed when I write something that is in fact obvious to you.
julia> mutable struct Arena
ptr::Ptr{Cvoid}
len::Int
cap::Int
end
julia> function makeArena(cap::Int)
cap == 0 && return Arena(Base.C_NULL, 0, 0)
Arena(ccall(:malloc, Ptr{Cvoid}, (Csize_t,), cap), 0, cap)
end
julia> function freeArena(a::Arena)
ccall(:free, Cvoid, (Ptr{Cvoid},), a.ptr)
a.ptr = C_NULL
a.len = 0
a.cap = 0
nothing
end
julia> function allocFromArena(a::Arena, size)
a.len + size > a.cap && return C_NULL
res = a.ptr + a.len
a.len += size
res
end
And that’s it. You can make an arena, tear it down, and allocate memory from it. I even introduced some minor safety features to make double-free and use-after-free of the arena more benign.
From that, there are lots of ways you can go. Thread-safety via atomics. Convenience methods for using the arena as a stack. Methods to get aligned allocations. Avoid memory leaks by letting julia GC take over the freeing via finalizers. Whatever floats your boat.