@@ -45,23 +45,12 @@ struct Packet<T> {
45
45
46
46
/// A one-shot channel.
47
47
pub struct ChanOne < T > {
48
- // XXX: Hack extra allocation to make by-val self work
49
- inner : ~ChanOneHack < T >
50
- }
51
-
52
-
53
- /// A one-shot port.
54
- pub struct PortOne < T > {
55
- // XXX: Hack extra allocation to make by-val self work
56
- inner : ~PortOneHack < T >
57
- }
58
-
59
- pub struct ChanOneHack < T > {
60
48
void_packet : * mut Void ,
61
49
suppress_finalize : bool
62
50
}
63
51
64
- pub struct PortOneHack < T > {
52
+ /// A one-shot port.
53
+ pub struct PortOne < T > {
65
54
void_packet : * mut Void ,
66
55
suppress_finalize : bool
67
56
}
@@ -75,22 +64,25 @@ pub fn oneshot<T: Send>() -> (PortOne<T>, ChanOne<T>) {
75
64
unsafe {
76
65
let packet: * mut Void = cast:: transmute ( packet) ;
77
66
let port = PortOne {
78
- inner : ~PortOneHack {
79
- void_packet : packet,
80
- suppress_finalize : false
81
- }
67
+ void_packet : packet,
68
+ suppress_finalize : false
82
69
} ;
83
70
let chan = ChanOne {
84
- inner : ~ChanOneHack {
85
- void_packet : packet,
86
- suppress_finalize : false
87
- }
71
+ void_packet : packet,
72
+ suppress_finalize : false
88
73
} ;
89
74
return ( port, chan) ;
90
75
}
91
76
}
92
77
93
78
impl < T > ChanOne < T > {
79
+ fn packet ( & self ) -> * mut Packet < T > {
80
+ unsafe {
81
+ let p: * mut ~Packet < T > = cast:: transmute ( & self . void_packet ) ;
82
+ let p: * mut Packet < T > = & mut * * p;
83
+ return p;
84
+ }
85
+ }
94
86
95
87
pub fn send ( self , val : T ) {
96
88
self . try_send ( val) ;
@@ -99,7 +91,7 @@ impl<T> ChanOne<T> {
99
91
pub fn try_send ( self , val : T ) -> bool {
100
92
let mut this = self ;
101
93
let mut recvr_active = true ;
102
- let packet = this. inner . packet ( ) ;
94
+ let packet = this. packet ( ) ;
103
95
104
96
unsafe {
105
97
@@ -127,7 +119,7 @@ impl<T> ChanOne<T> {
127
119
sched. metrics . rendezvous_sends += 1 ;
128
120
}
129
121
// Port has closed. Need to clean up.
130
- let _packet: ~Packet < T > = cast:: transmute ( this. inner . void_packet ) ;
122
+ let _packet: ~Packet < T > = cast:: transmute ( this. void_packet ) ;
131
123
recvr_active = false ;
132
124
}
133
125
task_as_state => {
@@ -144,13 +136,21 @@ impl<T> ChanOne<T> {
144
136
}
145
137
146
138
// Suppress the synchronizing actions in the finalizer. We're done with the packet.
147
- this. inner . suppress_finalize = true ;
139
+ this. suppress_finalize = true ;
148
140
return recvr_active;
149
141
}
150
142
}
151
143
152
144
153
145
impl < T > PortOne < T > {
146
+ fn packet ( & self ) -> * mut Packet < T > {
147
+ unsafe {
148
+ let p: * mut ~Packet < T > = cast:: transmute ( & self . void_packet ) ;
149
+ let p: * mut Packet < T > = & mut * * p;
150
+ return p;
151
+ }
152
+ }
153
+
154
154
pub fn recv ( self ) -> T {
155
155
match self . try_recv ( ) {
156
156
Some ( val) => val,
@@ -162,7 +162,7 @@ impl<T> PortOne<T> {
162
162
163
163
pub fn try_recv ( self ) -> Option < T > {
164
164
let mut this = self ;
165
- let packet = this. inner . packet ( ) ;
165
+ let packet = this. packet ( ) ;
166
166
167
167
// XXX: Optimize this to not require the two context switches when data is available
168
168
@@ -215,9 +215,9 @@ impl<T> PortOne<T> {
215
215
let payload = util:: replace ( & mut ( * packet) . payload , None ) ;
216
216
217
217
// The sender has closed up shop. Drop the packet.
218
- let _packet: ~Packet < T > = cast:: transmute ( this. inner . void_packet ) ;
218
+ let _packet: ~Packet < T > = cast:: transmute ( this. void_packet ) ;
219
219
// Suppress the synchronizing actions in the finalizer. We're done with the packet.
220
- this. inner . suppress_finalize = true ;
220
+ this. suppress_finalize = true ;
221
221
return payload;
222
222
}
223
223
}
@@ -226,7 +226,7 @@ impl<T> PortOne<T> {
226
226
impl < T > Peekable < T > for PortOne < T > {
227
227
fn peek ( & self ) -> bool {
228
228
unsafe {
229
- let packet: * mut Packet < T > = self . inner . packet ( ) ;
229
+ let packet: * mut Packet < T > = self . packet ( ) ;
230
230
let oldstate = ( * packet) . state . load ( SeqCst ) ;
231
231
match oldstate {
232
232
STATE_BOTH => false ,
@@ -238,7 +238,7 @@ impl<T> Peekable<T> for PortOne<T> {
238
238
}
239
239
240
240
#[ unsafe_destructor]
241
- impl < T > Drop for ChanOneHack < T > {
241
+ impl < T > Drop for ChanOne < T > {
242
242
fn drop ( & self ) {
243
243
if self . suppress_finalize { return }
244
244
@@ -267,7 +267,7 @@ impl<T> Drop for ChanOneHack<T> {
267
267
}
268
268
269
269
#[ unsafe_destructor]
270
- impl < T > Drop for PortOneHack < T > {
270
+ impl < T > Drop for PortOne < T > {
271
271
fn drop ( & self ) {
272
272
if self . suppress_finalize { return }
273
273
@@ -295,26 +295,6 @@ impl<T> Drop for PortOneHack<T> {
295
295
}
296
296
}
297
297
298
- impl < T > ChanOneHack < T > {
299
- fn packet ( & self ) -> * mut Packet < T > {
300
- unsafe {
301
- let p: * mut ~Packet < T > = cast:: transmute ( & self . void_packet ) ;
302
- let p: * mut Packet < T > = & mut * * p;
303
- return p;
304
- }
305
- }
306
- }
307
-
308
- impl < T > PortOneHack < T > {
309
- fn packet ( & self ) -> * mut Packet < T > {
310
- unsafe {
311
- let p: * mut ~Packet < T > = cast:: transmute ( & self . void_packet ) ;
312
- let p: * mut Packet < T > = & mut * * p;
313
- return p;
314
- }
315
- }
316
- }
317
-
318
298
struct StreamPayload < T > {
319
299
val : T ,
320
300
next : PortOne < StreamPayload < T > >
0 commit comments