diff options
Diffstat (limited to 'memstack/src')
| -rw-r--r-- | memstack/src/memstack.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/memstack/src/memstack.c b/memstack/src/memstack.c index 0848afb..84131ef 100644 --- a/memstack/src/memstack.c +++ b/memstack/src/memstack.c | |||
| @@ -58,6 +58,21 @@ void memstack_clear(memstack* stack) { | |||
| 58 | memset(stack->base, 0, stack->capacity); | 58 | memset(stack->base, 0, stack->capacity); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | size_t memstack_watermark(const memstack* stack) { | ||
| 62 | assert(stack); | ||
| 63 | return stack->watermark - stack->base; | ||
| 64 | } | ||
| 65 | |||
| 66 | void memstack_set_watermark(memstack* stack, size_t watermark) { | ||
| 67 | assert(stack); | ||
| 68 | const bool fits = (watermark < stack->capacity); | ||
| 69 | if (stack->trap && !fits) { | ||
| 70 | FAIL("memstack watermark update failed, bad watermark"); | ||
| 71 | } | ||
| 72 | assert(fits); | ||
| 73 | stack->watermark = stack->base + watermark; | ||
| 74 | } | ||
| 75 | |||
| 61 | void* memstack_alloc(memstack* stack, size_t bytes) { | 76 | void* memstack_alloc(memstack* stack, size_t bytes) { |
| 62 | assert(stack); | 77 | assert(stack); |
| 63 | 78 | ||
| @@ -82,6 +97,7 @@ void* memstack_alloc_aligned(memstack* stack, size_t bytes, size_t alignment) { | |||
| 82 | uint8_t* const new_watermark = align(stack->watermark, alignment); | 97 | uint8_t* const new_watermark = align(stack->watermark, alignment); |
| 83 | assert(new_watermark >= stack->watermark); | 98 | assert(new_watermark >= stack->watermark); |
| 84 | assert((size_t)(new_watermark - stack->base) <= stack->capacity); | 99 | assert((size_t)(new_watermark - stack->base) <= stack->capacity); |
| 100 | stack->capacity -= (new_watermark - stack->watermark); | ||
| 85 | stack->watermark = new_watermark; | 101 | stack->watermark = new_watermark; |
| 86 | 102 | ||
| 87 | return memstack_alloc(stack, bytes); | 103 | return memstack_alloc(stack, bytes); |
