Skip to content

Commit 7ad9e89

Browse files
authored
Revert "Further possible fix to reduce memory usage (#6390)" (#6468)
This reverts commit c370f8e.
1 parent c370f8e commit 7ad9e89

File tree

1 file changed

+16
-43
lines changed

1 file changed

+16
-43
lines changed

src/absil/ilread.fs

Lines changed: 16 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ module FSharp.Compiler.AbstractIL.ILBinaryReader
1010
#nowarn "42" // This construct is deprecated: it is only for use in the F# library
1111

1212
open System
13-
open System.Collections.Concurrent
1413
open System.Collections.Generic
1514
open System.Diagnostics
1615
open System.IO
@@ -3606,11 +3605,11 @@ let openMetadataReader (fileName, mdfile: BinaryFile, metadataPhysLoc, peinfo, p
36063605
let inbase = Filename.fileNameOfPath fileName + ": "
36073606

36083607
// All the caches. The sizes are guesstimates for the rough sharing-density of the assembly
3609-
let cacheAssemblyRef = mkCacheInt32 false inbase "ILAssemblyRef" (getNumRows TableNames.AssemblyRef)
3608+
let cacheAssemblyRef = mkCacheInt32 reduceMemoryUsage inbase "ILAssemblyRef" (getNumRows TableNames.AssemblyRef)
36103609
let cacheMethodSpecAsMethodData = mkCacheGeneric reduceMemoryUsage inbase "MethodSpecAsMethodData" (getNumRows TableNames.MethodSpec / 20 + 1)
36113610
let cacheMemberRefAsMemberData = mkCacheGeneric reduceMemoryUsage inbase "MemberRefAsMemberData" (getNumRows TableNames.MemberRef / 20 + 1)
36123611
let cacheCustomAttr = mkCacheGeneric reduceMemoryUsage inbase "CustomAttr" (getNumRows TableNames.CustomAttribute / 50 + 1)
3613-
let cacheTypeRef = mkCacheInt32 false inbase "ILTypeRef" (getNumRows TableNames.TypeRef / 20 + 1)
3612+
let cacheTypeRef = mkCacheInt32 reduceMemoryUsage inbase "ILTypeRef" (getNumRows TableNames.TypeRef / 20 + 1)
36143613
let cacheTypeRefAsType = mkCacheGeneric reduceMemoryUsage inbase "TypeRefAsType" (getNumRows TableNames.TypeRef / 20 + 1)
36153614
let cacheBlobHeapAsPropertySig = mkCacheGeneric reduceMemoryUsage inbase "BlobHeapAsPropertySig" (getNumRows TableNames.Property / 20 + 1)
36163615
let cacheBlobHeapAsFieldSig = mkCacheGeneric reduceMemoryUsage inbase "BlobHeapAsFieldSig" (getNumRows TableNames.Field / 20 + 1)
@@ -3969,19 +3968,10 @@ type ILModuleReaderImpl(ilModule: ILModuleDef, ilAssemblyRefs: Lazy<ILAssemblyRe
39693968
member x.Dispose() = dispose()
39703969

39713970
// ++GLOBAL MUTABLE STATE (concurrency safe via locking)
3971+
type ILModuleReaderCacheLockToken() = interface LockToken
39723972
type ILModuleReaderCacheKey = ILModuleReaderCacheKey of string * DateTime * ILScopeRef * bool * ReduceMemoryFlag * MetadataOnlyFlag
3973-
3974-
// Cache to extend the lifetime of a limited number of readers that are otherwise eligible for GC
3975-
type ILModuleReaderCache1LockToken() = interface LockToken
3976-
let ilModuleReaderCache1 =
3977-
new AgedLookup<ILModuleReaderCache1LockToken, ILModuleReaderCacheKey, ILModuleReader>
3978-
(stronglyHeldReaderCacheSize,
3979-
keepMax=stronglyHeldReaderCacheSize, // only strong entries
3980-
areSimilar=(fun (x, y) -> x = y))
3981-
let ilModuleReaderCache1Lock = Lock()
3982-
3983-
// // Cache to reuse readers that have already been created and are not yet GC'd
3984-
let ilModuleReaderCache2 = new ConcurrentDictionary<ILModuleReaderCacheKey, System.WeakReference<ILModuleReader>>(HashIdentity.Structural)
3973+
let ilModuleReaderCache = new AgedLookup<ILModuleReaderCacheLockToken, ILModuleReaderCacheKey, ILModuleReader>(stronglyHeldReaderCacheSize, areSimilar=(fun (x, y) -> x = y))
3974+
let ilModuleReaderCacheLock = Lock()
39853975

39863976
let stableFileHeuristicApplies fileName =
39873977
not noStableFileHeuristic && try FileSystem.IsStableFileHeuristic fileName with _ -> false
@@ -4032,29 +4022,17 @@ let OpenILModuleReader fileName opts =
40324022
let fakeKey = ILModuleReaderCacheKey(fileName, System.DateTime.UtcNow, ILScopeRef.Local, false, ReduceMemoryFlag.Yes, MetadataOnlyFlag.Yes)
40334023
fakeKey, false
40344024

4035-
let cacheResult1 =
4036-
// can't used a cached entry when reading PDBs, since it makes the returned object IDisposable
4037-
if keyOk && opts.pdbDirPath.IsNone then
4038-
ilModuleReaderCache1Lock.AcquireLock (fun ltok -> ilModuleReaderCache1.TryGet(ltok, key))
4025+
let cacheResult =
4026+
if keyOk then
4027+
if opts.pdbDirPath.IsSome then None // can't used a cached entry when reading PDBs, since it makes the returned object IDisposable
4028+
else ilModuleReaderCacheLock.AcquireLock (fun ltok -> ilModuleReaderCache.TryGet(ltok, key))
40394029
else
40404030
None
4041-
4042-
match cacheResult1 with
4031+
4032+
match cacheResult with
40434033
| Some ilModuleReader -> ilModuleReader
40444034
| None ->
40454035

4046-
let cacheResult2 =
4047-
// can't used a cached entry when reading PDBs, since it makes the returned object IDisposable
4048-
if keyOk && opts.pdbDirPath.IsNone then
4049-
ilModuleReaderCache2.TryGetValue(key)
4050-
else
4051-
false, Unchecked.defaultof<_>
4052-
4053-
let mutable res = Unchecked.defaultof<_>
4054-
match cacheResult2 with
4055-
| true, weak when weak.TryGetTarget(&res) -> res
4056-
| _ ->
4057-
40584036
let reduceMemoryUsage = (opts.reduceMemoryUsage = ReduceMemoryFlag.Yes)
40594037
let metadataOnly = (opts.metadataOnly = MetadataOnlyFlag.Yes)
40604038

@@ -4093,12 +4071,10 @@ let OpenILModuleReader fileName opts =
40934071
let ilModule, ilAssemblyRefs, _pdb = openPE (fullPath, pefile, None, reduceMemoryUsage, opts.ilGlobals, false)
40944072
new ILModuleReaderImpl(ilModule, ilAssemblyRefs, ignore)
40954073

4096-
let ilModuleReader = ilModuleReader :> ILModuleReader
40974074
if keyOk then
4098-
ilModuleReaderCache1Lock.AcquireLock (fun ltok -> ilModuleReaderCache1.Put(ltok, key, ilModuleReader))
4099-
ilModuleReaderCache2.[key] <- System.WeakReference<_>(ilModuleReader)
4100-
ilModuleReader
4101-
4075+
ilModuleReaderCacheLock.AcquireLock (fun ltok -> ilModuleReaderCache.Put(ltok, key, ilModuleReader))
4076+
4077+
ilModuleReader :> ILModuleReader
41024078

41034079
else
41044080
// This case is primarily used in fsc.exe.
@@ -4122,14 +4098,11 @@ let OpenILModuleReader fileName opts =
41224098
let ilModule, ilAssemblyRefs, pdb = openPE (fullPath, pefile, opts.pdbDirPath, reduceMemoryUsage, opts.ilGlobals, false)
41234099
let ilModuleReader = new ILModuleReaderImpl(ilModule, ilAssemblyRefs, (fun () -> ClosePdbReader pdb))
41244100

4125-
let ilModuleReader = ilModuleReader :> ILModuleReader
4126-
41274101
// Readers with PDB reader disposal logic don't go in the cache. Note the PDB reader is only used in static linking.
41284102
if keyOk && opts.pdbDirPath.IsNone then
4129-
ilModuleReaderCache1Lock.AcquireLock (fun ltok -> ilModuleReaderCache1.Put(ltok, key, ilModuleReader))
4130-
ilModuleReaderCache2.[key] <- WeakReference<_>(ilModuleReader)
4103+
ilModuleReaderCacheLock.AcquireLock (fun ltok -> ilModuleReaderCache.Put(ltok, key, ilModuleReader))
41314104

4132-
ilModuleReader
4105+
ilModuleReader :> ILModuleReader
41334106

41344107
[<AutoOpen>]
41354108
module Shim =

0 commit comments

Comments
 (0)