@@ -3,6 +3,7 @@ use crate::common::constants::CoroutineState;
33use crate :: coroutine:: listener:: Listener ;
44use crate :: coroutine:: local:: CoroutineLocal ;
55use crate :: coroutine:: suspender:: Suspender ;
6+ use crate :: coroutine:: StackInfo ;
67use corosensei:: stack:: { DefaultStack , Stack } ;
78use corosensei:: trap:: TrapHandlerRegs ;
89use corosensei:: CoroutineResult ;
@@ -27,7 +28,7 @@ pub struct Coroutine<'c, Param, Yield, Return> {
2728 inner : corosensei:: Coroutine < Param , Yield , Result < Return , & ' static str > , DefaultStack > ,
2829 pub ( crate ) state : Cell < CoroutineState < Yield , Return > > ,
2930 pub ( crate ) stack_size : usize ,
30- pub ( crate ) stack_bottom : RefCell < VecDeque < usize > > ,
31+ pub ( crate ) stack_infos : RefCell < VecDeque < StackInfo > > ,
3132 pub ( crate ) listeners : VecDeque < & ' c dyn Listener < Yield , Return > > ,
3233 pub ( crate ) local : CoroutineLocal < ' c > ,
3334}
@@ -327,9 +328,12 @@ impl<'c, Param, Yield, Return> Coroutine<'c, Param, Yield, Return> {
327328 return Ok ( callback ( ) ) ;
328329 }
329330 return DefaultStack :: new ( stack_size) . map ( |stack| {
330- co. stack_bottom . borrow_mut ( ) . push_front ( stack. limit ( ) . get ( ) ) ;
331+ co. stack_infos . borrow_mut ( ) . push_back ( StackInfo {
332+ stack_top : stack. base ( ) . get ( ) ,
333+ stack_bottom : stack. limit ( ) . get ( ) ,
334+ } ) ;
331335 let r = corosensei:: on_stack ( stack, callback) ;
332- _ = co. stack_bottom . borrow_mut ( ) . pop_front ( ) ;
336+ _ = co. stack_infos . borrow_mut ( ) . pop_back ( ) ;
333337 r
334338 } ) ;
335339 }
@@ -362,7 +366,10 @@ where
362366 {
363367 let stack_size = stack_size. max ( crate :: common:: page_size ( ) ) ;
364368 let stack = DefaultStack :: new ( stack_size) ?;
365- let stack_bottom = RefCell :: new ( VecDeque :: from ( [ stack. limit ( ) . get ( ) ] ) ) ;
369+ let stack_infos = RefCell :: new ( VecDeque :: from ( [ StackInfo {
370+ stack_top : stack. base ( ) . get ( ) ,
371+ stack_bottom : stack. limit ( ) . get ( ) ,
372+ } ] ) ) ;
366373 let co_name = name. clone ( ) . leak ( ) ;
367374 let inner = corosensei:: Coroutine :: with_stack ( stack, move |y, p| {
368375 catch ! (
@@ -382,7 +389,7 @@ where
382389 name,
383390 inner,
384391 stack_size,
385- stack_bottom ,
392+ stack_infos ,
386393 state : Cell :: new ( CoroutineState :: Ready ) ,
387394 listeners : VecDeque :: default ( ) ,
388395 local : CoroutineLocal :: default ( ) ,
0 commit comments