Skip to content

Commit dc5b0b9

Browse files
committed
auto merge of #8282 : brson/rust/more-newsched-fixes, r=brson
2 parents 77bc6c5 + 3f4c6ce commit dc5b0b9

File tree

9 files changed

+75
-258
lines changed

9 files changed

+75
-258
lines changed

src/libextra/comm.rs

+1-8
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ Higher level communication abstractions.
1818

1919

2020
use std::comm::{GenericChan, GenericSmartChan, GenericPort};
21-
use std::comm::{Chan, Port, Selectable, Peekable};
21+
use std::comm::{Chan, Port, Peekable};
2222
use std::comm;
23-
use std::pipes;
2423

2524
/// An extension of `pipes::stream` that allows both sending and receiving.
2625
pub struct DuplexStream<T, U> {
@@ -75,12 +74,6 @@ impl<T:Send,U:Send> Peekable<U> for DuplexStream<T, U> {
7574
}
7675
}
7776

78-
impl<T:Send,U:Send> Selectable for DuplexStream<T, U> {
79-
fn header(&mut self) -> *mut pipes::PacketHeader {
80-
self.port.header()
81-
}
82-
}
83-
8477
/// Creates a bidirectional stream.
8578
pub fn DuplexStream<T:Send,U:Send>()
8679
-> (DuplexStream<T, U>, DuplexStream<U, T>)

src/libstd/comm.rs

+2-108
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ Message passing
1414

1515
#[allow(missing_doc)];
1616

17-
use cast::transmute;
1817
use either::{Either, Left, Right};
1918
use kinds::Send;
2019
use option::{Option, Some};
@@ -23,12 +22,6 @@ pub use rt::comm::SendDeferred;
2322
use rtcomm = rt::comm;
2423
use rt;
2524

26-
use pipes::{wait_many, PacketHeader};
27-
28-
// FIXME #5160: Making this public exposes some plumbing from
29-
// pipes. Needs some refactoring
30-
pub use pipes::Selectable;
31-
3225
/// A trait for things that can send multiple messages.
3326
pub trait GenericChan<T> {
3427
/// Sends a message.
@@ -146,15 +139,6 @@ impl<T: Send> Peekable<T> for Port<T> {
146139
}
147140
}
148141

