summaryrefslogtreecommitdiff
path: root/src/vm/peimage.cpp
diff options
context:
space:
mode:
authorJonghyun Park <parjong@gmail.com>2017-05-25 09:42:31 +0900
committerJan Kotas <jkotas@microsoft.com>2017-05-24 17:42:31 -0700
commit6cc2fb7a26040d6ab5a2f899008100a9d4f8622c (patch)
treea0ab5b7549e891a835eb5d9be5fd4df034fb49dd /src/vm/peimage.cpp
parent284e31f746fe8c80c091b5e67a922100a9c95b0f (diff)
downloadcoreclr-6cc2fb7a26040d6ab5a2f899008100a9d4f8622c.tar.gz
coreclr-6cc2fb7a26040d6ab5a2f899008100a9d4f8622c.tar.bz2
coreclr-6cc2fb7a26040d6ab5a2f899008100a9d4f8622c.zip
[x86/Linux] Reentrant PEImage::Load (#11867)
* [x86/Linux] Reentrant PEImage::Load * Use HasLoadedLayout and add comments
Diffstat (limited to 'src/vm/peimage.cpp')
-rw-r--r--src/vm/peimage.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/vm/peimage.cpp b/src/vm/peimage.cpp
index bd5ad7f27c..3536b08361 100644
--- a/src/vm/peimage.cpp
+++ b/src/vm/peimage.cpp
@@ -1096,6 +1096,7 @@ void PEImage::Load()
{
STANDARD_VM_CONTRACT;
+ // Performance optimization to avoid lock acquisition
if (HasLoadedLayout())
{
_ASSERTE(GetLoadedLayout()->IsMapped()||GetLoadedLayout()->IsILOnly());
@@ -1104,7 +1105,12 @@ void PEImage::Load()
SimpleWriteLockHolder lock(m_pLayoutLock);
- _ASSERTE(m_pLayouts[IMAGE_LOADED] == NULL);
+ // Re-check after lock is acquired as HasLoadedLayout here and the above line
+ // may return a different value in multi-threading environment.
+ if (HasLoadedLayout())
+ {
+ return;
+ }
#ifdef PLATFORM_UNIX
if (m_pLayouts[IMAGE_FLAT] != NULL