1
Fork 0

Better handling of the sender channel part in rustdoc file writing

This commit is contained in:
Guillaume Gomez 2019-06-21 00:26:13 +02:00
parent 3eeb543504
commit 65f12950b6
2 changed files with 8 additions and 8 deletions

View file

@ -11,7 +11,6 @@
use errors; use errors;
use std::cell::RefCell;
use std::fs; use std::fs;
use std::io; use std::io;
use std::path::Path; use std::path::Path;
@ -32,7 +31,7 @@ pub trait PathError {
} }
pub struct ErrorStorage { pub struct ErrorStorage {
sender: Sender<Option<String>>, sender: Option<Sender<Option<String>>>,
receiver: Receiver<Option<String>>, receiver: Receiver<Option<String>>,
} }
@ -40,15 +39,16 @@ impl ErrorStorage {
pub fn new() -> ErrorStorage { pub fn new() -> ErrorStorage {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
ErrorStorage { ErrorStorage {
sender, sender: Some(sender),
receiver, receiver,
} }
} }
/// Prints all stored errors. Returns the number of printed errors. /// 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; 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() { for msg in self.receiver.iter() {
if let Some(ref error) = msg { if let Some(ref error) = msg {
@ -95,7 +95,7 @@ impl DocFS {
// be to create the file sync so errors are reported eagerly. // be to create the file sync so errors are reported eagerly.
let contents = contents.as_ref().to_vec(); let contents = contents.as_ref().to_vec();
let path = path.as_ref().to_path_buf(); let path = path.as_ref().to_path_buf();
let sender = self.errors.sender.clone(); let sender = self.errors.sender.clone().unwrap();
rayon::spawn(move || { rayon::spawn(move || {
match fs::write(&path, &contents) { match fs::write(&path, &contents) {
Ok(_) => { Ok(_) => {

View file

@ -552,7 +552,7 @@ pub fn run(mut krate: clean::Crate,
}, },
_ => PathBuf::new(), _ => PathBuf::new(),
}; };
let errors = Arc::new(ErrorStorage::new()); let mut errors = Arc::new(ErrorStorage::new());
let mut scx = SharedContext { let mut scx = SharedContext {
src_root, src_root,
passes, passes,
@ -722,7 +722,7 @@ pub fn run(mut krate: clean::Crate,
// And finally render the whole crate's documentation // And finally render the whole crate's documentation
let ret = cx.krate(krate); 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() { if ret.is_err() {
ret ret
} else if nb_errors > 0 { } else if nb_errors > 0 {