Skip to content

Commit 1137fbd

Browse files
committed
Remove ChanOneHack/PortOneHack extra allocation
1 parent 2830d7d commit 1137fbd

File tree

1 file changed

+30
-50
lines changed

1 file changed

+30
-50
lines changed

src/libstd/rt/comm.rs

Lines changed: 30 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,12 @@ struct Packet<T> {
4545

4646
/// A one-shot channel.
4747
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> {
6048
void_packet: *mut Void,
6149
suppress_finalize: bool
6250
}
6351

64-
pub struct PortOneHack<T> {
52+
/// A one-shot port.
53+
pub struct PortOne<T> {
6554
void_packet: *mut Void,
6655
suppress_finalize: bool
6756
}
@@ -75,22 +64,25 @@ pub fn oneshot<T: Send>() -> (PortOne<T>, ChanOne<T>) {
7564
unsafe {
7665
let packet: *mut Void = cast::transmute(packet);
7766
let port = PortOne {
78-
inner: ~PortOneHack {
79-
void_packet: packet,
80-
suppress_finalize: false
81-
}
67+
void_packet: packet,
68+
suppress_finalize: false
8269
};
8370
let chan = ChanOne {
84-
inner: ~ChanOneHack {
85-
void_packet: packet,
86-
suppress_finalize: false
87-
}
71+
void_packet: packet,
72+
suppress_finalize: false
8873
};
8974
return (port, chan);
9075
}
9176
}
9277

9378
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+
}
9486

9587
pub fn send(self, val: T) {
9688
self.try_send(val);
@@ -99,7 +91,7 @@ impl<T> ChanOne<T> {
9991
pub fn try_send(self, val: T) -> bool {
10092
let mut this = self;
10193
let mut recvr_active = true;
102-
let packet = this.inner.packet();
94+
let packet = this.packet();
10395

10496
unsafe {
10597

@@ -127,7 +119,7 @@ impl<T> ChanOne<T> {
127119
sched.metrics.rendezvous_sends += 1;
128120
}
129121
// 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);
131123
recvr_active = false;
132124
}
133125
task_as_state => {
@@ -144,13 +136,21 @@ impl<T> ChanOne<T> {
144136
}
145137

146138
// Suppress the synchronizing actions in the finalizer. We're done with the packet.
147-
this.inner.suppress_finalize = true;
139+
this.suppress_finalize = true;
148140
return recvr_active;
149141
}
150142
}
151143

152144

153145
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+
154154
pub fn recv(self) -> T {
155155
match self.try_recv() {
156156
Some(val) => val,
@@ -162,7 +162,7 @@ impl<T> PortOne<T> {
162162

163163
pub fn try_recv(self) -> Option<T> {
164164
let mut this = self;
165-
let packet = this.inner.packet();
165+
let packet = this.packet();
166166

167167
// XXX: Optimize this to not require the two context switches when data is available
168168

@@ -215,9 +215,9 @@ impl<T> PortOne<T> {
215215
let payload = util::replace(&mut (*packet).payload, None);
216216

217217
// 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);
219219
// Suppress the synchronizing actions in the finalizer. We're done with the packet.
220-
this.inner.suppress_finalize = true;
220+
this.suppress_finalize = true;
221221
return payload;
222222
}
223223
}
@@ -226,7 +226,7 @@ impl<T> PortOne<T> {
226226
impl<T> Peekable<T> for PortOne<T> {
227227
fn peek(&self) -> bool {
228228
unsafe {
229-
let packet: *mut Packet<T> = self.inner.packet();
229+
let packet: *mut Packet<T> = self.packet();
230230
let oldstate = (*packet).state.load(SeqCst);
231231
match oldstate {
232232
STATE_BOTH => false,
@@ -238,7 +238,7 @@ impl<T> Peekable<T> for PortOne<T> {
238238
}
239239

240240
#[unsafe_destructor]
241-
impl<T> Drop for ChanOneHack<T> {
241+
impl<T> Drop for ChanOne<T> {
242242
fn drop(&self) {
243243
if self.suppress_finalize { return }
244244

@@ -267,7 +267,7 @@ impl<T> Drop for ChanOneHack<T> {
267267
}
268268

269269
#[unsafe_destructor]
270-
impl<T> Drop for PortOneHack<T> {
270+
impl<T> Drop for PortOne<T> {
271271
fn drop(&self) {
272272
if self.suppress_finalize { return }
273273

@@ -295,26 +295,6 @@ impl<T> Drop for PortOneHack<T> {
295295
}
296296
}
297297

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-
318298
struct StreamPayload<T> {
319299
val: T,
320300
next: PortOne<StreamPayload<T>>

0 commit comments

Comments
 (0)