Skip to content

Commit 387eab6

Browse files
committed
---
yaml --- r: 151891 b: refs/heads/try2 c: 2966e97 h: refs/heads/master i: 151889: f60f091 151887: 09563f1 v: v3
1 parent 70f4c53 commit 387eab6

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 7db02e20f2140530a9402f7d7452b10cac6fdf7b
8+
refs/heads/try2: 2966e970cabdf7103ad61c840c72bf58352150e0
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libstd/sync/mpsc_queue.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ use option::{Option, None, Some};
4545
use owned::Box;
4646
use ptr::RawPtr;
4747
use sync::atomics::{AtomicPtr, Release, Acquire, AcqRel, Relaxed};
48+
use ty::Unsafe;
4849

4950
/// A result of the `pop` function.
5051
pub enum PopResult<T> {
@@ -69,7 +70,7 @@ struct Node<T> {
6970
/// popper at a time (many pushers are allowed).
7071
pub struct Queue<T> {
7172
head: AtomicPtr<Node<T>>,
72-
tail: *mut Node<T>,
73+
tail: Unsafe<*mut Node<T>>,
7374
}
7475

7576
impl<T> Node<T> {
@@ -88,12 +89,12 @@ impl<T: Send> Queue<T> {
8889
let stub = unsafe { Node::new(None) };
8990
Queue {
9091
head: AtomicPtr::new(stub),
91-
tail: stub,
92+
tail: Unsafe::new(stub),
9293
}
9394
}
9495

9596
/// Pushes a new value onto this queue.
96-
pub fn push(&mut self, t: T) {
97+
pub fn push(&self, t: T) {
9798
unsafe {
9899
let n = Node::new(Some(t));
99100
let prev = self.head.swap(n, AcqRel);
@@ -111,13 +112,13 @@ impl<T: Send> Queue<T> {
111112
///
112113
/// This inconsistent state means that this queue does indeed have data, but
113114
/// it does not currently have access to it at this time.
114-
pub fn pop(&mut self) -> PopResult<T> {
115+
pub fn pop(&self) -> PopResult<T> {
115116
unsafe {
116-
let tail = self.tail;
117+
let tail = *self.tail.get();
117118
let next = (*tail).next.load(Acquire);
118119

119120
if !next.is_null() {
120-
self.tail = next;
121+
*self.tail.get() = next;
121122
assert!((*tail).value.is_none());
122123
assert!((*next).value.is_some());
123124
let ret = (*next).value.take_unwrap();
@@ -131,7 +132,7 @@ impl<T: Send> Queue<T> {
131132

132133
/// Attempts to pop data from this queue, but doesn't attempt too hard. This
133134
/// will canonicalize inconsistent states to a `None` value.
134-
pub fn casual_pop(&mut self) -> Option<T> {
135+
pub fn casual_pop(&self) -> Option<T> {
135136
match self.pop() {
136137
Data(t) => Some(t),
137138
Empty | Inconsistent => None,
@@ -143,7 +144,7 @@ impl<T: Send> Queue<T> {
143144
impl<T: Send> Drop for Queue<T> {
144145
fn drop(&mut self) {
145146
unsafe {
146-
let mut cur = self.tail;
147+
let mut cur = *self.tail.get();
147148
while !cur.is_null() {
148149
let next = (*cur).next.load(Relaxed);
149150
let _: Box<Node<T>> = mem::transmute(cur);

0 commit comments

Comments
 (0)