about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2019-06-21 00:26:13 +0200
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2019-06-21 12:00:49 +0200
commit65f12950b64cbea42e97f1425952c77cf024d5ed (patch)
tree77606f7c5652cda53707b3b4dadcc64913742d59
parent3eeb543504602d04c2f4374834ee9c67bb525300 (diff)
downloadrust-65f12950b64cbea42e97f1425952c77cf024d5ed.tar.gz
rust-65f12950b64cbea42e97f1425952c77cf024d5ed.zip
Better handling of the sender channel part in rustdoc file writing
-rw-r--r--src/librustdoc/docfs.rs12
-rw-r--r--src/librustdoc/html/render.rs4
2 files changed, 8 insertions, 8 deletions
diff --git a/src/librustdoc/docfs.rs b/src/librustdoc/docfs.rs
index 96399b8e36f..740947fc3e3 100644
--- a/src/librustdoc/docfs.rs
+++ b/src/librustdoc/docfs.rs
@@ -11,7 +11,6 @@
 
 use errors;
 
-use std::cell::RefCell;
 use std::fs;
 use std::io;
 use std::path::Path;
@@ -32,7 +31,7 @@ pub trait PathError {
 }
 
 pub struct ErrorStorage {
-    sender: Sender<Option<String>>,
+    sender: Option<Sender<Option<String>>>,
     receiver: Receiver<Option<String>>,
 }
 
@@ -40,15 +39,16 @@ impl ErrorStorage {
     pub fn new() -> ErrorStorage {
         let (sender, receiver) = channel();
         ErrorStorage {
-            sender,
+            sender: Some(sender),
             receiver,
         }
     }
 
     /// Prints all stored errors. Returns the number of printed errors.
-    pub fn write_errors(&self, diag: &errors::Handler) -> usize {
+    pub fn write_errors(&mut self, diag: &errors::Handler) -> usize {
         let mut printed = 0;
-        drop(self.sender);
+        // In order to drop the sender part of the channel.
+        self.sender = None;
 
         for msg in self.receiver.iter() {
             if let Some(ref error) = msg {
@@ -95,7 +95,7 @@ impl DocFS {
             // be to create the file sync so errors are reported eagerly.
             let contents = contents.as_ref().to_vec();
             let path = path.as_ref().to_path_buf();
-            let sender = self.errors.sender.clone();
+            let sender = self.errors.sender.clone().unwrap();
             rayon::spawn(move || {
                 match fs::write(&path, &contents) {
                     Ok(_) => {
diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index fe5fb4d73d8..f0aff961c67 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -552,7 +552,7 @@ pub fn run(mut krate: clean::Crate,
         },
         _ => PathBuf::new(),
     };
-    let errors = Arc::new(ErrorStorage::new());
+    let mut errors = Arc::new(ErrorStorage::new());
     let mut scx = SharedContext {
         src_root,
         passes,
@@ -722,7 +722,7 @@ pub fn run(mut krate: clean::Crate,
 
     // And finally render the whole crate's documentation
     let ret = cx.krate(krate);
-    let nb_errors = errors.write_errors(diag);
+    let nb_errors = Arc::get_mut(&mut errors).map_or_else(|| 0, |errors| errors.write_errors(diag));
     if ret.is_err() {
         ret
     } else if nb_errors > 0 {