diff --git a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs index a3f727c292ff5..95d07b786c9e5 100644 --- a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs +++ b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs @@ -1972,7 +1972,7 @@ impl TurboTasksBackendInner { } let this = self.clone(); - let snapshot = turbo_tasks::spawn_blocking(move || this.snapshot()).await; + let snapshot = turbo_tasks::spawn_blocking_rayon(move || this.snapshot()).await; if let Some((snapshot_start, new_data)) = snapshot { last_snapshot = snapshot_start; if new_data { diff --git a/turbopack/crates/turbo-tasks-fs/src/retry.rs b/turbopack/crates/turbo-tasks-fs/src/retry.rs index 70ce965f234ad..588f63276c0fb 100644 --- a/turbopack/crates/turbo-tasks-fs/src/retry.rs +++ b/turbopack/crates/turbo-tasks-fs/src/retry.rs @@ -29,7 +29,7 @@ where { let path = path.as_ref().to_owned(); - turbo_tasks::spawn_blocking(move || { + turbo_tasks::spawn_blocking_tokio(move || { let mut attempt = 1; loop { diff --git a/turbopack/crates/turbo-tasks/src/lib.rs b/turbopack/crates/turbo-tasks/src/lib.rs index da58de2473216..7570eee54dd73 100644 --- a/turbopack/crates/turbo-tasks/src/lib.rs +++ b/turbopack/crates/turbo-tasks/src/lib.rs @@ -109,8 +109,8 @@ pub use manager::{ CurrentCellRef, ReadConsistency, TaskPersistence, TurboTasks, TurboTasksApi, TurboTasksBackendApi, TurboTasksBackendApiExt, TurboTasksCallApi, Unused, UpdateInfo, dynamic_call, emit, mark_finished, mark_root, mark_session_dependent, mark_stateful, - prevent_gc, run_once, run_once_with_reason, spawn_blocking, spawn_thread, trait_call, - turbo_tasks, turbo_tasks_scope, + prevent_gc, run_once, run_once_with_reason, spawn_blocking_rayon, spawn_blocking_tokio, + spawn_thread, trait_call, turbo_tasks, turbo_tasks_scope, }; pub use output::OutputContent; pub use raw_vc::{CellId, RawVc, ReadRawVcFuture, ResolveTypeError}; diff --git a/turbopack/crates/turbo-tasks/src/manager.rs b/turbopack/crates/turbo-tasks/src/manager.rs index 5a5c238770150..e28e0d0919bcd 100644 --- a/turbopack/crates/turbo-tasks/src/manager.rs +++ b/turbopack/crates/turbo-tasks/src/manager.rs @@ -1772,7 +1772,9 @@ pub fn emit(collectible: ResolvedVc) { }) } -pub async fn spawn_blocking(func: impl FnOnce() -> T + Send + 'static) -> T { +pub async fn spawn_blocking_tokio( + func: impl FnOnce() -> T + Send + 'static, +) -> T { let turbo_tasks = turbo_tasks(); let span = Span::current(); let (result, duration, alloc_info) = tokio::task::spawn_blocking(|| { @@ -1789,6 +1791,27 @@ pub async fn spawn_blocking(func: impl FnOnce() -> T + Send + result } +pub async fn spawn_blocking_rayon( + func: impl FnOnce() -> T + Send + 'static, +) -> T { + let (tx, rx) = tokio::sync::oneshot::channel(); + + let turbo_tasks = turbo_tasks(); + let span = Span::current(); + rayon::spawn(|| { + let _guard = span.entered(); + let start = Instant::now(); + let start_allocations = TurboMalloc::allocation_counters(); + let r = turbo_tasks_scope(turbo_tasks, func); + let _ = tx.send((r, start.elapsed(), start_allocations.until_now())); + }); + + let (result, duration, alloc_info) = rx.await.unwrap(); + capture_future::add_duration(duration); + capture_future::add_allocation_info(alloc_info); + result +} + pub fn spawn_thread(func: impl FnOnce() + Send + 'static) { let handle = Handle::current(); let span = info_span!("thread").or_current(); diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/content.rs b/turbopack/crates/turbopack-browser/src/ecmascript/content.rs index d970d1eaf17df..b0851a51bca98 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/content.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/content.rs @@ -128,7 +128,7 @@ impl EcmascriptBrowserChunkContent { let mut code = code.build(); if let MinifyType::Minify { mangle } = this.chunking_context.await?.minify_type() { - code = minify(&code, source_maps, mangle)?; + code = minify(code, source_maps, mangle).await?; } Ok(code.cell()) diff --git a/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs b/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs index 241bac72b2a39..55bd406e25c1c 100644 --- a/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs +++ b/turbopack/crates/turbopack-browser/src/ecmascript/evaluate/chunk.rs @@ -194,7 +194,7 @@ impl EcmascriptBrowserEvaluateChunk { let mut code = code.build(); if let MinifyType::Minify { mangle } = this.chunking_context.await?.minify_type() { - code = minify(&code, source_maps, mangle)?; + code = minify(code, source_maps, mangle).await?; } Ok(code.cell()) diff --git a/turbopack/crates/turbopack-ecmascript/src/minify.rs b/turbopack/crates/turbopack-ecmascript/src/minify.rs index a7e85af651ba1..f2deae40c507d 100644 --- a/turbopack/crates/turbopack-ecmascript/src/minify.rs +++ b/turbopack/crates/turbopack-ecmascript/src/minify.rs @@ -31,7 +31,11 @@ use turbopack_core::{ use crate::parse::generate_js_source_map; #[instrument(level = Level::INFO, skip_all)] -pub fn minify(code: &Code, source_maps: bool, mangle: Option) -> Result { +pub async fn minify(code: Code, source_maps: bool, mangle: Option) -> Result { + turbo_tasks::spawn_blocking_rayon(move || minify_inner(code, source_maps, mangle)).await +} + +fn minify_inner(code: Code, source_maps: bool, mangle: Option) -> Result { let source_maps = source_maps .then(|| code.generate_source_map_ref()) .transpose()?; @@ -139,8 +143,8 @@ pub fn minify(code: &Code, source_maps: bool, mangle: Option) -> Res src_map_buf, Some(original_map), // We do not inline source contents. - // We provide a synthesized value to `cm.new_source_file` above, so it cannot be - // the value user expect anyway. + // We provide a synthesized value to `cm.new_source_file` above, so it cannot + // be the value user expect anyway. false, )?), ); diff --git a/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs b/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs index 1c38092470959..b5f073284b7c4 100644 --- a/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs +++ b/turbopack/crates/turbopack-nodejs/src/ecmascript/node/content.rs @@ -78,7 +78,7 @@ impl EcmascriptBuildNodeChunkContent { let mut code = code.build(); if let MinifyType::Minify { mangle } = this.chunking_context.await?.minify_type() { - code = minify(&code, source_maps, mangle)?; + code = minify(code, source_maps, mangle).await?; } Ok(code.cell())