diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 7f1e42ce6028..ab985828a465 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -307,11 +307,17 @@ pub fn run(mut krate: clean::Crate, dst: Path) -> io::IoResult<()> { } let index = try!(build_index(&krate, &mut cache)); - try!(write_shared(&cx, &krate, &cache, index)); + + // Freeze the cache now that the index has been built. Put an Arc into TLS + // for future parallelization opportunities + let cache = Arc::new(cache); + cache_key.replace(Some(cache.clone())); + + try!(write_shared(&cx, &krate, &*cache, index)); let krate = try!(render_sources(&mut cx, krate)); // And finally render the whole crate's documentation - cx.krate(krate, cache) + cx.krate(krate) } fn build_index(krate: &clean::Crate, cache: &mut Cache) -> io::IoResult { @@ -954,16 +960,13 @@ impl Context { /// /// This currently isn't parallelized, but it'd be pretty easy to add /// parallelization to this function. - fn krate(self, mut krate: clean::Crate, cache: Cache) -> io::IoResult<()> { + fn krate(self, mut krate: clean::Crate) -> io::IoResult<()> { let mut item = match krate.module.take() { Some(i) => i, None => return Ok(()) }; item.name = Some(krate.name); - // using a rwarc makes this parallelizable in the future - cache_key.replace(Some(Arc::new(cache))); - let mut work = vec!((self, item)); loop { match work.pop() {