@@ -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
1212open System
13- open System.Collections .Concurrent
1413open System.Collections .Generic
1514open System.Diagnostics
1615open 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
39723972type 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
39863976let 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>]
41354108module Shim =
0 commit comments