about summary refs log tree commit diff
path: root/src/rt/rust_sched_loop.cpp
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2013-04-05 11:55:43 -0700
committerPatrick Walton <pcwalton@mimiga.net>2013-04-19 11:53:34 -0700
commitca8e99fd78ab9b56c5bdc61027b032ad52c2ec8b (patch)
treee3fef1f74bbfaa9ee6846c67941b9f2d8dab0b78 /src/rt/rust_sched_loop.cpp
parent2dbe20a5610c3244feab0db5ab20ff062dc91085 (diff)
downloadrust-ca8e99fd78ab9b56c5bdc61027b032ad52c2ec8b.tar.gz
rust-ca8e99fd78ab9b56c5bdc61027b032ad52c2ec8b.zip
rt: Fix scalability problem with big stacks on 32 bit
Diffstat (limited to 'src/rt/rust_sched_loop.cpp')
-rw-r--r--src/rt/rust_sched_loop.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/rt/rust_sched_loop.cpp b/src/rt/rust_sched_loop.cpp
index 90393acdd59..dbcbd7b83cf 100644
--- a/src/rt/rust_sched_loop.cpp
+++ b/src/rt/rust_sched_loop.cpp
@@ -29,6 +29,8 @@ rust_sched_loop::rust_sched_loop(rust_scheduler *sched, int id, bool killed) :
     should_exit(false),
     cached_c_stack(NULL),
     extra_c_stack(NULL),
+    cached_big_stack(NULL),
+    extra_big_stack(NULL),
     dead_task(NULL),
     killed(killed),
     pump_signal(NULL),
@@ -263,6 +265,11 @@ rust_sched_loop::run_single_turn() {
             destroy_exchange_stack(kernel->region(), cached_c_stack);
             cached_c_stack = NULL;
         }
+        assert(!extra_big_stack);
+        if (cached_big_stack) {
+            destroy_exchange_stack(kernel->region(), cached_big_stack);
+            cached_big_stack = NULL;
+        }
 
         sched->release_task_thread();
         return sched_loop_state_exit;
@@ -392,6 +399,13 @@ rust_sched_loop::prepare_c_stack(rust_task *task) {
         cached_c_stack = create_exchange_stack(kernel->region(),
                                                C_STACK_SIZE);
     }
+    assert(!extra_big_stack);
+    if (!cached_big_stack) {
+        cached_big_stack = create_exchange_stack(kernel->region(),
+                                                 C_STACK_SIZE +
+                                                 (C_STACK_SIZE * 2));
+        cached_big_stack->is_big = 1;
+    }
 }
 
 void
@@ -400,6 +414,10 @@ rust_sched_loop::unprepare_c_stack() {
         destroy_exchange_stack(kernel->region(), extra_c_stack);
         extra_c_stack = NULL;
     }
+    if (extra_big_stack) {
+        destroy_exchange_stack(kernel->region(), extra_big_stack);
+        extra_big_stack = NULL;
+    }
 }
 
 //