27 #include "precompiled.h"
40 const size_t cur_size = da->
cur_size;
41 const size_t pos = da->
pos;
50 if(cur_size > max_size_pa)
52 if(pos > cur_size || pos > max_size_pa)
58 #define CHECK_DA(da) RETURN_STATUS_IF_ERR(validate_da(da))
64 const size_t max_size_pa = Align<pageSize>(max_size);
87 memset(da, 0,
sizeof(*da));
98 const size_t cur_size_pa = Align<pageSize>(da->
cur_size);
99 const size_t new_size_pa = Align<pageSize>(new_size);
108 u8* end = da->
base + cur_size_pa;
111 if(size_delta_pa > 0)
113 ok =
vm::Commit(uintptr_t(end), size_delta_pa);
115 debug_printf(L
"Commit failed (%p %lld)\n", end, (
long long)size_delta_pa);
118 else if(size_delta_pa < 0)
119 ok =
vm::Decommit(uintptr_t(end+size_delta_pa), -size_delta_pa);
142 memcpy(da->
base+da->
pos, data, size);
static const size_t pageSize
static Status validate_da(DynArray *da)
provides a memory range that can be expanded but doesn't waste physical memory or relocate itself...
bool Commit(uintptr_t address, size_t size, PageType pageType, int prot)
map physical memory to previously reserved address space.
bool IsAligned(T t, uintptr_t multiple)
#define ENSURE(expr)
ensure the expression <expr> evaluates to non-zero.
const Status INVALID_POINTER
Status da_set_size(DynArray *da, size_t new_size)
expand or shrink the array: changes the amount of currently committed (i.e.
bool Decommit(uintptr_t address, size_t size)
unmap physical memory.
Status da_append(DynArray *da, const void *data, size_t size)
"write" to array, i.e.
i64 Status
Error handling system.
void ReleaseAddressSpace(void *p, size_t size)
release address space and decommit any memory.
size_t cur_size_pa
committed
#define WARN_RETURN(status)
Status da_free(DynArray *da)
free all memory (address space + physical) that constitutes the given array.
void * ReserveAddressSpace(size_t size, size_t commitSize, PageType pageType, int prot)
reserve address space and set the parameters for any later on-demand commits.
Status da_reserve(DynArray *da, size_t size)
Make sure at least <size> bytes starting at da->pos are committed and ready for use.
Status da_alloc(DynArray *da, size_t max_size)
ready the DynArray object for use.
void debug_printf(const wchar_t *fmt,...)
write a formatted string to the debug channel, subject to filtering (see below).
#define RETURN_STATUS_IF_ERR(expression)