mirror of
https://github.com/Ed94/WATL_Exercise.git
synced 2025-08-06 07:12:42 -07:00
improvements to save point usage in Arena allocators
This commit is contained in:
@@ -222,20 +222,24 @@ typedef def_enum(U64, AllocatorQueryFlags) {
|
|||||||
// Ability to rewind to a save point (ex: arenas, stack), must also be able to save such a point
|
// Ability to rewind to a save point (ex: arenas, stack), must also be able to save such a point
|
||||||
AllocatorQuery_Rewind = (1 << 6),
|
AllocatorQuery_Rewind = (1 << 6),
|
||||||
};
|
};
|
||||||
typedef def_struct(AllocatorProc_In) {
|
typedef struct AllocatorProc_In AllocatorProc_In;
|
||||||
void* data;
|
|
||||||
SSIZE requested_size;
|
|
||||||
SSIZE alignment;
|
|
||||||
Slice_Byte old_allocation;
|
|
||||||
AllocatorOp op;
|
|
||||||
byte_pad(4);
|
|
||||||
};
|
|
||||||
typedef struct AllocatorProc_Out AllocatorProc_Out;
|
typedef struct AllocatorProc_Out AllocatorProc_Out;
|
||||||
typedef void fn(AllocatorProc) (AllocatorProc_In In, AllocatorProc_Out* Out);
|
typedef void fn(AllocatorProc) (AllocatorProc_In In, AllocatorProc_Out* Out);
|
||||||
typedef def_struct(AllocatorSP) {
|
typedef def_struct(AllocatorSP) {
|
||||||
AllocatorProc* type_sig;
|
AllocatorProc* type_sig;
|
||||||
SSIZE slot;
|
SSIZE slot;
|
||||||
};
|
};
|
||||||
|
struct AllocatorProc_In {
|
||||||
|
void* data;
|
||||||
|
SSIZE requested_size;
|
||||||
|
SSIZE alignment;
|
||||||
|
union {
|
||||||
|
Slice_Byte old_allocation;
|
||||||
|
AllocatorSP save_point;
|
||||||
|
};
|
||||||
|
AllocatorOp op;
|
||||||
|
byte_pad(4);
|
||||||
|
};
|
||||||
struct AllocatorProc_Out {
|
struct AllocatorProc_Out {
|
||||||
union {
|
union {
|
||||||
Slice_Byte allocation;
|
Slice_Byte allocation;
|
||||||
@@ -751,7 +755,7 @@ void mem_reset(AllocatorInfo ainfo) {
|
|||||||
inline
|
inline
|
||||||
void mem_rewind(AllocatorInfo ainfo, AllocatorSP save_point) {
|
void mem_rewind(AllocatorInfo ainfo, AllocatorSP save_point) {
|
||||||
assert(ainfo.proc != nullptr);
|
assert(ainfo.proc != nullptr);
|
||||||
ainfo.proc((AllocatorProc_In){.data = ainfo.data, .op = AllocatorOp_Rewind, .old_allocation = {.ptr = cast(Byte*, & save_point)}}, &(AllocatorProc_Out){});
|
ainfo.proc((AllocatorProc_In){.data = ainfo.data, .op = AllocatorOp_Rewind, .save_point = save_point}, &(AllocatorProc_Out){});
|
||||||
}
|
}
|
||||||
inline
|
inline
|
||||||
AllocatorSP mem_save_point(AllocatorInfo ainfo) {
|
AllocatorSP mem_save_point(AllocatorInfo ainfo) {
|
||||||
@@ -922,7 +926,7 @@ void farena_allocator_proc(AllocatorProc_In in, AllocatorProc_Out* out)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case AllocatorOp_Rewind:
|
case AllocatorOp_Rewind:
|
||||||
farena_rewind(arena, * cast(AllocatorSP*, in.old_allocation.ptr));
|
farena_rewind(arena, in.save_point);
|
||||||
break;
|
break;
|
||||||
case AllocatorOp_SavePoint:
|
case AllocatorOp_SavePoint:
|
||||||
out->save_point = farena_save(* arena);
|
out->save_point = farena_save(* arena);
|
||||||
@@ -1170,7 +1174,7 @@ void varena_allocator_proc(AllocatorProc_In in, AllocatorProc_Out* out)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case AllocatorOp_Rewind:
|
case AllocatorOp_Rewind:
|
||||||
vm->commit_used = cast(SSIZE, in.old_allocation.ptr);
|
vm->commit_used = in.save_point.slot;
|
||||||
break;
|
break;
|
||||||
case AllocatorOp_SavePoint:
|
case AllocatorOp_SavePoint:
|
||||||
out->save_point = varena_save(vm);
|
out->save_point = varena_save(vm);
|
||||||
@@ -1340,7 +1344,7 @@ void arena_allocator_proc(AllocatorProc_In in, AllocatorProc_Out* out)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case AllocatorOp_Rewind:
|
case AllocatorOp_Rewind:
|
||||||
arena_rewind(arena, * cast(AllocatorSP*, in.old_allocation.ptr));
|
arena_rewind(arena, in.save_point);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AllocatorOp_SavePoint:
|
case AllocatorOp_SavePoint:
|
||||||
|
Reference in New Issue
Block a user