| 
1 | 1 | #![cfg(unix)]  | 
2 | 2 | 
 
  | 
3 |  | -use std::collections::HashMap;  | 
4 | 3 | use std::io::{Cursor, Read};  | 
5 | 4 | use std::time::Duration;  | 
6 | 5 | 
 
  | 
@@ -95,8 +94,7 @@ fn upload_lots() {  | 
95 | 94 |     }  | 
96 | 95 | 
 
  | 
97 | 96 |     let mut m = Multi::new();  | 
98 |  | -    let poll = t!(mio::Poll::new());  | 
99 |  | -    let (tx, rx) = mio_extras::channel::channel();  | 
 | 97 | +    let (tx, rx) = std::sync::mpsc::channel();  | 
100 | 98 |     let tx2 = tx.clone();  | 
101 | 99 |     t!(m.socket_function(move |socket, events, token| {  | 
102 | 100 |         t!(tx2.send(Message::Wait(socket, events, token)));  | 
@@ -136,85 +134,45 @@ fn upload_lots() {  | 
136 | 134 |     t!(h.upload(true));  | 
137 | 135 |     t!(h.http_headers(list));  | 
138 | 136 | 
 
  | 
139 |  | -    t!(poll.register(&rx, mio::Token(0), mio::Ready::all(), mio::PollOpt::level()));  | 
140 |  | - | 
141 | 137 |     let e = t!(m.add(h));  | 
142 | 138 | 
 
  | 
143 | 139 |     let mut next_token = 1;  | 
144 |  | -    let mut token_map = HashMap::new();  | 
145 | 140 |     let mut cur_timeout = None;  | 
146 |  | -    let mut events = mio::Events::with_capacity(128);  | 
147 |  | -    let mut running = true;  | 
148 |  | - | 
149 |  | -    while running {  | 
150 |  | -        let n = t!(poll.poll(&mut events, cur_timeout));  | 
151 | 141 | 
 
  | 
152 |  | -        if n == 0 && t!(m.timeout()) == 0 {  | 
153 |  | -            running = false;  | 
 | 142 | +    loop {  | 
 | 143 | +        match cur_timeout {  | 
 | 144 | +            Some(cur_timeout) => std::thread::sleep(cur_timeout),  | 
 | 145 | +            None => {},  | 
154 | 146 |         }  | 
155 | 147 | 
 
  | 
156 |  | -        for event in events.iter() {  | 
157 |  | -            while event.token() == mio::Token(0) {  | 
158 |  | -                match rx.try_recv() {  | 
159 |  | -                    Ok(Message::Timeout(dur)) => cur_timeout = dur,  | 
160 |  | -                    Ok(Message::Wait(socket, events, token)) => {  | 
161 |  | -                        let evented = mio::unix::EventedFd(&socket);  | 
162 |  | -                        if events.remove() {  | 
163 |  | -                            token_map.remove(&token).unwrap();  | 
164 |  | -                        } else {  | 
165 |  | -                            let mut e = mio::Ready::empty();  | 
166 |  | -                            if events.input() {  | 
167 |  | -                                e |= mio::Ready::readable();  | 
168 |  | -                            }  | 
169 |  | -                            if events.output() {  | 
170 |  | -                                e |= mio::Ready::writable();  | 
171 |  | -                            }  | 
172 |  | -                            if token == 0 {  | 
173 |  | -                                let token = next_token;  | 
174 |  | -                                next_token += 1;  | 
175 |  | -                                t!(m.assign(socket, token));  | 
176 |  | -                                token_map.insert(token, socket);  | 
177 |  | -                                t!(poll.register(  | 
178 |  | -                                    &evented,  | 
179 |  | -                                    mio::Token(token),  | 
180 |  | -                                    e,  | 
181 |  | -                                    mio::PollOpt::level()  | 
182 |  | -                                ));  | 
183 |  | -                            } else {  | 
184 |  | -                                t!(poll.reregister(  | 
185 |  | -                                    &evented,  | 
186 |  | -                                    mio::Token(token),  | 
187 |  | -                                    e,  | 
188 |  | -                                    mio::PollOpt::level()  | 
189 |  | -                                ));  | 
190 |  | -                            }  | 
191 |  | -                        }  | 
192 |  | -                    }  | 
193 |  | -                    Err(_) => break,  | 
 | 148 | +        t!(m.timeout());  | 
 | 149 | + | 
 | 150 | +        let message = rx.try_recv();  | 
 | 151 | + | 
 | 152 | +        match message {  | 
 | 153 | +            Ok(Message::Timeout(dur)) => cur_timeout = dur,  | 
 | 154 | +            Ok(Message::Wait(socket, events, token)) => {  | 
 | 155 | +                if token == 0 {  | 
 | 156 | +                    let token = next_token;  | 
 | 157 | +                    next_token += 1;  | 
 | 158 | +                    t!(m.assign(socket, token));  | 
194 | 159 |                 }  | 
195 |  | -            }  | 
196 |  | - | 
197 |  | -            if event.token() == mio::Token(0) {  | 
198 |  | -                continue;  | 
199 |  | -            }  | 
200 |  | - | 
201 |  | -            let token = event.token();  | 
202 |  | -            let socket = token_map[&token.into()];  | 
203 |  | -            let mut e = Events::new();  | 
204 |  | -            if event.readiness().is_readable() {  | 
205 |  | -                e.input(true);  | 
206 |  | -            }  | 
207 |  | -            if event.readiness().is_writable() {  | 
208 |  | -                e.output(true);  | 
209 |  | -            }  | 
210 |  | -            if mio::unix::UnixReady::from(event.readiness()).is_error() {  | 
211 |  | -                e.error(true);  | 
212 |  | -            }  | 
213 |  | -            let remaining = t!(m.action(socket, &e));  | 
214 |  | -            if remaining == 0 {  | 
215 |  | -                running = false;  | 
216 |  | -            }  | 
217 |  | -        }  | 
 | 160 | + | 
 | 161 | +                let mut e = Events::new();  | 
 | 162 | +                if events.input() {  | 
 | 163 | +                    e.input(true);  | 
 | 164 | +                }  | 
 | 165 | +                if events.output() {  | 
 | 166 | +                    e.output(true);  | 
 | 167 | +                }  | 
 | 168 | +                let remaining = t!(m.action(socket, &e));  | 
 | 169 | +                  | 
 | 170 | +                if remaining == 0 {  | 
 | 171 | +                    break  | 
 | 172 | +                }  | 
 | 173 | +            },  | 
 | 174 | +            Err(_) => continue,  | 
 | 175 | +        }         | 
218 | 176 |     }  | 
219 | 177 | 
 
  | 
220 | 178 |     let mut done = 0;  | 
 | 
0 commit comments