Skip to content

Commit f51a302

Browse files
committed
---
yaml --- r: 139875 b: refs/heads/try2 c: 8f2d21d h: refs/heads/master i: 139873: 321f879 139871: 0904aaf v: v3
1 parent 2553cc2 commit f51a302

File tree

2 files changed

+82
-82
lines changed

2 files changed

+82
-82
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: ab08b4fbfde7e9cc9e0de07aed17b4d4e06ccc3e
8+
refs/heads/try2: 8f2d21dc0d69de134e0ed70bcf1a15f4cac4973a
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libcore/pipes.rs

Lines changed: 81 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -669,87 +669,6 @@ pub fn wait_many<T: Selectable>(pkts: &[T]) -> uint {
669669
ready_packet
670670
}
671671
672-
/** Receives a message from one of two endpoints.
673-
674-
The return value is `left` if the first endpoint received something,
675-
or `right` if the second endpoint receives something. In each case,
676-
the result includes the other endpoint as well so it can be used
677-
again. Below is an example of using `select2`.
678-
679-
~~~
680-
match select2(a, b) {
681-
left((none, b)) {
682-
// endpoint a was closed.
683-
}
684-
right((a, none)) {
685-
// endpoint b was closed.
686-
}
687-
left((Some(_), b)) {
688-
// endpoint a received a message
689-
}
690-
right(a, Some(_)) {
691-
// endpoint b received a message.
692-
}
693-
}
694-
~~~
695-
696-
Sometimes messages will be available on both endpoints at once. In
697-
this case, `select2` may return either `left` or `right`.
698-
699-
*/
700-
pub fn select2<A:Owned,Ab:Owned,B:Owned,Bb:Owned>(
701-
a: RecvPacketBuffered<A, Ab>,
702-
b: RecvPacketBuffered<B, Bb>)
703-
-> Either<(Option<A>, RecvPacketBuffered<B, Bb>),
704-
(RecvPacketBuffered<A, Ab>, Option<B>)>
705-
{
706-
let i = wait_many([a.header(), b.header()]);
707-
708-
match i {
709-
0 => Left((try_recv(a), b)),
710-
1 => Right((a, try_recv(b))),
711-
_ => fail!(~"select2 return an invalid packet")
712-
}
713-
}
714-
715-
#[doc(hidden)]
716-
pub trait Selectable {
717-
fn header(&self) -> *PacketHeader;
718-
}
719-
720-
impl Selectable for *PacketHeader {
721-
fn header(&self) -> *PacketHeader { *self }
722-
}
723-
724-
/// Returns the index of an endpoint that is ready to receive.
725-
pub fn selecti<T:Selectable>(endpoints: &[T]) -> uint {
726-
wait_many(endpoints)
727-
}
728-
729-
/// Returns 0 or 1 depending on which endpoint is ready to receive
730-
pub fn select2i<A:Selectable,B:Selectable>(a: &A, b: &B) ->
731-
Either<(), ()> {
732-
match wait_many([a.header(), b.header()]) {
733-
0 => Left(()),
734-
1 => Right(()),
735-
_ => fail!(~"wait returned unexpected index")
736-
}
737-
}
738-
739-
/** Waits on a set of endpoints. Returns a message, its index, and a
740-
list of the remaining endpoints.
741-
742-
*/
743-
pub fn select<T:Owned,Tb:Owned>(endpoints: ~[RecvPacketBuffered<T, Tb>])
744-
-> (uint, Option<T>, ~[RecvPacketBuffered<T, Tb>])
745-
{
746-
let ready = wait_many(endpoints.map(|p| p.header()));
747-
let mut remaining = endpoints;
748-
let port = remaining.swap_remove(ready);
749-
let result = try_recv(port);
750-
(ready, result, remaining)
751-
}
752-
753672
/** The sending end of a pipe. It can be used to send exactly one
754673
message.
755674
@@ -901,6 +820,87 @@ pub fn entangle<T>() -> (SendPacket<T>, RecvPacket<T>) {
901820
(SendPacket(p), RecvPacket(p))
902821
}
903822
823+
/** Receives a message from one of two endpoints.
824+
825+
The return value is `left` if the first endpoint received something,
826+
or `right` if the second endpoint receives something. In each case,
827+
the result includes the other endpoint as well so it can be used
828+
again. Below is an example of using `select2`.
829+
830+
~~~
831+
match select2(a, b) {
832+
left((none, b)) {
833+
// endpoint a was closed.
834+
}
835+
right((a, none)) {
836+
// endpoint b was closed.
837+
}
838+
left((Some(_), b)) {
839+
// endpoint a received a message
840+
}
841+
right(a, Some(_)) {
842+
// endpoint b received a message.
843+
}
844+
}
845+
~~~
846+
847+
Sometimes messages will be available on both endpoints at once. In
848+
this case, `select2` may return either `left` or `right`.
849+
850+
*/
851+
pub fn select2<A:Owned,Ab:Owned,B:Owned,Bb:Owned>(
852+
a: RecvPacketBuffered<A, Ab>,
853+
b: RecvPacketBuffered<B, Bb>)
854+
-> Either<(Option<A>, RecvPacketBuffered<B, Bb>),
855+
(RecvPacketBuffered<A, Ab>, Option<B>)>
856+
{
857+
let i = wait_many([a.header(), b.header()]);
858+
859+
match i {
860+
0 => Left((try_recv(a), b)),
861+
1 => Right((a, try_recv(b))),
862+
_ => fail!(~"select2 return an invalid packet")
863+
}
864+
}
865+
866+
#[doc(hidden)]
867+
pub trait Selectable {
868+
fn header(&self) -> *PacketHeader;
869+
}
870+
871+
impl Selectable for *PacketHeader {
872+
fn header(&self) -> *PacketHeader { *self }
873+
}
874+
875+
/// Returns the index of an endpoint that is ready to receive.
876+
pub fn selecti<T:Selectable>(endpoints: &[T]) -> uint {
877+
wait_many(endpoints)
878+
}
879+
880+
/// Returns 0 or 1 depending on which endpoint is ready to receive
881+
pub fn select2i<A:Selectable,B:Selectable>(a: &A, b: &B) ->
882+
Either<(), ()> {
883+
match wait_many([a.header(), b.header()]) {
884+
0 => Left(()),
885+
1 => Right(()),
886+
_ => fail!(~"wait returned unexpected index")
887+
}
888+
}
889+
890+
/** Waits on a set of endpoints. Returns a message, its index, and a
891+
list of the remaining endpoints.
892+
893+
*/
894+
pub fn select<T:Owned,Tb:Owned>(endpoints: ~[RecvPacketBuffered<T, Tb>])
895+
-> (uint, Option<T>, ~[RecvPacketBuffered<T, Tb>])
896+
{
897+
let ready = wait_many(endpoints.map(|p| p.header()));
898+
let mut remaining = endpoints;
899+
let port = remaining.swap_remove(ready);
900+
let result = try_recv(port);
901+
(ready, result, remaining)
902+
}
903+
904904
pub mod rt {
905905
use option::{None, Option, Some};
906906

0 commit comments

Comments
 (0)