diff options
| author | peter <peter@pmikkelsen.com> | 2026-09-04 19:45:05 +0000 |
|---|---|---|
| committer | peter <peter@pmikkelsen.com> | 2026-09-04 19:45:05 +0000 |
| commit | 4d1f519e1bcca659100a2593bd7ca7f2f4983ffe (patch) | |
| tree | df2b96f6bb871c8a52c8eda2ac2e2d87387d91bc /src/lib | |
| parent | cde3778df1f5086052d01bf770910b2e05d0a1e1 (diff) | |
Add a test which runs all the scripts in tests/scripts/good to meaure how many memory allocations they perform, and then rerun them with a mode that causes the memory allocator to fail after N allocations. The scripts are run for all values of N from 0 to the number of allocations they need to succeed.
FossilOrigin-Name: ed1953c203d3493d9c1adbcb9256d7d380bc1fdcfc7856f03f9d801291f478cd
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/main.c | 4 | ||||
| -rw-r--r-- | src/lib/memory.c | 11 |
2 files changed, 10 insertions, 5 deletions
diff --git a/src/lib/main.c b/src/lib/main.c index d2c353f..1bafa27 100644 --- a/src/lib/main.c +++ b/src/lib/main.c @@ -44,8 +44,10 @@ aplwc_new(struct aplwc_fns fns, enum aplwc_rc *rcp) rc = aplwc_load_module(aplwc, "Boot", (const char *)boot_src, boot_src_len); end: - if(rc != APLWC_OK) + if(rc != APLWC_OK){ aplwc_destroy(aplwc); + aplwc = NULL; + } assert(rcp); *rcp = rc; return aplwc; diff --git a/src/lib/memory.c b/src/lib/memory.c index b5bb82a..583b2ab 100644 --- a/src/lib/memory.c +++ b/src/lib/memory.c @@ -53,7 +53,7 @@ memory_init(struct aplwc *aplwc) void memory_destroy(struct aplwc *aplwc) { - if(aplwc->fns.dealloc) + if(aplwc->fns.dealloc && aplwc->unaligned_data) aplwc->fns.dealloc(aplwc->unaligned_data); } @@ -173,8 +173,7 @@ grow(struct aplwc *aplwc, size_t extra) if(aplwc->data){ memmove(aligned_data, aplwc->data, aplwc->size); fixrefs(aplwc, aligned_data, aplwc->data); - if(aplwc->fns.dealloc) - aplwc->fns.dealloc(aplwc->unaligned_data); + memory_destroy(aplwc); for(free = head; free; free = next(free)) if(next(free)) assert((free)->tag != CHUNK_TAG_FREE); @@ -380,7 +379,9 @@ alloc(struct aplwc *aplwc, size_t size, enum chunk_tag tag) if(pad) size += ALIGNMENT - pad; - + if(aplwc->fns.hook_alloc && !aplwc->fns.hook_alloc()) + goto fail; + attempt = 0; retry: DEBUG(check_mem(aplwc)); @@ -398,6 +399,8 @@ retry: goto retry; /* fall-through */ default: +fail: + aplwc->last_error = APLWC_OUT_OF_MEMORY; return NULL; } } |