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 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(_) => {

View file

@ -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 {