@@ -82,7 +82,7 @@ fn run(args: &[str]) {
82
82
83
83
fn main ( args : ~[ str ] ) {
84
84
let args = if os:: getenv ( "RUST_BENCH" ) . is_some ( ) {
85
- ~[ "" , "1000000" , "10000 " ]
85
+ ~[ "" , "1000000" , "8 " ]
86
86
} else if args. len ( ) <= 1 u {
87
87
~[ "" , "10000" , "4" ]
88
88
} else {
@@ -112,24 +112,34 @@ class box<T> {
112
112
}
113
113
114
114
class port_set<T : send> {
115
- let ports: box < ~[ pipes:: streamp :: server :: open < T > ] > ;
115
+ let mut ports: ~[ pipes:: port < T > ] ;
116
116
117
- new ( ) { self . ports = box ( ~[ ] ) ; }
117
+ new ( ) { self . ports = ~[ ] ; }
118
118
119
119
fn add ( +port : pipes:: port < T > ) {
120
- let pipes:: port_( port) <- port;
121
- let mut p = none;
122
- port. endp <-> p;
123
- do self. ports . swap |ports| {
124
- let mut p_ = none;
125
- p <-> p_;
126
- vec:: append_one ( ports, option:: unwrap ( p_) )
127
- }
120
+ vec:: push ( self . ports , port)
128
121
}
129
122
130
123
fn try_recv ( ) -> option < T > {
131
124
let mut result = none;
132
- let mut done = false ;
125
+ while result == none && self . ports . len ( ) > 0 {
126
+ let i = pipes:: wait_many ( self . ports . map ( |p| p. header ( ) ) ) ;
127
+ // dereferencing an unsafe pointer nonsense to appease the
128
+ // borrowchecker.
129
+ alt unsafe { ( * ptr:: addr_of ( self . ports [ i] ) ) . try_recv ( ) } {
130
+ some ( m) {
131
+ result = some ( move !{ m} ) ;
132
+ }
133
+ none {
134
+ // Remove this port.
135
+ let mut ports = ~[ ] ;
136
+ self . ports <-> ports;
137
+ vec:: consume ( ports,
138
+ |j, x| if i != j { vec:: push ( self . ports , x) } ) ;
139
+ }
140
+ }
141
+ }
142
+ /*
133
143
while !done {
134
144
do self.ports.swap |ports| {
135
145
if ports.len() > 0 {
@@ -156,10 +166,22 @@ class port_set<T: send> {
156
166
}
157
167
}
158
168
}
169
+ */
159
170
result
160
171
}
161
172
162
173
fn recv( ) -> T {
163
174
option : : unwrap ( self . try_recv ( ) )
164
175
}
165
176
}
177
+
178
+ impl private_methods/& <T : send > for pipes:: port<T > {
179
+ pure fn header ( ) -> * pipes:: packet_header unchecked {
180
+ alt self . endp {
181
+ some ( endp) {
182
+ endp. header ( )
183
+ }
184
+ none { fail "peeking empty stream" }
185
+ }
186
+ }
187
+ }
0 commit comments