Use swap_remove in pipes::select(). Close #3219.

This commit is contained in:
Ben Blum 2012-08-22 22:20:08 -04:00
parent 20773f33f5
commit fe2566777d
2 changed files with 9 additions and 23 deletions

View File

@ -666,12 +666,10 @@ fn select2<A: send, Ab: send, B: send, Bb: send>(
{
let i = wait_many([a.header(), b.header()]/_);
unsafe {
match i {
0 => Left((try_recv(a), b)),
1 => Right((a, try_recv(b))),
_ => fail ~"select2 return an invalid packet"
}
match i {
0 => Left((try_recv(a), b)),
1 => Right((a, try_recv(b))),
_ => fail ~"select2 return an invalid packet"
}
}
@ -706,17 +704,9 @@ fn select<T: send, Tb: send>(+endpoints: ~[recv_packet_buffered<T, Tb>])
-> (uint, option<T>, ~[recv_packet_buffered<T, Tb>])
{
let ready = wait_many(endpoints.map(|p| p.header()));
let mut remaining = ~[];
let mut result = none;
do vec::consume(endpoints) |i, p| {
if i == ready {
result = try_recv(p);
}
else {
vec::push(remaining, p);
}
}
let mut remaining = endpoints;
let port = vec::swap_remove(remaining, ready);
let result = try_recv(port);
(ready, result, remaining)
}
@ -1054,12 +1044,7 @@ struct PortSet<T: send> : recv<T> {
}
none => {
// Remove this port.
let mut ports_ = ~[];
ports <-> ports_;
vec::consume(ports_,
|j, x| if i != j {
vec::push(ports, x)
});
let _ = vec::swap_remove(ports, i);
}
}
}

View File

@ -36,6 +36,7 @@ export rsplitn;
export shift;
export unshift;
export pop;
export swap_remove;
export push, push_all, push_all_move;
export grow;
export grow_fn;