diff options
-rw-r--r-- | front_end/src/bin/crate_pages.rs | 4 | ||||
-rw-r--r-- | front_end/src/crate_page.rs | 29 | ||||
-rw-r--r-- | kitchen_sink/src/lib_kitchen_sink.rs | 17 | ||||
-rw-r--r-- | reindex/src/bin/reindex_crates.rs | 7 |
4 files changed, 28 insertions, 29 deletions
diff --git a/front_end/src/bin/crate_pages.rs b/front_end/src/bin/crate_pages.rs index ae1047a..383b2db 100644 --- a/front_end/src/bin/crate_pages.rs +++ b/front_end/src/bin/crate_pages.rs @@ -67,6 +67,7 @@ async fn run(filter: Option<String>) -> Result<(), failure::Error> { let image_filter = Arc::new(ImageOptimAPIFilter::new("czjpqfbdkz", crates.main_cache_dir().join("images.db"))?); let markup = &Renderer::new_filter(Some(Highlighter::new()), image_filter); + let handle = Arc::new(tokio::runtime::Handle::current()); rayon::scope(move |s1| { let tmp; let always_render = filter.is_some(); @@ -86,9 +87,10 @@ async fn run(filter: Option<String>) -> Result<(), failure::Error> { } let origin = origin.clone(); let crates = Arc::clone(&crates); + let handle = Arc::clone(&handle); let path = PathBuf::from(format!("public/crates/{}.html", origin.short_crate_name())); s1.spawn(move |_| { - if let Err(e) = kitchen_sink::block_on(render(&origin, &crates, &path, markup, always_render)) { + if let Err(e) = handle.enter(|| futures::executor::block_on(render(&origin, &crates, &path, markup, always_render))) { eprintln!("••• error: {} — {}", e, path.display()); for c in e.iter_chain().skip(1) { eprintln!("• error: -- {}", c); diff --git a/front_end/src/crate_page.rs b/front_end/src/crate_page.rs index d2cc4d4..2fdf934 100644 --- a/front_end/src/crate_page.rs +++ b/front_end/src/crate_page.rs @@ -1,3 +1,4 @@ +use tokio::runtime::Handle; use futures::future::join_all; use crate::download_graph::DownloadsGraph; use crate::templates; @@ -58,6 +59,7 @@ pub struct CratePage<'a> { pub viral_license: Option<CrateLicense>, top_category: Option<(u32, &'static Category)>, is_build_or_dev: (bool, bool), + handle: Handle, } /// Helper used to find most "interesting" versions @@ -120,6 +122,7 @@ impl<'a> CratePage<'a> { viral_license: None, top_category, is_build_or_dev, + handle: Handle::current(), }; let (sizes, lang_stats, viral_license) = page.crate_size_and_viral_license(deps?).await?; page.sizes = Some(sizes); @@ -190,7 +193,7 @@ impl<'a> CratePage<'a> { } pub fn dependents_stats(&self) -> Option<(u32, u32, Option<&str>)> { - kitchen_sink::block_on(self.kitchen_sink.crates_io_dependents_stats_of(self.ver.origin())) + self.handle.enter(|| futures::executor::block_on(self.kitchen_sink.crates_io_dependents_stats_of(self.ver.origin()))) .map_err(|e| eprintln!("{}", e)) .ok().and_then(|x| x) .map(|d| ( @@ -355,18 +358,20 @@ impl<'a> CratePage<'a> { if richdep.dep.req() == "*" { return "common"; } - let (matches_latest, pop) = richdep.dep.req().parse().ok().and_then(|req| { - if !richdep.dep.is_crates_io() { - return None; + self.handle.enter(|| { + let (matches_latest, pop) = richdep.dep.req().parse().ok().and_then(|req| { + if !richdep.dep.is_crates_io() { + return None; + } + futures::executor::block_on(self.kitchen_sink.version_popularity(&richdep.package, &req)).expect("deps") + }).unwrap_or((false, 0.)); + match pop { + x if x >= 0.5 && matches_latest => "top", + x if x >= 0.75 || matches_latest => "common", + x if x >= 0.25 => "outdated", + _ => "obsolete", } - kitchen_sink::block_on(self.kitchen_sink.version_popularity(&richdep.package, &req)).expect("deps") - }).unwrap_or((false, 0.)); - match pop { - x if x >= 0.5 && matches_latest => "top", - x if x >= 0.75 || matches_latest => "common", - x if x >= 0.25 => "outdated", - _ => "obsolete", - } + }) } /// The rule is - last displayed digit may change (except 0.x) diff --git a/kitchen_sink/src/lib_kitchen_sink.rs b/kitchen_sink/src/lib_kitchen_sink.rs index a4c3d37..2a97f8b 100644 --- a/kitchen_sink/src/lib_kitchen_sink.rs +++ b/kitchen_sink/src/lib_kitchen_sink.rs @@ -161,6 +161,7 @@ pub struct KitchenSink { main_cache_dir: PathBuf, yearly: AllDownloads, category_overrides: HashMap<String, Vec<Cow<'static, str>>>, + handle: Handle, } impl KitchenSink { @@ -178,10 +179,7 @@ impl KitchenSink { } pub async fn new(data_path: &Path, github_token: &str) -> CResult<Self> { - // just testing whether runtime is on let handle = Handle::current(); - handle.spawn(async {}); - let main_cache_dir = data_path.to_owned(); let ((crates_io, gh), index) = rayon::join(|| rayon::join( @@ -204,6 +202,7 @@ impl KitchenSink { yearly: AllDownloads::new(&main_cache_dir), main_cache_dir, category_overrides: Self::load_category_overrides(&data_path.join("category_overrides.txt"))?, + handle, }) } @@ -511,7 +510,7 @@ impl KitchenSink { /// /// There's no support for getting anything else than the latest version. pub fn rich_crate_version(&self, origin: &Origin) -> CResult<RichCrateVersion> { - block_on(self.rich_crate_version_async(origin)) + self.handle.enter(|| futures::executor::block_on(self.rich_crate_version_async(origin))) } pub async fn rich_crate_version_async(&self, origin: &Origin) -> CResult<RichCrateVersion> { @@ -1897,13 +1896,3 @@ async fn fetch_uppercase_name() { let _ = k.rich_crate(&Origin::from_crates_io_name("inflector")).unwrap(); } -pub fn block_on<O>(f: impl futures::Future<Output=O>) -> O { - match tokio::runtime::Handle::try_current() { - Ok(h) => h.enter(|| futures::executor::block_on(f)), - Err(_) => { - eprintln!("Boo, needs to set up a Tokio runtime"); - let mut rt = tokio::runtime::Runtime::new().expect("tokio runtime"); - rt.block_on(f) - } - } -} diff --git a/reindex/src/bin/reindex_crates.rs b/reindex/src/bin/reindex_crates.rs index 51b9059..b4eb3f8 100644 --- a/reindex/src/bin/reindex_crates.rs +++ b/reindex/src/bin/reindex_crates.rs @@ -62,6 +62,8 @@ async fn main() { } }); + let handle = Arc::new(tokio::runtime::Handle::current()); + let seen_repos = &Mutex::new(HashSet::new()); let _ = pre.join().unwrap(); rayon::scope(move |scope| { @@ -79,6 +81,7 @@ async fn main() { return; } let crates = Arc::clone(&crates); + let handle = Arc::clone(&handle); let renderer = Arc::clone(&renderer); let tx = tx.clone(); scope.spawn(move |scope| { @@ -86,7 +89,7 @@ async fn main() { return; } print!("{} ", i); - match kitchen_sink::block_on(crates.index_crate_highest_version(&origin)) { + match handle.enter(|| futures::executor::block_on(crates.index_crate_highest_version(&origin))) { Ok(()) => {}, err => { print_res(err); @@ -94,7 +97,7 @@ async fn main() { }, } scope.spawn(move |scope| { - match kitchen_sink::block_on(index_crate(&crates, &origin, &renderer, &tx)) { + match handle.enter(|| futures::executor::block_on(index_crate(&crates, &origin, &renderer, &tx))) { Ok(v) => { if repos { scope.spawn(move |_| { |