Skip to content

Instantly share code, notes, and snippets.

@niksaak
Last active November 29, 2016 01:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save niksaak/3ec775e2d9da36e4b98c64e74d13b4c5 to your computer and use it in GitHub Desktop.
Save niksaak/3ec775e2d9da36e4b98c64e74d13b4c5 to your computer and use it in GitHub Desktop.
impl Core {
fn pull_fresh(&self) -> Option<Fiber> {
self.scheduler.consume_fresh()
}
fn pull_waiting(&self) -> Result<Fiber, WakeError> {
self.scheduler.wake_fiber()
}
fn work(&self) {
use WaitError;
use FiberMessage;
loop {
// Try pulling a fiber that finished waiting first, then, if none
// found, pull a fresh one. If neither is acquired, get a
// WaitError.
let mut fib = self.pull_waiting()
.or_else(|err| self.pull_fresh().ok_or(err));
// If waiting queue is empty, then all work is finished -
// break from the loop. Otherwise if there is just no non-waiting
// fiber available, enter the Deadlock state until awoken from
// outside.
match fib {
Err(Deadlock) => {
self.park();
continue;
},
Err(Empty) => break,
_ => (),
};
match fib.transfer() {
Prime => unreachable!();
Yield => self.scheduler.refresh_fiber(fib);
Wait(&so) => unimplemented!();
Finished => self.scheduler.release_fiber(fib);
};
}
}
fn park() {
unimplemented!();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment