return a Result from StackSource::get_stack with an associated Error
fix #7
This commit is contained in:
parent
42db0ee5b1
commit
b8211689fa
|
@ -8,7 +8,7 @@ static mut ctx_slot: *mut Context<'static, lwkt::os::Stack> = 0 as *mut Context<
|
||||||
#[bench]
|
#[bench]
|
||||||
fn swap(b: &mut test::Bencher) {
|
fn swap(b: &mut test::Bencher) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let stack = lwkt::os::StackSource::get_stack(4 << 20);
|
let stack = lwkt::os::StackSource::get_stack(4 << 20).unwrap();
|
||||||
|
|
||||||
let mut ctx = Context::new(stack, move || {
|
let mut ctx = Context::new(stack, move || {
|
||||||
let ctx_ptr = ctx_slot;
|
let ctx_ptr = ctx_slot;
|
||||||
|
|
|
@ -7,7 +7,7 @@ static mut ctx_slot: *mut Context<'static, lwkt::os::Stack> = 0 as *mut Context<
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
unsafe {
|
unsafe {
|
||||||
let stack = lwkt::os::StackSource::get_stack(4 << 20);
|
let stack = lwkt::os::StackSource::get_stack(4 << 20).unwrap();
|
||||||
|
|
||||||
let mut ctx = Context::new(stack, move || {
|
let mut ctx = Context::new(stack, move || {
|
||||||
println!("it's alive!");
|
println!("it's alive!");
|
||||||
|
|
29
src/os.rs
29
src/os.rs
|
@ -17,7 +17,9 @@ pub struct StackSource;
|
||||||
|
|
||||||
impl stack::StackSource for StackSource {
|
impl stack::StackSource for StackSource {
|
||||||
type Output = Stack;
|
type Output = Stack;
|
||||||
fn get_stack(size: usize) -> Stack {
|
type Error = IoError;
|
||||||
|
|
||||||
|
fn get_stack(size: usize) -> Result<Stack, IoError> {
|
||||||
Stack::new(size)
|
Stack::new(size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +39,7 @@ impl stack::Stack for Stack {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Stack {
|
impl Stack {
|
||||||
fn new(size: usize) -> Stack {
|
fn new(size: usize) -> Result<Stack, IoError> {
|
||||||
let page_size = sys::page_size();
|
let page_size = sys::page_size();
|
||||||
|
|
||||||
// round the page size up,
|
// round the page size up,
|
||||||
|
@ -45,25 +47,20 @@ impl Stack {
|
||||||
let len = (size + page_size - 1) & !(page_size - 1);
|
let len = (size + page_size - 1) & !(page_size - 1);
|
||||||
|
|
||||||
let stack = unsafe {
|
let stack = unsafe {
|
||||||
let ptr = match sys::map_stack(size) {
|
let ptr = try!(match sys::map_stack(size) {
|
||||||
None => {
|
None => Err(IoError::last_os_error()),
|
||||||
panic!("mmap for stack of size {} failed: {}",
|
Some(ptr) => Ok(ptr)
|
||||||
len, IoError::last_os_error())
|
});
|
||||||
}
|
|
||||||
Some(ptr) => ptr
|
|
||||||
};
|
|
||||||
|
|
||||||
Stack { ptr: ptr as *mut u8, len: len }
|
Stack { ptr: ptr as *mut u8, len: len }
|
||||||
};
|
};
|
||||||
|
|
||||||
unsafe {
|
try!(unsafe {
|
||||||
if !sys::protect_stack(stack.ptr) {
|
if sys::protect_stack(stack.ptr) { Ok(()) }
|
||||||
panic!("mprotect for guard page of stack {:p} failed: {}",
|
else { Err(IoError::last_os_error()) }
|
||||||
stack.ptr, IoError::last_os_error());
|
});
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stack
|
Ok(stack)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
//! Traits for stacks.
|
//! Traits for stacks.
|
||||||
|
use core::prelude::*;
|
||||||
|
|
||||||
/// A trait for objects that hold ownership of a stack.
|
/// A trait for objects that hold ownership of a stack.
|
||||||
pub trait Stack {
|
pub trait Stack {
|
||||||
|
@ -15,5 +16,6 @@ pub trait Stack {
|
||||||
/// A trait for objects that provide stacks of arbitrary size.
|
/// A trait for objects that provide stacks of arbitrary size.
|
||||||
pub trait StackSource {
|
pub trait StackSource {
|
||||||
type Output: Stack;
|
type Output: Stack;
|
||||||
fn get_stack(size: usize) -> Self::Output;
|
type Error = ();
|
||||||
|
fn get_stack(size: usize) -> Result<Self::Output, Self::Error>;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue