|
if (assembly_resolver.value == null) { |
|
lock (module_lock) { |
|
assembly_resolver = Disposable.Owned (new DefaultAssemblyResolver () as IAssemblyResolver); |
|
} |
|
} |
|
|
|
return assembly_resolver.value; |
It seems like this sequence of events might be possible, resulting in creation of an DefaultAssemblyResolver instance that's never disposed:
- Thread 1 sees
assembly_resolver.value == null
- Thread 2 sees
assembly_resolver.value == null
- Thread 1 enters the
lock block and sets assembly_resolver to a new instance
- Thread 2 enters the
lock block and re-sets assembly_resolver to a new instance
The instance in step 3 is now lost and was never disposed.
cecil/Mono.Cecil/ModuleDefinition.cs
Lines 387 to 393 in 8e1ae7b
It seems like this sequence of events might be possible, resulting in creation of an DefaultAssemblyResolver instance that's never disposed:
assembly_resolver.value == nullassembly_resolver.value == nulllockblock and setsassembly_resolverto a new instancelockblock and re-setsassembly_resolverto a new instanceThe instance in step 3 is now lost and was never disposed.