Skip to content

Commit

Permalink
refactor(compilation): Add callback to factorizeTask and make process…
Browse files Browse the repository at this point in the history
… dependencies happen after all dependencies get factorized (#4835)

refactor(compilation): process dependencies should happen after all dependencies get factorized
  • Loading branch information
JSerFeng authored Jan 17, 2024
1 parent 6b65c36 commit 5031972
Show file tree
Hide file tree
Showing 3 changed files with 142 additions and 79 deletions.
41 changes: 33 additions & 8 deletions crates/rspack_core/src/compiler/compilation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@ use crate::{
CleanTask, CleanTaskResult, CodeGenerationResult, CodeGenerationResults, CompilationLogger,
CompilationLogging, CompilerOptions, ContentHashArgs, ContextDependency, DependencyId,
DependencyParents, DependencyType, Entry, EntryData, EntryOptions, Entrypoint, ErrorSpan,
FactorizeQueue, FactorizeTask, FactorizeTaskResult, Filename, Logger, Module, ModuleFactory,
ModuleGraph, ModuleGraphModule, ModuleIdentifier, ModuleProfile, NormalModuleSource, PathData,
ProcessAssetsArgs, ProcessDependenciesQueue, ProcessDependenciesResult, ProcessDependenciesTask,
RenderManifestArgs, Resolve, ResolverFactory, RuntimeGlobals, RuntimeModule,
RuntimeRequirementsInTreeArgs, RuntimeSpec, SharedPluginDriver, SourceType, Stats, TaskResult,
WorkerTask,
FactorizeQueue, FactorizeTask, FactorizeTaskResult, Filename, Logger, Module,
ModuleCreationCallback, ModuleFactory, ModuleGraph, ModuleGraphModule, ModuleIdentifier,
ModuleProfile, NormalModuleSource, PathData, ProcessAssetsArgs, ProcessDependenciesQueue,
ProcessDependenciesResult, ProcessDependenciesTask, RenderManifestArgs, Resolve, ResolverFactory,
RuntimeGlobals, RuntimeModule, RuntimeRequirementsInTreeArgs, RuntimeSpec, SharedPluginDriver,
SourceType, Stats, TaskResult, WorkerTask,
};
use crate::{tree_shaking::visitor::OptimizeAnalyzeResult, Context};

Expand Down Expand Up @@ -568,6 +568,7 @@ impl Compilation {
parent_module
.and_then(|m| m.as_normal_module())
.and_then(|module| module.name_for_condition()),
None,
);
});

Expand Down Expand Up @@ -681,7 +682,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(module.identifier()),
Expand All @@ -693,16 +697,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);

result_tx
.send(Ok(TaskResult::ProcessDependencies(Box::new(
let tx = result_tx.clone();

tokio::spawn(async move {
loop {
if remaining == 0 {
break;
}

rx.recv().await;
remaining -= 1;
}

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);

Expand All @@ -721,6 +742,7 @@ impl Compilation {
context_dependencies,
missing_dependencies,
diagnostics,
callback,
} = task_result;
if !diagnostics.is_empty() {
if let Some(id) = original_module_identifier {
Expand Down Expand Up @@ -780,6 +802,7 @@ impl Compilation {
dependencies,
is_entry,
current_profile,
callback,
});
tracing::trace!("Module created: {}", &module_identifier);
} else {
Expand Down Expand Up @@ -1119,6 +1142,7 @@ impl Compilation {
resolve_options: Option<Box<Resolve>>,
lazy_visit_modules: std::collections::HashSet<String>,
issuer: Option<Box<str>>,
callback: Option<ModuleCreationCallback>,
) {
let current_profile = self.options.profile.then(Box::<ModuleProfile>::default);
let dependency = dependencies[0].get_dependency(&self.module_graph).clone();
Expand Down Expand Up @@ -1149,6 +1173,7 @@ impl Compilation {
plugin_driver: self.plugin_driver.clone(),
cache: self.cache.clone(),
current_profile,
callback,
});
}

Expand Down
39 changes: 37 additions & 2 deletions crates/rspack_core/src/compiler/queue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use crate::{
ModuleGraph, ModuleGraphModule, ModuleIdentifier, ModuleProfile, Resolve, ResolverFactory,
SharedPluginDriver, WorkerQueue,
};
use crate::{DependencyId, ExportInfo, ExportsInfo, UsageState};
use crate::{BoxModule, DependencyId, ExportInfo, ExportsInfo, UsageState};

#[derive(Debug)]
pub enum TaskResult {
Expand Down Expand Up @@ -43,6 +43,7 @@ pub struct FactorizeTask {
pub plugin_driver: SharedPluginDriver,
pub cache: Arc<Cache>,
pub current_profile: Option<Box<ModuleProfile>>,
pub callback: Option<ModuleCreationCallback>,
}

/// a struct temporarily used creating ExportsInfo
Expand All @@ -52,7 +53,7 @@ pub struct ExportsInfoRelated {
pub other_exports_info: ExportInfo,
pub side_effects_info: ExportInfo,
}
#[derive(Debug)]

pub struct FactorizeTaskResult {
pub original_module_identifier: Option<ModuleIdentifier>,
/// Result will be available if [crate::ModuleFactory::create] returns `Ok`.
Expand All @@ -66,6 +67,28 @@ pub struct FactorizeTaskResult {
pub context_dependencies: HashSet<PathBuf>,
pub missing_dependencies: HashSet<PathBuf>,
pub diagnostics: Vec<Diagnostic>,
pub callback: Option<ModuleCreationCallback>,
}

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("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("file_dependencies", &self.file_dependencies)
.field("context_dependencies", &self.context_dependencies)
.field("missing_dependencies", &self.missing_dependencies)
.field("diagnostics", &self.diagnostics)
.finish()
}
}

impl FactorizeTaskResult {
Expand Down Expand Up @@ -134,6 +157,7 @@ impl WorkerTask for FactorizeTask {
context_dependencies: Default::default(),
missing_dependencies: Default::default(),
diagnostics: Default::default(),
callback: self.callback,
};

// Error and result are not mutually exclusive in webpack module factorization.
Expand Down Expand Up @@ -204,6 +228,7 @@ pub struct AddTask {
pub dependencies: Vec<DependencyId>,
pub is_entry: bool,
pub current_profile: Option<Box<ModuleProfile>>,
pub callback: Option<ModuleCreationCallback>,
}

#[derive(Debug)]
Expand Down Expand Up @@ -256,6 +281,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,
})));
Expand All @@ -282,6 +311,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,
Expand Down Expand Up @@ -463,3 +496,5 @@ impl CleanTask {
}

pub type CleanQueue = WorkerQueue<CleanTask>;

pub type ModuleCreationCallback = Box<dyn FnOnce(&BoxModule) + Send>;
Loading

0 comments on commit 5031972

Please sign in to comment.