diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2013-04-05 11:55:43 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2013-04-19 11:53:34 -0700 |
| commit | ca8e99fd78ab9b56c5bdc61027b032ad52c2ec8b (patch) | |
| tree | e3fef1f74bbfaa9ee6846c67941b9f2d8dab0b78 /src/rt/rust_sched_loop.cpp | |
| parent | 2dbe20a5610c3244feab0db5ab20ff062dc91085 (diff) | |
| download | rust-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.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; + } } // |
