f7eed22387
old design the TLS held the scheduler struct, and the scheduler struct held the active task. This posed all sorts of weird problems due to how we wanted to use the contents of TLS. The cleaner approach is to leave the active task in TLS and have the task hold the scheduler. To make this work out the scheduler has to run inside a regular task, and then once that is the case the context switching code is massively simplified, as instead of three possible paths there is only one. The logical flow is also easier to follow, as the scheduler struct acts somewhat like a "token" indicating what is active. These changes also necessitated changing a large number of runtime tests, and rewriting most of the runtime testing helpers. Polish level is "low", as I will very soon start on more scheduler changes that will require wiping the polish off. That being said there should be sufficient comments around anything complex to make this entirely respectable as a standalone commit.
51 lines
1.3 KiB
Rust
51 lines
1.3 KiB
Rust
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
#[macro_escape];
|
|
|
|
macro_rules! rterrln (
|
|
($( $arg:expr),+) => ( {
|
|
::rt::util::dumb_println(fmt!( $($arg),+ ));
|
|
} )
|
|
)
|
|
|
|
// Some basic logging
|
|
macro_rules! rtdebug_ (
|
|
($( $arg:expr),+) => ( {
|
|
rterrln!( $($arg),+ )
|
|
} )
|
|
)
|
|
|
|
// An alternate version with no output, for turning off logging. An
|
|
// earlier attempt that did not call the fmt! macro was insufficient,
|
|
// as a case of the "let bind each variable" approach eventually
|
|
// failed without an error message describing the invocation site.
|
|
macro_rules! rtdebug (
|
|
($( $arg:expr),+) => ( {
|
|
let _x = fmt!( $($arg),+ );
|
|
})
|
|
)
|
|
|
|
macro_rules! rtassert (
|
|
( $arg:expr ) => ( {
|
|
if !$arg {
|
|
rtabort!("assertion failed: %s", stringify!($arg));
|
|
}
|
|
} )
|
|
)
|
|
|
|
|
|
macro_rules! rtabort(
|
|
($( $msg:expr),+) => ( {
|
|
::rt::util::abort(fmt!($($msg),+));
|
|
} )
|
|
)
|
|
|