about summary refs log tree commit diff
path: root/src/rt/rust_task.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/rt/rust_task.cpp')
-rw-r--r--src/rt/rust_task.cpp24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index b0ced523390..b4c38de99e7 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -512,19 +512,19 @@ rust_task::new_stack(size_t requested_sz) {
     size_t rust_stk_sz = get_next_stack_size(min_sz,
                                              current_sz, requested_sz);
 
-    if (total_stack_sz + rust_stk_sz > kernel->env->max_stack_size) {
+    size_t max_stack = kernel->env->max_stack_size;
+    size_t used_stack = total_stack_sz + rust_stk_sz;
+
+    // Don't allow stacks to grow forever. During unwinding we have to allow
+    // for more stack than normal in order to allow destructors room to run,
+    // arbitrarily selected as 2x the maximum stack size.
+    if (!unwinding && used_stack > max_stack) {
         LOG_ERR(this, task, "task %" PRIxPTR " ran out of stack", this);
-        if (!unwinding) {
-            fail();
-        } else {
-            // FIXME: Because we have landing pads that may need more
-            // stack than normally allowed we have to go allow the stack
-            // to grow unbounded during unwinding. Would be nice to
-            // have a different solution - maybe just double the limit.
-            LOG_ERR(this, task, "task %" PRIxPTR " has blown its stack "
-                    "budget but we are unwinding so growing the stack "
-                    "anyway");
-        }
+        fail();
+    } else if (unwinding && used_stack > max_stack) {
+        LOG_ERR(this, task,
+                "task %" PRIxPTR " ran out of stack during unwinding", this);
+        fail();
     }
 
     size_t sz = rust_stk_sz + RED_ZONE_SIZE;