From f82da818a7ea94f4bbb1a1ea15073b51805fd582 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 5 Aug 2013 12:43:33 -0700 Subject: [PATCH] std::rt: Pull RUST_MIN_STACK from the environment --- src/libstd/rt/env.rs | 28 ++++++++++++++++++++++++++++ src/libstd/rt/mod.rs | 1 + src/libstd/rt/task.rs | 6 +++--- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/libstd/rt/env.rs b/src/libstd/rt/env.rs index 1d7ff173149..6e671742fb6 100644 --- a/src/libstd/rt/env.rs +++ b/src/libstd/rt/env.rs @@ -10,7 +10,12 @@ //! Runtime environment settings +use from_str::FromStr; use libc::{size_t, c_char, c_int}; +use option::{Some, None}; +use os; + +// OLD RT stuff pub struct Environment { /// The number of threads to use by default @@ -47,3 +52,26 @@ pub fn get() -> &Environment { extern { fn rust_get_rt_env() -> &Environment; } + +// NEW RT stuff + +// Note that these are all accessed without any synchronization. +// They are expected to be initialized once then left alone. + +static mut MIN_STACK: uint = 2000000; + +pub fn init() { + unsafe { + match os::getenv("RUST_MIN_STACK") { + Some(s) => match FromStr::from_str(s) { + Some(i) => MIN_STACK = i, + None => () + }, + None => () + } + } +} + +pub fn min_stack() -> uint { + unsafe { MIN_STACK } +} diff --git a/src/libstd/rt/mod.rs b/src/libstd/rt/mod.rs index 760ca8a9ada..5b22eace56f 100644 --- a/src/libstd/rt/mod.rs +++ b/src/libstd/rt/mod.rs @@ -212,6 +212,7 @@ pub fn init(argc: int, argv: **u8, crate_map: *u8) { // Need to propagate the unsafety to `start`. unsafe { args::init(argc, argv); + env::init(); logging::init(crate_map); rust_update_gc_metadata(crate_map); } diff --git a/src/libstd/rt/task.rs b/src/libstd/rt/task.rs index 2da44c2f332..aa6d51a480b 100644 --- a/src/libstd/rt/task.rs +++ b/src/libstd/rt/task.rs @@ -20,6 +20,7 @@ use ptr; use prelude::*; use option::{Option, Some, None}; +use rt::env; use rt::kill::Death; use rt::local::Local; use rt::logging::StdErrLogger; @@ -326,10 +327,9 @@ fn drop(&self) { impl Coroutine { pub fn new(stack_pool: &mut StackPool, start: ~fn()) -> Coroutine { - static MIN_STACK_SIZE: uint = 2000000; // XXX: Too much stack - + let stack_size = env::min_stack(); let start = Coroutine::build_start_wrapper(start); - let mut stack = stack_pool.take_segment(MIN_STACK_SIZE); + let mut stack = stack_pool.take_segment(stack_size); let initial_context = Context::new(start, &mut stack); Coroutine { current_stack_segment: stack, -- 2.44.0