Skip to content

Commit 8919f32

Browse files
committed
Remove mutable fields from comm by using casts. Also mark the cast in cell.
1 parent 5650779 commit 8919f32

File tree

1 file changed

+55
-36
lines changed

1 file changed

+55
-36
lines changed

src/libcore/comm.rs

Lines changed: 55 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
Message passing
1313
*/
1414

15-
use cast::transmute;
15+
use cast::{transmute, transmute_mut};
1616
use cast;
1717
use either::{Either, Left, Right};
1818
use kinds::Owned;
@@ -119,13 +119,15 @@ pub mod streamp {
119119
}
120120

121121
/// An endpoint that can send many messages.
122+
#[unsafe_mut_field(endp)]
122123
pub struct Chan<T> {
123-
mut endp: Option<streamp::client::Open<T>>
124+
endp: Option<streamp::client::Open<T>>
124125
}
125126

126127
/// An endpoint that can receive many messages.
128+
#[unsafe_mut_field(endp)]
127129
pub struct Port<T> {
128-
mut endp: Option<streamp::server::Open<T>>,
130+
endp: Option<streamp::server::Open<T>>,
129131
}
130132

131133
/** Creates a `(Port, Chan)` pair.
@@ -136,69 +138,87 @@ These allow sending or receiving an unlimited number of messages.
136138
pub fn stream<T:Owned>() -> (Port<T>, Chan<T>) {
137139
let (c, s) = streamp::init();
138140

139-
(Port { endp: Some(s) }, Chan { endp: Some(c) })
141+
(Port {
142+
endp: Some(s)
143+
}, Chan {
144+
endp: Some(c)
145+
})
140146
}
141147

142148
impl<T: Owned> GenericChan<T> for Chan<T> {
143149
#[inline(always)]
144150
fn send(&self, x: T) {
145-
let mut endp = None;
146-
endp <-> self.endp;
147-
self.endp = Some(
148-
streamp::client::data(endp.unwrap(), x))
151+
unsafe {
152+
let mut endp = None;
153+
let mut self_endp = transmute_mut(&self.endp);
154+
endp <-> *self_endp;
155+
*self_endp = Some(streamp::client::data(endp.unwrap(), x))
156+
}
149157
}
150158
}
151159

152160
impl<T: Owned> GenericSmartChan<T> for Chan<T> {
153161
#[inline(always)]
154162
fn try_send(&self, x: T) -> bool {
155-
let mut endp = None;
156-
endp <-> self.endp;
157-
match streamp::client::try_data(endp.unwrap(), x) {
158-
Some(next) => {
159-
self.endp = Some(next);
160-
true
163+
unsafe {
164+
let mut endp = None;
165+
let mut self_endp = transmute_mut(&self.endp);
166+
endp <-> *self_endp;
167+
match streamp::client::try_data(endp.unwrap(), x) {
168+
Some(next) => {
169+
*self_endp = Some(next);
170+
true
171+
}
172+
None => false
161173
}
162-
None => false
163174
}
164175
}
165176
}
166177

167178
impl<T: Owned> GenericPort<T> for Port<T> {
168179
#[inline(always)]
169180
fn recv(&self) -> T {
170-
let mut endp = None;
171-
endp <-> self.endp;
172-
let streamp::data(x, endp) = recv(endp.unwrap());
173-
self.endp = Some(endp);
174-
x
181+
unsafe {
182+
let mut endp = None;
183+
let mut self_endp = transmute_mut(&self.endp);
184+
endp <-> *self_endp;
185+
let streamp::data(x, endp) = recv(endp.unwrap());
186+
*self_endp = Some(endp);
187+
x
188+
}
175189
}
176190

177191
#[inline(always)]
178192
fn try_recv(&self) -> Option<T> {
179-
let mut endp = None;
180-
endp <-> self.endp;
181-
match try_recv(endp.unwrap()) {
182-
Some(streamp::data(x, endp)) => {
183-
self.endp = Some(endp);
184-
Some(x)
193+
unsafe {
194+
let mut endp = None;
195+
let mut self_endp = transmute_mut(&self.endp);
196+
endp <-> *self_endp;
197+
match try_recv(endp.unwrap()) {
198+
Some(streamp::data(x, endp)) => {
199+
*self_endp = Some(endp);
200+
Some(x)
201+
}
202+
None => None
185203
}
186-
None => None
187204
}
188205
}
189206
}
190207

191208
impl<T: Owned> Peekable<T> for Port<T> {
192209
#[inline(always)]
193210
fn peek(&self) -> bool {
194-
let mut endp = None;
195-
endp <-> self.endp;
196-
let peek = match endp {
197-
Some(ref mut endp) => peek(endp),
198-
None => fail!(~"peeking empty stream")
199-
};
200-
self.endp <-> endp;
201-
peek
211+
unsafe {
212+
let mut endp = None;
213+
let mut self_endp = transmute_mut(&self.endp);
214+
endp <-> *self_endp;
215+
let peek = match endp {
216+
Some(ref mut endp) => peek(endp),
217+
None => fail!(~"peeking empty stream")
218+
};
219+
*self_endp <-> endp;
220+
peek
221+
}
202222
}
203223
}
204224
@@ -219,7 +239,6 @@ pub struct PortSet<T> {
219239
}
220240
221241
pub impl<T: Owned> PortSet<T> {
222-
223242
fn new() -> PortSet<T> {
224243
PortSet {
225244
ports: ~[]

0 commit comments

Comments
 (0)