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>, + sender: Option>>, receiver: Receiver>, } @@ -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 {