diff options
| author | bors <bors@rust-lang.org> | 2013-04-19 19:24:52 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-04-19 19:24:52 -0700 |
| commit | 8b3c09a1038c6623528fd7ebb1d365e475d63dfc (patch) | |
| tree | cccb89a294c2efb90a4a319fdd50b0fc0cf6c6e5 /src/rt/rust_sched_loop.cpp | |
| parent | 6510fd92544467a03df93b5124644976aa79f964 (diff) | |
| parent | d2b644842a75af44d042f4026a585e4a9cf5979a (diff) | |
| download | rust-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.cpp | 18 |
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; + } } // |
