소스 검색

tile_loader: Remove unwraps, simplify code

Johannes Hofmann 8 년 전
부모
커밋
f855765994
1개의 변경된 파일42개의 추가작업 그리고 40개의 파일을 삭제
  1. 42
    40
      src/tile_loader.rs

+ 42
- 40
src/tile_loader.rs 파일 보기

@@ -63,7 +63,7 @@ impl TileLoader {
63 63
                 let arc_request_rx = Arc::clone(&arc_request_rx);
64 64
                 let result_tx = result_tx.clone();
65 65
                 let arc_notice_func = Arc::clone(&arc_notice_func);
66
-                thread::spawn(move || Self::work_remote(id, remote_queue, arc_request_rx, result_tx, arc_notice_func));
66
+                thread::spawn(move || Self::work_remote(id, &remote_queue, &arc_request_rx, &result_tx, &arc_notice_func));
67 67
             }
68 68
         }
69 69
 
@@ -147,10 +147,10 @@ impl TileLoader {
147 147
 
148 148
     fn work_remote<F>(
149 149
         thread_id: u32,
150
-        queue: Arc<Mutex<Vec<TileRequest>>>,
151
-        request_rx: Arc<Mutex<mpsc::Receiver<RemoteLoaderMessage>>>,
152
-        result_tx: mpsc::Sender<(Tile, Option<DynamicImage>)>,
153
-        notice_func: Arc<F>,
150
+        queue: &Arc<Mutex<Vec<TileRequest>>>,
151
+        request_rx: &Arc<Mutex<mpsc::Receiver<RemoteLoaderMessage>>>,
152
+        result_tx: &mpsc::Sender<(Tile, Option<DynamicImage>)>,
153
+        notice_func: &Arc<F>,
154 154
     )
155 155
         where F: Fn(Tile) + Sync + Send + 'static,
156 156
     {
@@ -159,8 +159,7 @@ impl TileLoader {
159 159
         loop {
160 160
             let message = request_rx.lock().ok().and_then(|r| r.recv().ok());
161 161
             match message {
162
-                None => break,
163
-                Some(RemoteLoaderMessage::Terminate) => break,
162
+                None | Some(RemoteLoaderMessage::Terminate) => break,
164 163
                 Some(RemoteLoaderMessage::PopQueue) => {
165 164
                     let ele: Option<TileRequest> = queue.lock().ok().and_then(|mut q| q.pop());
166 165
 
@@ -172,22 +171,27 @@ impl TileLoader {
172 171
 
173 172
                         if let Some(Ok(mut response)) = client_opt.as_ref().map(|c| c.get(&request.url).send()) {
174 173
                             let mut buf: Vec<u8> = vec![];
175
-                            response.copy_to(&mut buf).unwrap();
176
-                            if let Ok(img) = image::load_from_memory(&buf) {
177
-                                if result_tx.send((request.tile, Some(img))).is_err() {
178
-                                    break;
179
-                                }
174
+                            if response.copy_to(&mut buf).is_ok() {
175
+                                if let Ok(img) = image::load_from_memory(&buf) {
176
+                                    // successfully loaded tile
177
+
178
+                                    if result_tx.send((request.tile, Some(img))).is_err() {
179
+                                        break;
180
+                                    }
180 181
 
181
-                                notice_func(request.tile);
182
+                                    notice_func(request.tile);
182 183
 
183
-                                if request.write_to_file {
184
-                                    //TODO do something on write errors
185
-                                    let _ = Self::write_to_file(&request.path, &buf);
186
-                                }
184
+                                    if request.write_to_file {
185
+                                        //TODO do something on write errors
186
+                                        let _ = Self::write_to_file(&request.path, &buf);
187
+                                    }
187 188
 
188
-                                continue;
189
+                                    continue;
190
+                                }
189 191
                             }
190 192
                         }
193
+
194
+                        // failed not load tile
191 195
                         if result_tx.send((request.tile, None)).is_err() {
192 196
                             break;
193 197
                         }
@@ -205,15 +209,17 @@ impl TileLoader {
205 209
         let tile = Tile::new(tile_coord, source.id());
206 210
 
207 211
         if !self.pending.contains(&tile) {
208
-            self.pending.insert(tile);
209
-            self.request_tx.send(LoaderMessage::GetTile(
210
-                TileRequest {
211
-                    tile: tile,
212
-                    url: source.remote_tile_url(tile_coord),
213
-                    path: source.local_tile_path(tile_coord),
214
-                    write_to_file: write_to_file,
215
-                }
216
-            )).unwrap();
212
+            if self.request_tx.send(LoaderMessage::GetTile(
213
+                    TileRequest {
214
+                        tile: tile,
215
+                        url: source.remote_tile_url(tile_coord),
216
+                        path: source.local_tile_path(tile_coord),
217
+                        write_to_file: write_to_file,
218
+                    }
219
+                )).is_ok()
220
+            {
221
+                self.pending.insert(tile);
222
+            }
217 223
         }
218 224
     }
219 225
 
@@ -245,28 +251,24 @@ impl TileLoader {
245 251
                 if let Some(ref client) = self.client {
246 252
                     if let Ok(mut response) = client.get(&source.remote_tile_url(tile)).send() {
247 253
                         let mut buf: Vec<u8> = vec![];
248
-                        response.copy_to(&mut buf).unwrap();
249
-                        if let Ok(img) = image::load_from_memory(&buf) {
250
-                            if write_to_file {
251
-                                let path = source.local_tile_path(tile);
252
-                                let _ = Self::write_to_file(path, &buf);
254
+                        if response.copy_to(&mut buf).is_ok() {
255
+                            if let Ok(img) = image::load_from_memory(&buf) {
256
+                                if write_to_file {
257
+                                    let path = source.local_tile_path(tile);
258
+                                    let _ = Self::write_to_file(path, &buf);
259
+                                }
260
+                                return Some(img);
253 261
                             }
254
-                            Some(img)
255
-                        } else {
256
-                            None
257 262
                         }
258
-                    } else {
259
-                        None
260 263
                     }
261
-                } else {
262
-                    None
263 264
                 }
265
+                None
264 266
             },
265 267
         }
266 268
     }
267 269
 
268 270
     pub fn set_view_location(&mut self, view: View) {
269
-        self.request_tx.send(LoaderMessage::SetView(view)).unwrap();
271
+        let _ = self.request_tx.send(LoaderMessage::SetView(view));
270 272
     }
271 273
 
272 274
     fn write_to_file<P: AsRef<Path>>(path: P, img_data: &[u8]) -> ::std::io::Result<()> {