Skip to content

Commit f02cc6b

Browse files
committed
auto merge of #8411 : bblum/rust/assorted-fixes, r=brson
Each commit is pretty much what it says on the tin. r anybody.
2 parents c99b2b9 + 5ac8c57 commit f02cc6b

File tree

11 files changed

+469
-479
lines changed

11 files changed

+469
-479
lines changed

src/libstd/cell.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#[missing_doc];
1414

1515
use cast::transmute_mut;
16+
use unstable::finally::Finally;
1617
use prelude::*;
1718

1819
/*
@@ -65,18 +66,17 @@ impl<T> Cell<T> {
6566

6667
/// Calls a closure with a reference to the value.
6768
pub fn with_ref<R>(&self, op: &fn(v: &T) -> R) -> R {
68-
let v = self.take();
69-
let r = op(&v);
70-
self.put_back(v);
71-
r
69+
do self.with_mut_ref |ptr| { op(ptr) }
7270
}
7371

7472
/// Calls a closure with a mutable reference to the value.
7573
pub fn with_mut_ref<R>(&self, op: &fn(v: &mut T) -> R) -> R {
76-
let mut v = self.take();
77-
let r = op(&mut v);
78-
self.put_back(v);
79-
r
74+
let mut v = Some(self.take());
75+
do (|| {
76+
op(v.get_mut_ref())
77+
}).finally {
78+
self.put_back(v.take_unwrap());
79+
}
8080
}
8181
}
8282

src/libstd/rt/comm.rs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ use kinds::Send;
1818
use rt;
1919
use rt::sched::Scheduler;
2020
use rt::local::Local;
21-
use rt::select::{Select, SelectPort};
21+
use rt::select::{SelectInner, SelectPortInner};
22+
use select::{Select, SelectPort};
2223
use unstable::atomics::{AtomicUint, AtomicOption, Acquire, Relaxed, SeqCst};
2324
use unstable::sync::UnsafeAtomicRcBox;
2425
use util::Void;
@@ -113,7 +114,9 @@ impl<T> ChanOne<T> {
113114
// 'do_resched' configures whether the scheduler immediately switches to
114115
// the receiving task, or leaves the sending task still running.
115116
fn try_send_inner(self, val: T, do_resched: bool) -> bool {
116-
rtassert!(!rt::in_sched_context());
117+
if do_resched {
118+
rtassert!(!rt::in_sched_context());
119+
}
117120

118121
let mut this = self;
119122
let mut recvr_active = true;
@@ -215,7 +218,7 @@ impl<T> PortOne<T> {
215218
}
216219
}
217220

218-
impl<T> Select for PortOne<T> {
221+
impl<T> SelectInner for PortOne<T> {
219222
#[inline] #[cfg(not(test))]
220223
fn optimistic_check(&mut self) -> bool {
221224
unsafe { (*self.packet()).state.load(Acquire) == STATE_ONE }
@@ -318,7 +321,9 @@ impl<T> Select for PortOne<T> {
318321
}
319322
}
320323

321-
impl<T> SelectPort<T> for PortOne<T> {
324+
impl<T> Select for PortOne<T> { }
325+
326+
impl<T> SelectPortInner<T> for PortOne<T> {
322327
fn recv_ready(self) -> Option<T> {
323328
let mut this = self;
324329
let packet = this.packet();
@@ -349,6 +354,8 @@ impl<T> SelectPort<T> for PortOne<T> {
349354
}
350355
}
351356

357+
impl<T> SelectPort<T> for PortOne<T> { }
358+
352359
impl<T> Peekable<T> for PortOne<T> {
353360
fn peek(&self) -> bool {
354361
unsafe {
@@ -513,7 +520,7 @@ impl<T> Peekable<T> for Port<T> {
513520
// of them, but a &Port<T> should also be selectable so you can select2 on it
514521
// alongside a PortOne<U> without passing the port by value in recv_ready.
515522

516-
impl<'self, T> Select for &'self Port<T> {
523+
impl<'self, T> SelectInner for &'self Port<T> {
517524
#[inline]
518525
fn optimistic_check(&mut self) -> bool {
519526
do self.next.with_mut_ref |pone| { pone.optimistic_check() }
@@ -531,7 +538,9 @@ impl<'self, T> Select for &'self Port<T> {
531538
}
532539
}
533540

534-
impl<T> Select for Port<T> {
541+
impl<'self, T> Select for &'self Port<T> { }
542+
543+
impl<T> SelectInner for Port<T> {
535544
#[inline]
536545
fn optimistic_check(&mut self) -> bool {
537546
(&*self).optimistic_check()
@@ -548,7 +557,9 @@ impl<T> Select for Port<T> {
548557
}
549558
}
550559

551-
impl<'self, T> SelectPort<T> for &'self Port<T> {
560+
impl<T> Select for Port<T> { }
561+
562+
impl<'self, T> SelectPortInner<T> for &'self Port<T> {
552563
fn recv_ready(self) -> Option<T> {
553564
match self.next.take().recv_ready() {
554565
Some(StreamPayload { val, next }) => {
@@ -560,6 +571,8 @@ impl<'self, T> SelectPort<T> for &'self Port<T> {
560571
}
561572
}
562573

574+
impl<'self, T> SelectPort<T> for &'self Port<T> { }
575+
563576
pub struct SharedChan<T> {
564577
// Just like Chan, but a shared AtomicOption instead of Cell
565578
priv next: UnsafeAtomicRcBox<AtomicOption<StreamChanOne<T>>>

src/libstd/rt/kill.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -488,8 +488,8 @@ impl Death {
488488
rtassert!(self.unkillable == 0);
489489
self.unkillable = 1;
490490

491-
// FIXME(#7544): See corresponding fixme at the callsite in task.rs.
492-
// NB(#8192): Doesn't work with "let _ = ..."
491+
// NB. See corresponding comment at the callsite in task.rs.
492+
// FIXME(#8192): Doesn't work with "let _ = ..."
493493
{ use util; util::ignore(group); }
494494

495495
// Step 1. Decide if we need to collect child failures synchronously.

src/libstd/rt/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,7 @@ pub mod tube;
142142
/// Simple reimplementation of core::comm
143143
pub mod comm;
144144

145-
/// Routines for select()ing on pipes.
146-
pub mod select;
145+
mod select;
147146

148147
// FIXME #5248 shouldn't be pub
149148
/// The runtime needs to be able to put a pointer into thread-local storage.

0 commit comments

Comments
 (0)