@@ -669,87 +669,6 @@ pub fn wait_many<T: Selectable>(pkts: &[T]) -> uint {
669
669
ready_packet
670
670
}
671
671
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
-
753
672
/** The sending end of a pipe. It can be used to send exactly one
754
673
message.
755
674
@@ -901,6 +820,87 @@ pub fn entangle<T>() -> (SendPacket<T>, RecvPacket<T>) {
901
820
(SendPacket(p), RecvPacket(p))
902
821
}
903
822
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
+
904
904
pub mod rt {
905
905
use option::{None, Option, Some};
906
906
0 commit comments