Skip to content

Commit 68182d6

Browse files
author
blake2-ppc
committed
---
yaml --- r: 67518 b: refs/heads/master c: 6d7a0c8 h: refs/heads/master v: v3
1 parent 4bf1c4d commit 68182d6

File tree

12 files changed

+169
-72
lines changed

12 files changed

+169
-72
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: fe28ac6891ae2619094e88d9b7859772e685a27f
2+
refs/heads/master: 6d7a0c8cbcd81242d12ad41e0d13c2408c73c8ac
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 18e3db7392d2d0697b7e27d6d986139960144d85
55
refs/heads/try: 7b78b52e602bb3ea8174f9b2006bff3315f03ef9

trunk/src/libextra/arc.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,12 +576,16 @@ mod tests {
576576
let (p, c) = comm::stream();
577577
578578
do task::spawn() || {
579+
let p = comm::PortSet::new();
580+
c.send(p.chan());
581+
579582
let arc_v : Arc<~[int]> = p.recv();
580583
581584
let v = (*arc_v.get()).clone();
582585
assert_eq!(v[3], 4);
583586
};
584587
588+
let c = p.recv();
585589
c.send(arc_v.clone());
586590
587591
assert_eq!(arc_v.get()[2], 3);

trunk/src/libstd/comm.rs

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@ Message passing
1414

1515
#[allow(missing_doc)];
1616

17-
use cast::transmute;
17+
use cast::{transmute, transmute_mut};
18+
use container::Container;
1819
use either::{Either, Left, Right};
1920
use kinds::Send;
20-
use option::{Option, Some};
21+
use option::{Option, Some, None};
22+
use uint;
23+
use vec::OwnedVector;
24+
use util::replace;
2125
use unstable::sync::Exclusive;
2226
use rtcomm = rt::comm;
2327
use rt;
@@ -139,6 +143,81 @@ impl<T: Send> Selectable for Port<T> {
139143
}
140144
}
141145

