about summary refs log tree commit diff
path: root/src/rt/rust_sched_loop.cpp
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-04-19 19:24:52 -0700
committerbors <bors@rust-lang.org>2013-04-19 19:24:52 -0700
commit8b3c09a1038c6623528fd7ebb1d365e475d63dfc (patch)
treecccb89a294c2efb90a4a319fdd50b0fc0cf6c6e5 /src/rt/rust_sched_loop.cpp
parent6510fd92544467a03df93b5124644976aa79f964 (diff)
parentd2b644842a75af44d042f4026a585e4a9cf5979a (diff)
downloadrust-8b3c09a1038c6623528fd7ebb1d365e475d63dfc.tar.gz
rust-8b3c09a1038c6623528fd7ebb1d365e475d63dfc.zip
auto merge of #5962 : pcwalton/rust/shootout, r=pcwalton
r? @brson
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;
+    }
 }
 
 //