1
0
Fork 0

more docs!

This commit is contained in:
edef 2015-04-16 10:12:26 -04:00
parent 77ffd6bc03
commit 0bebfae21d
2 changed files with 15 additions and 0 deletions

View File

@ -7,6 +7,13 @@ use arch::Registers;
use stack; use stack;
use debug::StackId; use debug::StackId;
/// Context is the heart of libfringe.
/// A context represents a saved thread of execution, along with a stack.
/// It can be swapped into and out of with the swap method,
/// and once you're done with it, you can get the stack back through unwrap.
///
/// Every operation is unsafe, because libfringe can't make any guarantees
/// about the state of the context.
#[derive(Debug)] #[derive(Debug)]
pub struct Context<'a, Stack: stack::Stack> { pub struct Context<'a, Stack: stack::Stack> {
regs: Registers, regs: Registers,
@ -19,6 +26,9 @@ unsafe impl<'a, Stack> Send for Context<'a, Stack>
where Stack: stack::Stack + Send {} where Stack: stack::Stack + Send {}
impl<'a, Stack> Context<'a, Stack> where Stack: stack::Stack { impl<'a, Stack> Context<'a, Stack> where Stack: stack::Stack {
/// Create a new Context. When it is swapped into,
/// it will call the passed closure.
/// The closure shouldn't return - doing that will abort the process.
#[inline] #[inline]
pub unsafe fn new<F>(mut stack: Stack, f: F) -> Context<'a, Stack> pub unsafe fn new<F>(mut stack: Stack, f: F) -> Context<'a, Stack>
where F: FnOnce() + Send + 'a { where F: FnOnce() + Send + 'a {
@ -32,11 +42,13 @@ impl<'a, Stack> Context<'a, Stack> where Stack: stack::Stack {
} }
} }
/// Switch to the context, saving the current thread of execution there.
#[inline(always)] #[inline(always)]
pub unsafe fn swap(&mut self) { pub unsafe fn swap(&mut self) {
self.regs.swap() self.regs.swap()
} }
/// Unwrap the context, returning the stack it contained.
#[inline] #[inline]
pub unsafe fn unwrap(self) -> Stack { pub unsafe fn unwrap(self) -> Stack {
self.stack self.stack

View File

@ -6,6 +6,9 @@
#![feature(libc)] #![feature(libc)]
#![no_std] #![no_std]
//! libfringe is a low-level green threading library.
//! It provides only a context-swapping mechanism.
#[macro_use] #[macro_use]
extern crate core; extern crate core;