aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Moon Flower <moon@coffin.ir> 2025-03-10 10:26:23 +0330
committerGravatar Moon Flower <moon@coffin.ir> 2025-03-10 10:26:23 +0330
commitdde24fa64103e7a921c80a7782f1e625e39e2e86 (patch)
tree7616b1a4cb80551fb49ea9e11402f318bfb5e123
parentReadme update (diff)
Add sbrk fallback
-rw-r--r--main.c11
-rw-r--r--moonshine.h8
2 files changed, 11 insertions, 8 deletions
diff --git a/main.c b/main.c
index 2e774b8..2caaacb 100644
--- a/main.c
+++ b/main.c
@@ -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) {