12
12
Message passing
13
13
*/
14
14
15
- use cast:: transmute;
15
+ use cast:: { transmute, transmute_mut } ;
16
16
use cast;
17
17
use either:: { Either , Left , Right } ;
18
18
use kinds:: Owned ;
@@ -119,13 +119,15 @@ pub mod streamp {
119
119
}
120
120
121
121
/// An endpoint that can send many messages.
122
+ #[ unsafe_mut_field( endp) ]
122
123
pub struct Chan < T > {
123
- mut endp : Option < streamp:: client:: Open < T > >
124
+ endp : Option < streamp:: client:: Open < T > >
124
125
}
125
126
126
127
/// An endpoint that can receive many messages.
128
+ #[ unsafe_mut_field( endp) ]
127
129
pub struct Port < T > {
128
- mut endp : Option < streamp:: server:: Open < T > > ,
130
+ endp : Option < streamp:: server:: Open < T > > ,
129
131
}
130
132
131
133
/** Creates a `(Port, Chan)` pair.
@@ -136,69 +138,87 @@ These allow sending or receiving an unlimited number of messages.
136
138
pub fn stream < T : Owned > ( ) -> ( Port < T > , Chan < T > ) {
137
139
let ( c, s) = streamp:: init ( ) ;
138
140
139
- ( Port { endp : Some ( s) } , Chan { endp : Some ( c) } )
141
+ ( Port {
142
+ endp : Some ( s)
143
+ } , Chan {
144
+ endp : Some ( c)
145
+ } )
140
146
}
141
147
142
148
impl < T : Owned > GenericChan < T > for Chan < T > {
143
149
#[ inline( always) ]
144
150
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
+ }
149
157
}
150
158
}
151
159
152
160
impl < T : Owned > GenericSmartChan < T > for Chan < T > {
153
161
#[ inline( always) ]
154
162
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
161
173
}
162
- None => false
163
174
}
164
175
}
165
176
}
166
177
167
178
impl < T : Owned > GenericPort < T > for Port < T > {
168
179
#[ inline( always) ]
169
180
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
+ }
175
189
}
176
190
177
191
#[ inline( always) ]
178
192
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
185
203
}
186
- None => None
187
204
}
188
205
}
189
206
}
190
207
191
208
impl < T : Owned > Peekable < T > for Port < T > {
192
209
#[ inline( always) ]
193
210
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
+ }
202
222
}
203
223
}
204
224
@@ -219,7 +239,6 @@ pub struct PortSet<T> {
219
239
}
220
240
221
241
pub impl<T: Owned> PortSet<T> {
222
-
223
242
fn new() -> PortSet<T> {
224
243
PortSet {
225
244
ports: ~[]
0 commit comments