@@ -20,6 +20,7 @@ use libc::{c_void, uintptr_t};
2020use ptr;
2121use prelude:: * ;
2222use option:: { Option , Some , None } ;
23+ use rt:: env;
2324use rt:: kill:: Death ;
2425use rt:: local:: Local ;
2526use rt:: logging:: StdErrLogger ;
@@ -85,38 +86,40 @@ impl Task {
8586
8687 // A helper to build a new task using the dynamically found
8788 // scheduler and task. Only works in GreenTask context.
88- pub fn build_homed_child ( f : ~fn ( ) , home : SchedHome ) -> ~Task {
89+ pub fn build_homed_child ( stack_size : Option < uint > , f : ~fn ( ) , home : SchedHome ) -> ~Task {
8990 let f = Cell :: new ( f) ;
9091 let home = Cell :: new ( home) ;
9192 do Local :: borrow :: < Task , ~Task > |running_task| {
9293 let mut sched = running_task. sched . take_unwrap ( ) ;
9394 let new_task = ~running_task. new_child_homed ( & mut sched. stack_pool ,
95+ stack_size,
9496 home. take ( ) ,
9597 f. take ( ) ) ;
9698 running_task. sched = Some ( sched) ;
9799 new_task
98100 }
99101 }
100102
101- pub fn build_child ( f : ~fn ( ) ) -> ~Task {
102- Task :: build_homed_child ( f, AnySched )
103+ pub fn build_child ( stack_size : Option < uint > , f : ~fn ( ) ) -> ~Task {
104+ Task :: build_homed_child ( stack_size , f, AnySched )
103105 }
104106
105- pub fn build_homed_root ( f : ~fn ( ) , home : SchedHome ) -> ~Task {
107+ pub fn build_homed_root ( stack_size : Option < uint > , f : ~fn ( ) , home : SchedHome ) -> ~Task {
106108 let f = Cell :: new ( f) ;
107109 let home = Cell :: new ( home) ;
108110 do Local :: borrow :: < Task , ~Task > |running_task| {
109111 let mut sched = running_task. sched . take_unwrap ( ) ;
110112 let new_task = ~Task :: new_root_homed ( & mut sched. stack_pool ,
111- home. take ( ) ,
112- f. take ( ) ) ;
113+ stack_size,
114+ home. take ( ) ,
115+ f. take ( ) ) ;
113116 running_task. sched = Some ( sched) ;
114117 new_task
115118 }
116119 }
117120
118- pub fn build_root ( f : ~fn ( ) ) -> ~Task {
119- Task :: build_homed_root ( f, AnySched )
121+ pub fn build_root ( stack_size : Option < uint > , f : ~fn ( ) ) -> ~Task {
122+ Task :: build_homed_root ( stack_size , f, AnySched )
120123 }
121124
122125 pub fn new_sched_task ( ) -> Task {
@@ -137,17 +140,20 @@ impl Task {
137140 }
138141
139142 pub fn new_root ( stack_pool : & mut StackPool ,
143+ stack_size : Option < uint > ,
140144 start : ~fn ( ) ) -> Task {
141- Task :: new_root_homed ( stack_pool, AnySched , start)
145+ Task :: new_root_homed ( stack_pool, stack_size , AnySched , start)
142146 }
143147
144148 pub fn new_child ( & mut self ,
145149 stack_pool : & mut StackPool ,
150+ stack_size : Option < uint > ,
146151 start : ~fn ( ) ) -> Task {
147- self . new_child_homed ( stack_pool, AnySched , start)
152+ self . new_child_homed ( stack_pool, stack_size , AnySched , start)
148153 }
149154
150155 pub fn new_root_homed ( stack_pool : & mut StackPool ,
156+ stack_size : Option < uint > ,
151157 home : SchedHome ,
152158 start : ~fn ( ) ) -> Task {
153159 Task {
@@ -160,14 +166,15 @@ impl Task {
160166 death : Death :: new ( ) ,
161167 destroyed : false ,
162168 name : None ,
163- coroutine : Some ( Coroutine :: new ( stack_pool, start) ) ,
169+ coroutine : Some ( Coroutine :: new ( stack_pool, stack_size , start) ) ,
164170 sched : None ,
165171 task_type : GreenTask ( Some ( ~home) )
166172 }
167173 }
168174
169175 pub fn new_child_homed ( & mut self ,
170176 stack_pool : & mut StackPool ,
177+ stack_size : Option < uint > ,
171178 home : SchedHome ,
172179 start : ~fn ( ) ) -> Task {
173180 Task {
@@ -181,7 +188,7 @@ impl Task {
181188 death : self . death . new_child ( ) ,
182189 destroyed : false ,
183190 name : None ,
184- coroutine : Some ( Coroutine :: new ( stack_pool, start) ) ,
191+ coroutine : Some ( Coroutine :: new ( stack_pool, stack_size , start) ) ,
185192 sched : None ,
186193 task_type : GreenTask ( Some ( ~home) )
187194 }
@@ -325,11 +332,13 @@ impl Drop for Task {
325332
326333impl Coroutine {
327334
328- pub fn new ( stack_pool : & mut StackPool , start : ~fn ( ) ) -> Coroutine {
329- static MIN_STACK_SIZE : uint = 3000000 ; // XXX: Too much stack
330-
335+ pub fn new ( stack_pool : & mut StackPool , stack_size : Option < uint > , start : ~fn ( ) ) -> Coroutine {
336+ let stack_size = match stack_size {
337+ Some ( size) => size,
338+ None => env:: min_stack ( )
339+ } ;
331340 let start = Coroutine :: build_start_wrapper ( start) ;
332- let mut stack = stack_pool. take_segment ( MIN_STACK_SIZE ) ;
341+ let mut stack = stack_pool. take_segment ( stack_size ) ;
333342 let initial_context = Context :: new ( start, & mut stack) ;
334343 Coroutine {
335344 current_stack_segment : stack,
0 commit comments