Avatar for the oxc-project user
oxc-project
oxc-resolver
BlogDocsChangelog

fix: use `Weak` references for `CachedPath` to enable proper drop

#727Merged
Comparing
09-23-fix_use_weak_references_for_cachedpath_to_enable_proper_drop
(
bc9c219
) with
main
(
e03b08a
)
CodSpeed Performance Gauge
+11%
Improvements
3
Untouched
4
Skipped
2

Benchmarks

Skipped (2)

Improved

medium
benches/resolver.rs::resolver::bench_package_json_deserialization::package_json_deserialization::medium
CodSpeed Performance Gauge
+11%
25.7 µs23.2 µs
complex_real
benches/resolver.rs::resolver::bench_package_json_deserialization::package_json_deserialization::complex_real
CodSpeed Performance Gauge
+10%
35.9 µs32.7 µs
large
benches/resolver.rs::resolver::bench_package_json_deserialization::package_json_deserialization::large
CodSpeed Performance Gauge
+8%
47.3 µs43.9 µs

Passed

small
benches/resolver.rs::resolver::bench_package_json_deserialization::package_json_deserialization::small
CodSpeed Performance Gauge
+1%
10.6 µs10.5 µs
resolver[single-thread]
benches/resolver.rs::resolver::bench_resolver::resolver[single-thread]
CodSpeed Performance Gauge
0%
484.1 µs482.5 µs
resolver[resolve from symlinks]
benches/resolver.rs::resolver::bench_resolver::resolver[resolve from symlinks]
CodSpeed Performance Gauge
-2%
61.7 ms63 ms
resolver[multi-thread]
benches/resolver.rs::resolver::bench_resolver::resolver[multi-thread]
CodSpeed Performance Gauge
-4%
492.9 µs513.8 µs

Commits

Click on a commit to change the comparison range
Base
main
e03b08a
+10.78%
fix: use `Weak` references for `CachedPath` to enable proper drop (#727) Related: * https://github.com/oxc-project/oxc/issues/10627 The resolver was experiencing memory leaks due to circular strong references between `CachedPath` objects. Even after the resolver was dropped, `CachedPath` instances (and their associated `PackageJson` data) remained in memory due to reference cycles created by Arc (reference-counted) pointers. The memory leak was caused by circular references in three fields of `CachedPathImpl`: 1. `parent: Option<CachedPath>` - Child paths held strong references to parent paths 2. `canonicalized: OnceLock<Result<CachedPath, ResolveError>>` - Paths held strong references to their canonicalized versions 3. `node_modules: OnceLock<Option<CachedPath>>` - Parent directories held strong references to their node_modules subdirectories These created reference cycles preventing Arc reference counts from reaching zero. Converted all fields that could create circular references to use `Weak` references: - `parent: Option<Weak<CachedPathImpl>>` - `canonicalized: OnceLock<Result<Weak<CachedPathImpl>, ResolveError>>` - `node_modules: OnceLock<Option<Weak<CachedPathImpl>>>` Updated all accessor methods to upgrade Weak references when needed: - `parent()` - Upgrades weak parent reference - `cached_node_modules()` - Stores and retrieves weak references - `canonicalize_impl()` - Stores canonicalized paths as weak references Passes `test_memory_leak_arc_cycles` that failed in the previous stack.
bc9c219
16 hours ago
by Boshen
© 2025 CodSpeed Technology
Home Terms Privacy Docs