std: Improve non-task-based usage
A few notable improvements were implemented to cut down on the number of aborts triggered by the standard library when a local task is not found. * Primarily, the unwinding functionality was restructured to support an unsafe top-level function, `try`. This function invokes a closure, capturing any failure which occurs inside of it. The purpose of this function is to be as lightweight of a "try block" as possible for rust, intended for use when the runtime is difficult to set up. This function is *not* meant to be used by normal rust code, nor should it be consider for use with normal rust code. * When invoking spawn(), a `fail!()` is triggered rather than an abort. * When invoking LocalIo::borrow(), which is transitively called by all I/O constructors, None is returned rather than aborting to indicate that there is no local I/O implementation. * Invoking get() on a TLD key will return None if no task is available * Invoking replace() on a TLD key will fail if no task is available. A test case was also added showing the variety of things that you can do without a runtime or task set up now. In general, this is just a refactoring to abort less quickly in the standard library when a local task is not found.
This commit is contained in:
@@ -176,7 +176,10 @@ impl TaskBuilder {
|
||||
Some(gen) => gen(f),
|
||||
None => f
|
||||
};
|
||||
let t: Box<Task> = Local::take();
|
||||
let t: Box<Task> = match Local::try_take() {
|
||||
Some(t) => t,
|
||||
None => fail!("need a local task to spawn a new task"),
|
||||
};
|
||||
t.spawn_sibling(self.opts, f);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user