Using Spin lock instead of using RaiseTpl() to prevent UnloadImage() re-entrance.
authorvanjeff <vanjeff@de2fecce-e211-0410-80a6-f3fac2684e05>
Fri, 1 Aug 2008 08:10:49 +0000 (08:10 +0000)
committervanjeff <vanjeff@de2fecce-e211-0410-80a6-f3fac2684e05>
Fri, 1 Aug 2008 08:10:49 +0000 (08:10 +0000)
git-svn-id: https://edk2.tianocore.org/svn/edk2/trunk@5600 de2fecce-e211-0410-80a6-f3fac2684e05

edk2/MdeModulePkg/Core/Dxe/Image/Image.c

index dbb6625..477eaa3 100644 (file)
@@ -17,6 +17,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 // Module Globals\r
 //\r
 \r
+SPIN_LOCK                  mUnloadImageLock;\r
+\r
 LOADED_IMAGE_PRIVATE_DATA  *mCurrentImage = NULL;\r
 \r
 LOAD_PE32_IMAGE_PRIVATE_DATA  mLoadPe32PrivateData = {\r
@@ -137,6 +139,11 @@ CoreInitializeImageServices (
 \r
   mCurrentImage = Image;\r
 \r
+  //\r
+  // Initialize spin lock\r
+  //\r
+  InitializeSpinLock (&mUnloadImageLock);\r
+\r
   //\r
   // Fill in DXE globals\r
   //\r
@@ -1362,13 +1369,14 @@ CoreUnloadImage (
 {\r
   EFI_STATUS                 Status;\r
   LOADED_IMAGE_PRIVATE_DATA  *Image;\r
-  EFI_TPL                    OldTpl;\r
 \r
   //\r
   // Prevent possible reentrance to this function\r
   // for the same ImageHandle\r
   //\r
-  OldTpl = CoreRaiseTpl (TPL_NOTIFY);\r
+  if (!AcquireSpinLockOrFail (&mUnloadImageLock)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
 \r
   Image = CoreLoadedImageInfo (ImageHandle);\r
   if (Image == NULL ) {\r
@@ -1404,7 +1412,7 @@ CoreUnloadImage (
   }\r
 \r
 Done:\r
-  CoreRestoreTpl (OldTpl);\r
+  ReleaseSpinLock (&mUnloadImageLock);\r
   return Status;\r
 }\r
 \r