use alignlarge for poh in gcheaptraverse (#1497)
authorDavid Mason <davmason@microsoft.com>
Mon, 14 Sep 2020 17:32:24 +0000 (10:32 -0700)
committerGitHub <noreply@github.com>
Mon, 14 Sep 2020 17:32:24 +0000 (10:32 -0700)
src/SOS/Strike/eeheap.cpp

index be5b7857157f638d64e26f189d7dafacb862029e..00b2fea93a7a518ce970c13a6e793811cae08d2b 100644 (file)
@@ -1189,24 +1189,7 @@ BOOL GCHeapTraverse(const GCHeapDetails &heap, AllocInfo* pallocInfo, VISITGCHEA
             }
             else
             {
-                if (!bPinnedDone && heap.has_poh)
-                {
-                    bPinnedDone = TRUE;
-                    dwAddrSeg = (DWORD_PTR)heap.generation_table[GetMaxGeneration() + 2].start_segment;
-                    dwAddr = dwAddrSeg;
-
-                    if (segment.Request(g_sos, dwAddr, heap.original_heap_details) != S_OK)
-                    {
-                        ExtOut("Error requesting heap segment %p\n", SOS_PTR(dwAddr));
-                        return FALSE;
-                    }
-
-                    dwAddrCurrObj = (DWORD_PTR)segment.mem;
-                }
-                else
-                {
-                    break;  // Done Verifying Heap
-                }
+                break;  // Done Verifying Heap
             }
         }
 
@@ -1281,7 +1264,7 @@ BOOL GCHeapTraverse(const GCHeapDetails &heap, AllocInfo* pallocInfo, VISITGCHEA
         dwAddrCurrObj += s;
     }
 
-    // Now for the large object generation:
+    // Now for the large object and pinned object generations:
     dwAddrSeg = (DWORD_PTR)heap.generation_table[GetMaxGeneration()+1].start_segment;
     dwAddr = dwAddrSeg;
 
@@ -1317,6 +1300,7 @@ BOOL GCHeapTraverse(const GCHeapDetails &heap, AllocInfo* pallocInfo, VISITGCHEA
                 }
                 return FALSE;
             }
+
             dwAddrSeg = (DWORD_PTR)segment.next;
             if (dwAddrSeg)
             {
@@ -1329,8 +1313,24 @@ BOOL GCHeapTraverse(const GCHeapDetails &heap, AllocInfo* pallocInfo, VISITGCHEA
                 dwAddrCurrObj = (DWORD_PTR)segment.mem;
                 continue;
             }
+            else if (heap.has_poh && !bPinnedDone)
+            {
+                bPinnedDone = TRUE;
+                dwAddrSeg = (DWORD_PTR)heap.generation_table[GetMaxGeneration() + 2].start_segment;
+                dwAddr = dwAddrSeg;
+
+                if (segment.Request(g_sos, dwAddr, heap.original_heap_details) != S_OK)
+                {
+                    ExtOut("Error requesting heap segment %p\n", SOS_PTR(dwAddr));
+                    return FALSE;
+                }
+
+                dwAddrCurrObj = (DWORD_PTR)segment.mem;
+            }
             else
+            {
                 break;  // Done Verifying Heap
+            }
         }
 
         if (FAILED(GetMTOfObject(dwAddrCurrObj, &dwAddrMethTable)))