146+
/// Treat many ports as one.
147+
#[unsafe_mut_field(ports)]
148+
pub struct PortSet<T> {
149+
ports: ~[pipesy::Port<T>],
150+
}
151+
152+
impl<T: Send> PortSet<T> {
153+
pub fn new() -> PortSet<T> {
154+
PortSet {
155+
ports: ~[]
156+
}
157+
}
158+
159+
pub fn add(&self, port: Port<T>) {
160+
let Port { inner } = port;
161+
let port = match inner {
162+
Left(p) => p,
163+
Right(_) => fail!("PortSet not implemented")
164+
};
165+
unsafe {
166+
let self_ports = transmute_mut(&self.ports);
167+
self_ports.push(port)
168+
}
169+
}
170+
171+
pub fn chan(&self) -> Chan<T> {
172+
let (po, ch) = stream();
173+
self.add(po);
174+
ch
175+
}
176+
}
177+
178+
impl<T:Send> GenericPort<T> for PortSet<T> {
179+
fn try_recv(&self) -> Option<T> {
180+
unsafe {
181+
let self_ports = transmute_mut(&self.ports);
182+
let mut result = None;
183+
// we have to swap the ports array so we aren't borrowing
184+
// aliasable mutable memory.
185+
let mut ports = replace(self_ports, ~[]);
186+
while result.is_none() && ports.len() > 0 {
187+
let i = wait_many(ports);
188+
match ports[i].try_recv() {
189+
Some(m) => {
190+
result = Some(m);
191+
}
192+
None => {
193+
// Remove this port.
194+
let _ = ports.swap_remove(i);
195+
}
196+
}
197+
}
198+
*self_ports = ports;
199+
result
200+
}
201+
}
202+
fn recv(&self) -> T {
203+
self.try_recv().expect("port_set: endpoints closed")
204+
}
205+
}
206+
207+
impl<T: Send> Peekable<T> for PortSet<T> {
208+
fn peek(&self) -> bool {
209+
// It'd be nice to use self.port.each, but that version isn't
210+
// pure.
211+
for uint::range(0, self.ports.len()) |i| {
212+
let port: &pipesy::Port<T> = &self.ports[i];
213+
if port.peek() {
214+
return true;
215+
}
216+
}
217+
false
218+
}
219+
}
220+
142221
/// A channel that can be shared between many senders.
143222
pub struct SharedChan<T> {
144223
inner: Either<Exclusive<pipesy::Chan<T>>, rtcomm::SharedChan<T>>

trunk/src/libstd/hash.rs

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -85,38 +85,44 @@ impl<A:IterBytes> Hash for A {
8585
#[inline]
8686
fn hash_keyed(&self, k0: u64, k1: u64) -> u64 {
8787
let mut s = State::new(k0, k1);
88-
for self.iter_bytes(true) |bytes| {
88+
do self.iter_bytes(true) |bytes| {
8989
s.input(bytes);
90-
}
90+
true
91+
};
9192
s.result_u64()
9293
}
9394
}
9495

9596
fn hash_keyed_2<A: IterBytes,
9697
B: IterBytes>(a: &A, b: &B, k0: u64, k1: u64) -> u64 {
9798
let mut s = State::new(k0, k1);
98-
for a.iter_bytes(true) |bytes| {
99+
do a.iter_bytes(true) |bytes| {
99100
s.input(bytes);
100-
}
101-
for b.iter_bytes(true) |bytes| {
101+
true
102+
};
103+
do b.iter_bytes(true) |bytes| {
102104
s.input(bytes);
103-
}
105+
true
106+
};
104107
s.result_u64()
105108
}
106109

107110
fn hash_keyed_3<A: IterBytes,
108111
B: IterBytes,
109112
C: IterBytes>(a: &A, b: &B, c: &C, k0: u64, k1: u64) -> u64 {
110113
let mut s = State::new(k0, k1);
111-
for a.iter_bytes(true) |bytes| {
114+
do a.iter_bytes(true) |bytes| {
112115
s.input(bytes);
113-
}
114-
for b.iter_bytes(true) |bytes| {
116+
true
117+
};
118+
do b.iter_bytes(true) |bytes| {
115119
s.input(bytes);
116-
}
117-
for c.iter_bytes(true) |bytes| {
120+
true
121+
};
122+
do c.iter_bytes(true) |bytes| {
118123
s.input(bytes);
119-
}
124+
true
125+
};
120126
s.result_u64()
121127
}
122128

@@ -132,18 +138,22 @@ fn hash_keyed_4<A: IterBytes,
132138
k1: u64)
133139
-> u64 {
134140
let mut s = State::new(k0, k1);
135-
for a.iter_bytes(true) |bytes| {
141+
do a.iter_bytes(true) |bytes| {
136142
s.input(bytes);
137-
}
138-
for b.iter_bytes(true) |bytes| {
143+
true
144+
};
145+
do b.iter_bytes(true) |bytes| {
139146
s.input(bytes);
140-
}
141-
for c.iter_bytes(true) |bytes| {
147+
true
148+
};
149+
do c.iter_bytes(true) |bytes| {
142150
s.input(bytes);
143-
}
144-
for d.iter_bytes(true) |bytes| {
151+
true
152+
};
153+
do d.iter_bytes(true) |bytes| {
145154
s.input(bytes);
146-
}
155+
true
156+
};
147157
s.result_u64()
148158
}
149159

@@ -161,21 +171,26 @@ fn hash_keyed_5<A: IterBytes,
161171
k1: u64)
162172
-> u64 {
163173
let mut s = State::new(k0, k1);
164-
for a.iter_bytes(true) |bytes| {
174+
do a.iter_bytes(true) |bytes| {
165175
s.input(bytes);
166-
}
167-
for b.iter_bytes(true) |bytes| {
176+
true
177+
};
178+
do b.iter_bytes(true) |bytes| {
168179
s.input(bytes);
169-
}
170-
for c.iter_bytes(true) |bytes| {
180+
true
181+
};
182+
do c.iter_bytes(true) |bytes| {
171183
s.input(bytes);
172-
}
173-
for d.iter_bytes(true) |bytes| {
184+
true
185+
};
186+
do d.iter_bytes(true) |bytes| {
174187
s.input(bytes);
175-
}
176-
for e.iter_bytes(true) |bytes| {
188+
true
189+
};
190+
do e.iter_bytes(true) |bytes| {
177191
s.input(bytes);
178-
}
192+
true
193+
};
179194
s.result_u64()
180195
}
181196

