Skip to content

Refactored the TLS use of the new runtime #8116

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 7 commits into from
9 changes: 7 additions & 2 deletions src/libstd/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,14 @@ macro_rules! rtdebug_ (
} )
)

// An alternate version with no output, for turning off logging
// 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 _ = $arg)*; )
($( $arg:expr),+) => ( {
let _x = fmt!( $($arg),+ );
})
)

macro_rules! rtassert (
Expand Down
15 changes: 7 additions & 8 deletions src/libstd/rt/comm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ use util::Void;
use comm::{GenericChan, GenericSmartChan, GenericPort, Peekable};
use cell::Cell;
use clone::Clone;
use rt::{context, SchedulerContext};

/// A combined refcount / BlockedTask-as-uint pointer.
///
Expand Down Expand Up @@ -90,6 +91,9 @@ impl<T> ChanOne<T> {
}

pub fn try_send(self, val: T) -> bool {

rtassert!(context() != SchedulerContext);

let mut this = self;
let mut recvr_active = true;
let packet = this.packet();
Expand Down Expand Up @@ -127,10 +131,7 @@ impl<T> ChanOne<T> {
// Port is blocked. Wake it up.
let recvr = BlockedTask::cast_from_uint(task_as_state);
do recvr.wake().map_consume |woken_task| {
let mut sched = Local::take::<Scheduler>();
rtdebug!("rendezvous send");
sched.metrics.rendezvous_sends += 1;
sched.schedule_task(woken_task);
Scheduler::run_task(woken_task);
};
}
}
Expand Down Expand Up @@ -346,8 +347,7 @@ impl<T> Drop for ChanOne<T> {
assert!((*this.packet()).payload.is_none());
let recvr = BlockedTask::cast_from_uint(task_as_state);
do recvr.wake().map_consume |woken_task| {
let sched = Local::take::<Scheduler>();
sched.schedule_task(woken_task);
Scheduler::run_task(woken_task);
};
}
}
Expand Down Expand Up @@ -743,7 +743,7 @@ mod test {
do run_in_newsched_task {
let (port, chan) = oneshot::<~int>();
let port_cell = Cell::new(port);
do spawntask_immediately {
do spawntask {
assert!(port_cell.take().recv() == ~10);
}

Expand Down Expand Up @@ -1019,5 +1019,4 @@ mod test {
}
}
}

}
6 changes: 3 additions & 3 deletions src/libstd/rt/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,11 @@ impl Context {
let argp: *c_void = unsafe { transmute::<&~fn(), *c_void>(&*start) };
let sp: *uint = stack.end();
let sp: *mut uint = unsafe { transmute_mut_unsafe(sp) };

// Save and then immediately load the current context,
// which we will then modify to call the given function when restored
let mut regs = new_regs();
unsafe {
swap_registers(transmute_mut_region(&mut *regs), transmute_region(&*regs))
swap_registers(transmute_mut_region(&mut *regs), transmute_region(&*regs));
};

initialize_call_frame(&mut *regs, fp, argp, sp);
Expand All @@ -72,13 +71,14 @@ impl Context {
then loading the registers from a previously saved Context.
*/
pub fn swap(out_context: &mut Context, in_context: &Context) {
rtdebug!("swapping contexts");
let out_regs: &mut Registers = match out_context {
&Context { regs: ~ref mut r, _ } => r
};
let in_regs: &Registers = match in_context {
&Context { regs: ~ref r, _ } => r
};

rtdebug!("doing raw swap");
unsafe { swap_registers(out_regs, in_regs) };
}
}
Expand Down
62 changes: 31 additions & 31 deletions src/libstd/rt/io/net/tcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,15 +186,15 @@ mod test {
do run_in_newsched_task {
let addr = next_test_ip4();

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
let mut stream = listener.accept();
let mut buf = [0];
stream.read(buf);
assert!(buf[0] == 99);
}

do spawntask_immediately {
do spawntask {
let mut stream = TcpStream::connect(addr);
stream.write([99]);
}
Expand All @@ -206,15 +206,15 @@ mod test {
do run_in_newsched_task {
let addr = next_test_ip6();

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
let mut stream = listener.accept();
let mut buf = [0];
stream.read(buf);
assert!(buf[0] == 99);
}

do spawntask_immediately {
do spawntask {
let mut stream = TcpStream::connect(addr);
stream.write([99]);
}
Expand All @@ -226,15 +226,15 @@ mod test {
do run_in_newsched_task {
let addr = next_test_ip4();

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
let mut stream = listener.accept();
let mut buf = [0];
let nread = stream.read(buf);
assert!(nread.is_none());
}

do spawntask_immediately {
do spawntask {
let _stream = TcpStream::connect(addr);
// Close
}
Expand All @@ -246,15 +246,15 @@ mod test {
do run_in_newsched_task {
let addr = next_test_ip6();

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
let mut stream = listener.accept();
let mut buf = [0];
let nread = stream.read(buf);
assert!(nread.is_none());
}

do spawntask_immediately {
do spawntask {
let _stream = TcpStream::connect(addr);
// Close
}
Expand All @@ -266,7 +266,7 @@ mod test {
do run_in_newsched_task {
let addr = next_test_ip4();

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
let mut stream = listener.accept();
let mut buf = [0];
Expand All @@ -276,7 +276,7 @@ mod test {
assert!(nread.is_none());
}

do spawntask_immediately {
do spawntask {
let _stream = TcpStream::connect(addr);
// Close
}
Expand All @@ -288,7 +288,7 @@ mod test {
do run_in_newsched_task {
let addr = next_test_ip6();

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
let mut stream = listener.accept();
let mut buf = [0];
Expand All @@ -298,7 +298,7 @@ mod test {
assert!(nread.is_none());
}

do spawntask_immediately {
do spawntask {
let _stream = TcpStream::connect(addr);
// Close
}
Expand All @@ -310,7 +310,7 @@ mod test {
do run_in_newsched_task {
let addr = next_test_ip4();

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
let mut stream = listener.accept();
let buf = [0];
Expand All @@ -327,7 +327,7 @@ mod test {
}
}

do spawntask_immediately {
do spawntask {
let _stream = TcpStream::connect(addr);
// Close
}
Expand All @@ -339,7 +339,7 @@ mod test {
do run_in_newsched_task {
let addr = next_test_ip6();

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
let mut stream = listener.accept();
let buf = [0];
Expand All @@ -356,7 +356,7 @@ mod test {
}
}

do spawntask_immediately {
do spawntask {
let _stream = TcpStream::connect(addr);
// Close
}
Expand All @@ -369,7 +369,7 @@ mod test {
let addr = next_test_ip4();
let max = 10;

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
do max.times {
let mut stream = listener.accept();
Expand All @@ -379,7 +379,7 @@ mod test {
}
}

do spawntask_immediately {
do spawntask {
do max.times {
let mut stream = TcpStream::connect(addr);
stream.write([99]);
Expand All @@ -394,7 +394,7 @@ mod test {
let addr = next_test_ip6();
let max = 10;

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
do max.times {
let mut stream = listener.accept();
Expand All @@ -404,7 +404,7 @@ mod test {
}
}

do spawntask_immediately {
do spawntask {
do max.times {
let mut stream = TcpStream::connect(addr);
stream.write([99]);
Expand All @@ -419,13 +419,13 @@ mod test {
let addr = next_test_ip4();
static MAX: int = 10;

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
for int::range(0, MAX) |i| {
let stream = Cell::new(listener.accept());
rtdebug!("accepted");
// Start another task to handle the connection
do spawntask_immediately {
do spawntask {
let mut stream = stream.take();
let mut buf = [0];
stream.read(buf);
Expand All @@ -440,7 +440,7 @@ mod test {
fn connect(i: int, addr: IpAddr) {
if i == MAX { return }

do spawntask_immediately {
do spawntask {
rtdebug!("connecting");
let mut stream = TcpStream::connect(addr);
// Connect again before writing
Expand All @@ -458,13 +458,13 @@ mod test {
let addr = next_test_ip6();
static MAX: int = 10;

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
for int::range(0, MAX) |i| {
let stream = Cell::new(listener.accept());
rtdebug!("accepted");
// Start another task to handle the connection
do spawntask_immediately {
do spawntask {
let mut stream = stream.take();
let mut buf = [0];
stream.read(buf);
Expand All @@ -479,7 +479,7 @@ mod test {
fn connect(i: int, addr: IpAddr) {
if i == MAX { return }

do spawntask_immediately {
do spawntask {
rtdebug!("connecting");
let mut stream = TcpStream::connect(addr);
// Connect again before writing
Expand All @@ -497,7 +497,7 @@ mod test {
let addr = next_test_ip4();
static MAX: int = 10;

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
for int::range(0, MAX) |_| {
let stream = Cell::new(listener.accept());
Expand Down Expand Up @@ -535,7 +535,7 @@ mod test {
let addr = next_test_ip6();
static MAX: int = 10;

do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);
for int::range(0, MAX) |_| {
let stream = Cell::new(listener.accept());
Expand Down Expand Up @@ -571,7 +571,7 @@ mod test {
#[cfg(test)]
fn socket_name(addr: IpAddr) {
do run_in_newsched_task {
do spawntask_immediately {
do spawntask {
let listener = TcpListener::bind(addr);

assert!(listener.is_some());
Expand All @@ -590,13 +590,13 @@ mod test {
#[cfg(test)]
fn peer_name(addr: IpAddr) {
do run_in_newsched_task {
do spawntask_immediately {
do spawntask {
let mut listener = TcpListener::bind(addr);

listener.accept();
}

do spawntask_immediately {
do spawntask {
let stream = TcpStream::connect(addr);

assert!(stream.is_some());
Expand Down
Loading