diff options
| author | 2025-03-10 10:26:23 +0330 | |
|---|---|---|
| committer | 2025-03-10 10:26:23 +0330 | |
| commit | dde24fa64103e7a921c80a7782f1e625e39e2e86 (patch) | |
| tree | 7616b1a4cb80551fb49ea9e11402f318bfb5e123 | |
| parent | Readme update (diff) | |
Add sbrk fallback
| -rw-r--r-- | main.c | 11 | ||||
| -rw-r--r-- | moonshine.h | 8 |
2 files changed, 11 insertions, 8 deletions
@@ -13,7 +13,7 @@ const enum { test_minor_features, test_garbage_collector_2 } current_test - = test_garbage_collector_2; + = test_minor_features; int main() { if (current_test == test_alloc) { @@ -91,12 +91,9 @@ int main() { collect_garbage(true); } else if (current_test == test_minor_features) { // Minor feature: sbrk allocator - auto ptr = sbrkocator_alloc(10); - sbrkocator_release(ptr); - ptr = sbrkocator_alloc(1000); - sbrkocator_release(sbrkocator_alloc(500)); - sbrkocator_release(ptr); - puts("Wowie\n"); + var wow = sbrkocator_alloc(2000); + println("Pointer: ", wow); + collect_garbage(true); } else if (current_test == test_garbage_collector_2) { for (u8 i = 0; i < 9999; i++) new (int, 9999); collect_garbage(true); diff --git a/moonshine.h b/moonshine.h index 1eddf5f..6578dc9 100644 --- a/moonshine.h +++ b/moonshine.h @@ -1191,6 +1191,10 @@ sbrk_block *sbrkocator_find_free(u8 size) { var sbrkocator_alloc_new(u8 size) { sbrk_block *new_block = sbrk(size + sizeof(sbrk_block)); + + // Out of sbrk memory. + if(current_break < (var)new_block + size) return NULL; + if (new_block == (sbrk_block *) -1) return NULL; new_block->magic = sbrk_magic_number; new_block->ptr = (void *) (new_block + 1); @@ -1294,7 +1298,9 @@ const u8 MOONSHINE_ALLOCATOR_SWITCH_THRESHOLD = 1024 * 16; var alloc(u8 size) { if (size > MOONSHINE_ALLOCATOR_SWITCH_THRESHOLD) return mmapocator_alloc(size); - return sbrkocator_alloc(size); + var sbrk_ptr = sbrkocator_alloc(size); + if(sbrk_ptr == NULL) return mmapocator_alloc(size); + return sbrk_ptr; } void release(var ptr) { |