149-
impl<T: Send> Selectable for Port<T> {
150-
fn header(&mut self) -> *mut PacketHeader {
151-
match self.inner {
152-
Left(ref mut port) => port.header(),
153-
Right(_) => fail!("can't select on newsched ports")
154-
}
155-
}
156-
}
157-
158142
/// A channel that can be shared between many senders.
159143
pub struct SharedChan<T> {
160144
inner: Either<Exclusive<pipesy::Chan<T>>, rtcomm::SharedChan<T>>
@@ -318,8 +302,8 @@ mod pipesy {
318302

319303
use kinds::Send;
320304
use option::{Option, Some, None};
321-
use pipes::{recv, try_recv, peek, PacketHeader};
322-
use super::{GenericChan, GenericSmartChan, GenericPort, Peekable, Selectable};
305+
use pipes::{recv, try_recv, peek};
306+
use super::{GenericChan, GenericSmartChan, GenericPort, Peekable};
323307
use cast::transmute_mut;
324308

325309
/*proto! oneshot (
@@ -651,103 +635,13 @@ mod pipesy {
651635
}
652636
}
653637

654-
impl<T: Send> Selectable for Port<T> {
655-
fn header(&mut self) -> *mut PacketHeader {
656-
match self.endp {
657-
Some(ref mut endp) => endp.header(),
658-
None => fail!("peeking empty stream")
659-
}
660-
}
661-
}
662-
663-
}
664-
665-
/// Returns the index of an endpoint that is ready to receive.
666-
pub fn selecti<T: Selectable>(endpoints: &mut [T]) -> uint {
667-
wait_many(endpoints)
668-
}
669-
670-
/// Returns 0 or 1 depending on which endpoint is ready to receive
671-
pub fn select2i<A:Selectable, B:Selectable>(a: &mut A, b: &mut B)
672-
-> Either<(), ()> {
673-
let mut endpoints = [ a.header(), b.header() ];
674-
match wait_many(endpoints) {
675-
0 => Left(()),
676-
1 => Right(()),
677-
_ => fail!("wait returned unexpected index"),
678-
}
679-
}
680-
681-
/// Receive a message from one of two endpoints.
682-
pub trait Select2<T: Send, U: Send> {
683-
/// Receive a message or return `None` if a connection closes.
684-
fn try_select(&mut self) -> Either<Option<T>, Option<U>>;
685-
/// Receive a message or fail if a connection closes.
686-
fn select(&mut self) -> Either<T, U>;
687-
}
688-
689-
impl<T:Send,
690-
U:Send,
691-
Left:Selectable + GenericPort<T>,
692-
Right:Selectable + GenericPort<U>>
693-
Select2<T, U>
694-
for (Left, Right) {
695-
fn select(&mut self) -> Either<T, U> {
696-
// XXX: Bad borrow check workaround.
697-
unsafe {
698-
let this: &(Left, Right) = transmute(self);
699-
match *this {
700-
(ref lp, ref rp) => {
701-
let lp: &mut Left = transmute(lp);
702-
let rp: &mut Right = transmute(rp);
703-
match select2i(lp, rp) {
704-
Left(()) => Left(lp.recv()),
705-
Right(()) => Right(rp.recv()),
706-
}
707-
}
708-
}
709-
}
710-
}
711-
712-
fn try_select(&mut self) -> Either<Option<T>, Option<U>> {
713-
// XXX: Bad borrow check workaround.
714-
unsafe {
715-
let this: &(Left, Right) = transmute(self);
716-
match *this {
717-
(ref lp, ref rp) => {
718-
let lp: &mut Left = transmute(lp);
719-
let rp: &mut Right = transmute(rp);
720-
match select2i(lp, rp) {
721-
Left(()) => Left (lp.try_recv()),
722-
Right(()) => Right(rp.try_recv()),
723-
}
724-
}
725-
}
726-
}
727-
}
728638
}
729639

730640
#[cfg(test)]
731641
mod test {
732642
use either::Right;
733643
use super::{Chan, Port, oneshot, stream};
734644

735-
#[test]
736-
fn test_select2() {
737-
let (p1, c1) = stream();
738-
let (p2, c2) = stream();
739-
740-
c1.send(~"abc");
741-
742-
let mut tuple = (p1, p2);
743-
match tuple.select() {
744-
Right(_) => fail!(),
745-
_ => (),
746-
}
747-
748-
c2.send(123);
749-
}
750-
751645
#[test]
752646
fn test_oneshot() {
753647
let (p, c) = oneshot();

src/libstd/pipes.rs

-44
Original file line numberDiff line numberDiff line change
@@ -868,47 +868,3 @@ pub mod rt {
868868
pub fn make_some<T>(val: T) -> Option<T> { Some(val) }
869869
pub fn make_none<T>() -> Option<T> { None }
870870
}
871-
872-
#[cfg(test)]
873-
mod test {
874-
use either::Right;
875-
use comm::{Chan, Port, oneshot, recv_one, stream, Select2,
876-
GenericChan, Peekable};
877-
878-
#[test]
879-
fn test_select2() {
880-
let (p1, c1) = stream();
881-
let (p2, c2) = stream();
882-
883-
c1.send(~"abc");
884-
885-
let mut tuple = (p1, p2);
886-
match tuple.select() {
887-
Right(_) => fail!(),
888-
_ => (),
889-
}
890-
891-
c2.send(123);
892-
}
893-
894-
#[test]
895-
fn test_oneshot() {
896-
let (p, c) = oneshot();
897-
898-
c.send(());
899-
900-
recv_one(p)
901-
}
902-
903-
#[test]
904-
fn test_peek_terminated() {
905-
let (port, chan): (Port<int>, Chan<int>) = stream();
906-
907-
{
908-
// Destroy the channel
909-
let _chan = chan;
910-
}
911-
912-
assert!(!port.peek());
913-
}
914-
}

src/libstd/rt/local.rs

+45-36
Original file line numberDiff line numberDiff line change
@@ -126,63 +126,72 @@ impl Local for IoFactoryObject {
126126

127127
#[cfg(test)]
128128
mod test {
129+
use unstable::run_in_bare_thread;
129130
use rt::test::*;
130131
use super::*;
131132
use rt::task::Task;
132133
use rt::local_ptr;
133134

134135
#[test]
135136
fn thread_local_task_smoke_test() {
136-
local_ptr::init_tls_key();
137-
let mut sched = ~new_test_uv_sched();
138-
let task = ~Task::new_root(&mut sched.stack_pool, || {});
139-
Local::put(task);
140-
let task: ~Task = Local::take();
141-
cleanup_task(task);
137+
do run_in_bare_thread {
138+
local_ptr::init_tls_key();
139+
let mut sched = ~new_test_uv_sched();
140+
let task = ~Task::new_root(&mut sched.stack_pool, || {});
141+
Local::put(task);
142+
let task: ~Task = Local::take();
143+
cleanup_task(task);
144+
}
142145
}
143146

144147
#[test]
145148
fn thread_local_task_two_instances() {
146-
local_ptr::init_tls_key();
147-
let mut sched = ~new_test_uv_sched();
148-
let task = ~Task::new_root(&mut sched.stack_pool, || {});
149-
Local::put(task);
150-
let task: ~Task = Local::take();
151-
cleanup_task(task);
152-
let task = ~Task::new_root(&mut sched.stack_pool, || {});
153-
Local::put(task);
154-
let task: ~Task = Local::take();
155-
cleanup_task(task);
149+
do run_in_bare_thread {
150+
local_ptr::init_tls_key();
151+
let mut sched = ~new_test_uv_sched();
152+
let task = ~Task::new_root(&mut sched.stack_pool, || {});
153+
Local::put(task);
154+
let task: ~Task = Local::take();
155+
cleanup_task(task);
156+
let task = ~Task::new_root(&mut sched.stack_pool, || {});
157+
Local::put(task);
158+
let task: ~Task = Local::take();
159+
cleanup_task(task);
160+
}
156161

157162
}
158163

159164
#[test]
160165
fn borrow_smoke_test() {
161-
local_ptr::init_tls_key();
162-
let mut sched = ~new_test_uv_sched();
163-
let task = ~Task::new_root(&mut sched.stack_pool, || {});
164-
Local::put(task);
165-
166-
unsafe {
167-
let _task: *mut Task = Local::unsafe_borrow();
166+
do run_in_bare_thread {
167+
local_ptr::init_tls_key();
168+
let mut sched = ~new_test_uv_sched();
169+
let task = ~Task::new_root(&mut sched.stack_pool, || {});
170+
Local::put(task);
171+
172+
unsafe {
173+
let _task: *mut Task = Local::unsafe_borrow();
174+
}
175+
let task: ~Task = Local::take();
176+
cleanup_task(task);
168177
}
169-
let task: ~Task = Local::take();
170-
cleanup_task(task);
171178
}
172179

173180
#[test]
174181
fn borrow_with_return() {
175-
local_ptr::init_tls_key();
176-
let mut sched = ~new_test_uv_sched();
177-
let task = ~Task::new_root(&mut sched.stack_pool, || {});
178-
Local::put(task);
179-
180-
let res = do Local::borrow::<Task,bool> |_task| {
181-
true
182-
};
183-
assert!(res)
184-
let task: ~Task = Local::take();
185-
cleanup_task(task);
182+
do run_in_bare_thread {
183+
local_ptr::init_tls_key();
184+
let mut sched = ~new_test_uv_sched();
185+
let task = ~Task::new_root(&mut sched.stack_pool, || {});
186+
Local::put(task);
187+
188+
let res = do Local::borrow::<Task,bool> |_task| {
189+
true
190+
};
191+
assert!(res)
192+
let task: ~Task = Local::take();
193+
cleanup_task(task);
194+
}
186195
}
187196

188197
}

src/libstd/rt/local_ptr.rs

+15-11
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ pub unsafe fn put<T>(sched: ~T) {
5252
pub unsafe fn take<T>() -> ~T {
5353
let key = tls_key();
5454
let void_ptr: *mut c_void = tls::get(key);
55-
rtassert!(void_ptr.is_not_null());
55+
if void_ptr.is_null() {
56+
rtabort!("thread-local pointer is null. bogus!");
57+
}
5658
let ptr: ~T = cast::transmute(void_ptr);
5759
tls::set(key, ptr::mut_null());
5860
return ptr;
@@ -68,8 +70,8 @@ pub fn exists() -> bool {
6870
}
6971
}
7072

71-
/// Borrow the thread-local scheduler from thread-local storage.
72-
/// While the scheduler is borrowed it is not available in TLS.
73+
/// Borrow the thread-local value from thread-local storage.
74+
/// While the value is borrowed it is not available in TLS.
7375
///
7476
/// # Safety note
7577
///
@@ -88,21 +90,23 @@ pub unsafe fn borrow<T>(f: &fn(&mut T)) {
8890
}
8991
}
9092

91-
/// Borrow a mutable reference to the thread-local Scheduler
93+
/// Borrow a mutable reference to the thread-local value
9294
///
9395
/// # Safety Note
9496
///
95-
/// Because this leaves the Scheduler in thread-local storage it is possible
97+
/// Because this leaves the value in thread-local storage it is possible
9698
/// For the Scheduler pointer to be aliased
9799
pub unsafe fn unsafe_borrow<T>() -> *mut T {
98100
let key = tls_key();
99-
let mut void_sched: *mut c_void = tls::get(key);
100-
rtassert!(void_sched.is_not_null());
101+
let mut void_ptr: *mut c_void = tls::get(key);
102+
if void_ptr.is_null() {
103+
rtabort!("thread-local pointer is null. bogus!");
104+
}
101105
{
102-
let sched: *mut *mut c_void = &mut void_sched;
103-
let sched: *mut ~T = sched as *mut ~T;
104-
let sched: *mut T = &mut **sched;
105-
return sched;
106+
let ptr: *mut *mut c_void = &mut void_ptr;
107+
let ptr: *mut ~T = ptr as *mut ~T;
108+
let ptr: *mut T = &mut **ptr;
109+
return ptr;
106110
}
107111
}
108112

0 commit comments

Comments
 (0)