From c1ced85099e5879307bb16678c60752a65f6723f Mon Sep 17 00:00:00 2001 From: jserfeng <1114550440@qq.com> Date: Thu, 30 Nov 2023 19:43:34 +0800 Subject: [PATCH] refactor(compilation): process dependencies should happen after all dependencies get factorized --- .../rspack_core/src/compiler/compilation.rs | 40 +++++++++++++++---- crates/rspack_core/src/compiler/queue.rs | 37 ++++++++++++++++- 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/crates/rspack_core/src/compiler/compilation.rs b/crates/rspack_core/src/compiler/compilation.rs index 28a27ff550aa..734b2c4372a8 100644 --- a/crates/rspack_core/src/compiler/compilation.rs +++ b/crates/rspack_core/src/compiler/compilation.rs @@ -42,11 +42,11 @@ use crate::{ CleanTask, CleanTaskResult, CodeGenerationResult, CodeGenerationResults, CompilationLogger, CompilationLogging, CompilerOptions, ContentHashArgs, ContextDependency, DependencyId, DependencyParents, DependencyType, Entry, EntryData, EntryOptions, Entrypoint, FactorizeQueue, - FactorizeTask, FactorizeTaskResult, Filename, Logger, Module, ModuleGraph, ModuleIdentifier, - ModuleProfile, ModuleType, PathData, ProcessAssetsArgs, ProcessDependenciesQueue, - ProcessDependenciesResult, ProcessDependenciesTask, RenderManifestArgs, Resolve, ResolverFactory, - RuntimeGlobals, RuntimeModule, RuntimeSpec, SharedPluginDriver, SourceType, Stats, TaskResult, - WorkerTask, + FactorizeTask, FactorizeTaskResult, Filename, Logger, Module, ModuleCreationCallback, + ModuleGraph, ModuleIdentifier, ModuleProfile, ModuleType, PathData, ProcessAssetsArgs, + ProcessDependenciesQueue, ProcessDependenciesResult, ProcessDependenciesTask, RenderManifestArgs, + Resolve, ResolverFactory, RuntimeGlobals, RuntimeModule, RuntimeSpec, SharedPluginDriver, + SourceType, Stats, TaskResult, WorkerTask, }; use crate::{tree_shaking::visitor::OptimizeAnalyzeResult, Context}; @@ -496,6 +496,7 @@ impl Compilation { parent_module .and_then(|m| m.as_normal_module()) .and_then(|module| module.name_for_condition()), + None, ); }); @@ -627,7 +628,10 @@ impl Compilation { .module_by_identifier(original_module_identifier) .expect("Module expected"); + let (tx, mut rx) = tokio::sync::mpsc::unbounded_channel(); + let mut remaining = sorted_dependencies.len(); for dependencies in sorted_dependencies.into_values() { + let tx = tx.clone(); self.handle_module_creation( &mut factorize_queue, Some(task.original_module_identifier), @@ -641,16 +645,33 @@ impl Compilation { module .as_normal_module() .and_then(|module| module.name_for_condition()), + Some(Box::new(move |_| { + tx.send(()) + .expect("Failed to send callback to process_dependencies"); + })), ); } + drop(tx); + + let tx = result_tx.clone(); + + tokio::spawn(async move { + loop { + if remaining == 0 { + break; + } + + rx.recv().await; + remaining -= 1; + } - result_tx - .send(Ok(TaskResult::ProcessDependencies(Box::new( + tx.send(Ok(TaskResult::ProcessDependencies(Box::new( ProcessDependenciesResult { module_identifier: task.original_module_identifier, }, )))) .expect("Failed to send process dependencies result"); + }); } process_deps_time.end(start); @@ -668,6 +689,8 @@ impl Compilation { current_profile, exports_info_related, from_cache, + callback, + .. } = task_result; if let Some(counter) = &mut factorize_cache_counter { @@ -718,6 +741,7 @@ impl Compilation { dependencies, is_entry, current_profile, + callback, }); } Ok(TaskResult::Add(box task_result)) => match task_result { @@ -1016,6 +1040,7 @@ impl Compilation { resolve_options: Option>, lazy_visit_modules: std::collections::HashSet, issuer: Option>, + callback: Option, ) { let current_profile = self.options.profile.then(Box::::default); queue.add_task(FactorizeTask { @@ -1035,6 +1060,7 @@ impl Compilation { plugin_driver: self.plugin_driver.clone(), cache: self.cache.clone(), current_profile, + callback, }); } diff --git a/crates/rspack_core/src/compiler/queue.rs b/crates/rspack_core/src/compiler/queue.rs index 11ee98b5228d..5d72b5d72c4a 100644 --- a/crates/rspack_core/src/compiler/queue.rs +++ b/crates/rspack_core/src/compiler/queue.rs @@ -9,7 +9,7 @@ use crate::{ ModuleProfile, ModuleType, NormalModuleFactory, NormalModuleFactoryContext, Resolve, ResolverFactory, SharedPluginDriver, WorkerQueue, }; -use crate::{DependencyId, ExportInfo, ExportsInfo, UsageState}; +use crate::{BoxModule, DependencyId, ExportInfo, ExportsInfo, UsageState}; #[derive(Debug)] pub enum TaskResult { @@ -41,6 +41,7 @@ pub struct FactorizeTask { pub plugin_driver: SharedPluginDriver, pub cache: Arc, pub current_profile: Option>, + pub callback: Option, } /// a struct temporarily used creating ExportsInfo @@ -50,7 +51,7 @@ pub struct ExportsInfoRelated { pub other_exports_info: ExportInfo, pub side_effects_info: ExportInfo, } -#[derive(Debug)] + pub struct FactorizeTaskResult { pub original_module_identifier: Option, pub factory_result: ModuleFactoryResult, @@ -61,6 +62,26 @@ pub struct FactorizeTaskResult { pub current_profile: Option>, pub exports_info_related: ExportsInfoRelated, pub from_cache: bool, + pub callback: Option, +} + +impl std::fmt::Debug for FactorizeTaskResult { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("FactorizeTaskResult") + .field( + "original_module_identifier", + &self.original_module_identifier, + ) + .field("factory_result", &self.factory_result) + .field("module_graph_module", &self.module_graph_module) + .field("dependencies", &self.dependencies) + .field("diagnostics", &self.diagnostics) + .field("is_entry", &self.is_entry) + .field("current_profile", &self.current_profile) + .field("exports_info_related", &self.exports_info_related) + .field("from_cache", &self.from_cache) + .finish() + } } #[async_trait::async_trait] @@ -175,6 +196,7 @@ impl WorkerTask for FactorizeTask { other_exports_info, side_effects_info: side_effects_only_info, }, + callback: self.callback, }))) } } @@ -188,6 +210,7 @@ pub struct AddTask { pub dependencies: Vec, pub is_entry: bool, pub current_profile: Option>, + pub callback: Option, } #[derive(Debug)] @@ -220,6 +243,10 @@ impl AddTask { module_identifier, )?; + if let Some(callback) = self.callback { + callback(&self.module); + } + return Ok(TaskResult::Add(Box::new(AddTaskResult::ModuleReused { module: self.module, }))); @@ -246,6 +273,10 @@ impl AddTask { current_profile.mark_integration_end(); } + if let Some(callback) = self.callback { + callback(&self.module); + } + Ok(TaskResult::Add(Box::new(AddTaskResult::ModuleAdded { module: self.module, current_profile: self.current_profile, @@ -420,3 +451,5 @@ impl CleanTask { } pub type CleanQueue = WorkerQueue; + +pub type ModuleCreationCallback = Box;