Fixed deadlock in System.Resources.ResourceSet
authorPavel Pochobut <pavel.pochobut@gmail.com>
Wed, 4 Feb 2015 18:49:32 +0000 (21:49 +0300)
committerPavel Pochobut <pavel.pochobut@gmail.com>
Fri, 6 Feb 2015 21:26:51 +0000 (00:26 +0300)
commiteedb57dff27884ee4d3539ce3eda283408aea3ae
tree270006668c5216fc556097221a07414e169bc130
parentc4eb03708c4c09b47fcdf6a77e6a9abe8952ce9f
Fixed deadlock in System.Resources.ResourceSet

ResourceSet internal enumerator uses the following lock order:
1. lock _resCache (as _reader._resCache)
       in System.Resources.ResourceSet+ResourceEnumerator.Entry
2. lock reader (this)
       in the body on of _reader.AllocateStringForNameIndex

RuntimeResourceSet.GetObject uses the following lock order:
1. Lock on reader
2. Lock on _resCache
    (on the same instance as passed to the reader ctor)

That causes deadlock when one thread tries to enumerate the ResourceSet
while another thread reads a specific object from the same set.

Added lock in System.Resources.ResourceSet+ResourceEnumerator.Entry,
so both code paths locks on reader first.

Fix Connect Issue ID #580259
src/mscorlib/src/System/Resources/ResourceReader.cs