trunk/src/libstd/to_bytes.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -353,9 +353,10 @@ pub trait ToBytes {
353353
impl<A:IterBytes> ToBytes for A {
354354
fn to_bytes(&self, lsb0: bool) -> ~[u8] {
355355
do io::with_bytes_writer |wr| {
356-
for self.iter_bytes(lsb0) |bytes| {
357-
wr.write(bytes)
358-
}
356+
do self.iter_bytes(lsb0) |bytes| {
357+
wr.write(bytes);
358+
true
359+
};
359360
}
360361
}
361362
}

trunk/src/test/bench/msgsend-pipes.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
extern mod extra;
1818

19-
use std::comm::{SharedChan, Chan, stream};
19+
use std::comm::{PortSet, Chan, stream};
2020
use std::io;
2121
use std::os;
2222
use std::task;
@@ -30,7 +30,7 @@ enum request {
3030
stop
3131
}
3232

33-
fn server(requests: &Port<request>, responses: &Chan<uint>) {
33+
fn server(requests: &PortSet<request>, responses: &Chan<uint>) {
3434
let mut count: uint = 0;
3535
let mut done = false;
3636
while !done {
@@ -50,16 +50,18 @@ fn server(requests: &Port<request>, responses: &Chan<uint>) {
5050

5151
fn run(args: &[~str]) {
5252
let (from_child, to_parent) = stream();
53-
let (from_parent, to_child) = stream();
54-
let to_child = SharedChan::new(to_child);
53+
let (from_parent_, to_child) = stream();
54+
let from_parent = PortSet::new();
55+
from_parent.add(from_parent_);
5556

5657
let size = uint::from_str(args[1]).get();
5758
let workers = uint::from_str(args[2]).get();
5859
let num_bytes = 100;
5960
let start = extra::time::precise_time_s();
6061
let mut worker_results = ~[];
6162
for uint::range(0, workers) |_i| {
62-
let to_child = to_child.clone();
63+
let (from_parent_, to_child) = stream();
64+
from_parent.add(from_parent_);
6365
let mut builder = task::task();
6466
builder.future_result(|r| worker_results.push(r));
6567
do builder.spawn {

trunk/src/test/bench/shootout-pfib.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,22 @@ use std::u64;
3333
use std::uint;
3434

3535
fn fib(n: int) -> int {
36-
fn pfib(c: &SharedChan<int>, n: int) {
36+
fn pfib(c: &Chan<int>, n: int) {
3737
if n == 0 {
3838
c.send(0);
3939
} else if n <= 2 {
4040
c.send(1);
4141
} else {
42-
let (pp, cc) = stream();
43-
let cc = SharedChan::new(cc);
44-
let ch = cc.clone();
42+
let p = PortSet::new();
43+
let ch = p.chan();
4544
task::spawn(|| pfib(&ch, n - 1) );
46-
let ch = cc.clone();
45+
let ch = p.chan();
4746
task::spawn(|| pfib(&ch, n - 2) );
48-
c.send(pp.recv() + pp.recv());
47+
c.send(p.recv() + p.recv());
4948
}
5049
}
5150

5251
let (p, ch) = stream();
53-
let ch = SharedChan::new(ch);
5452
let _t = task::spawn(|| pfib(&ch, n) );
5553
p.recv()
5654
}

trunk/src/test/run-pass/task-comm-14.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ use std::comm;
1414
use std::task;
1515

1616
pub fn main() {
17-
let (po, ch) = comm::stream();
18-
let ch = comm::SharedChan::new(ch);
17+
let po = comm::PortSet::new();
1918

2019
// Spawn 10 tasks each sending us back one int.
2120
let mut i = 10;
2221
while (i > 0) {
2322
info!(i);
24-
let ch = ch.clone();
23+
let (p, ch) = comm::stream();
24+
po.add(p);
2525
task::spawn({let i = i; || child(i, &ch)});
2626
i = i - 1;
2727
}
@@ -39,7 +39,7 @@ pub fn main() {
3939
info!("main thread exiting");
4040
}
4141

42-
fn child(x: int, ch: &comm::SharedChan<int>) {
42+
fn child(x: int, ch: &comm::Chan<int>) {
4343
info!(x);
4444
ch.send(x);
4545
}

trunk/src/test/run-pass/task-comm-3.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212

1313
extern mod extra;
1414

15-
use std::comm::SharedChan;
15+
use std::comm::Chan;
1616
use std::comm;
1717
use std::task;
1818

1919
pub fn main() { info!("===== WITHOUT THREADS ====="); test00(); }
2020

21-
fn test00_start(ch: &SharedChan<int>, message: int, count: int) {
21+
fn test00_start(ch: &Chan<int>, message: int, count: int) {
2222
info!("Starting test00_start");
2323
let mut i: int = 0;
2424
while i < count {
@@ -35,15 +35,14 @@ fn test00() {
3535

3636
info!("Creating tasks");
3737

38-
let (po, ch) = comm::stream();
39-
let ch = comm::SharedChan::new(ch);
38+
let po = comm::PortSet::new();
4039

4140
let mut i: int = 0;
4241

4342
// Create and spawn tasks...
4443
let mut results = ~[];
4544
while i < number_of_tasks {
46-
let ch = ch.clone();
45+
let ch = po.chan();
4746
let mut builder = task::task();
4847
builder.future_result(|r| results.push(r));
4948
builder.spawn({

0 commit comments

Comments
 (0)