add StackSource and implement it for platform::Stack

This commit is contained in:
edef 2015-04-15 15:56:57 -04:00
parent f7511dc2c1
commit 7aa58f43f7
3 changed files with 17 additions and 3 deletions

View File

@ -1,5 +1,5 @@
use core::prelude::*;
use platform::Stack;
use stack::StackSource;
use arch::Registers;
use platform;
@ -11,7 +11,7 @@ pub struct Context {
impl Context {
#[inline]
pub unsafe fn new<F>(f: F) -> Context where F: FnOnce() + Send + 'static {
let mut stack = Stack::new(4 << 20);
let mut stack = platform::StackSource::get_stack(4 << 20);
let regs = Registers::new(&mut stack, f);
Context {
regs: regs,

View File

@ -22,6 +22,15 @@ pub struct Stack {
valgrind_id: libc::c_uint
}
pub struct StackSource;
impl stack::StackSource for StackSource {
type Output = Stack;
fn get_stack(size: usize) -> Stack {
Stack::new(size)
}
}
impl stack::Stack for Stack {
fn top(&mut self) -> *mut u8 {
unsafe {
@ -37,7 +46,7 @@ impl stack::Stack for Stack {
}
impl Stack {
pub fn new(size: usize) -> Stack {
fn new(size: usize) -> Stack {
let page_size = env::page_size();
// round the page size up,

View File

@ -2,3 +2,8 @@ pub trait Stack {
fn top(&mut self) -> *mut u8;
fn limit(&self) -> *const u8;
}
pub trait StackSource {
type Output: Stack;
fn get_stack(size: usize) -> Self::Output;
}