Add support for weak interior pointer GC handles (#4921)
authorDavid Wrighton <davidwr@microsoft.com>
Tue, 10 Sep 2024 17:34:28 +0000 (10:34 -0700)
committerGitHub <noreply@github.com>
Tue, 10 Sep 2024 17:34:28 +0000 (10:34 -0700)
.NET 9 adds a new GC handle type which is used in the collectible
assemblies implementation. This PR adds support for it.

src/SOS/Strike/strike.cpp
src/SOS/Strike/util.h

index 98a9999743956ea2206dce7cac7a8667432e87b0..6c4bac0fd22daae3ef9e39d882a5fff35668a351 100644 (file)
@@ -8887,6 +8887,8 @@ public:
                 mType = HNDTYPE_DEPENDENT;
             else if (_stricmp(type, "WeakWinRT") == 0)
                 mType = HNDTYPE_WEAK_WINRT;
+            else if (_stricmp(type, "WeakInteriorPointer") == 0)
+                mType = HNDTYPE_WEAK_INTERIOR_POINTER;
             else
                 sos::Throw<sos::Exception>("Unknown handle type '%s'.", type.GetPtr());
         }
@@ -9055,6 +9057,10 @@ private:
                     type = "WeakWinRT";
                     if (pStats) pStats->weakWinRTHandleCount++;
                     break;
+                case HNDTYPE_WEAK_INTERIOR_POINTER:
+                    type = "WeakInteriorPointer";
+                    if (pStats) pStats->weakInteriorPointerHandleCount++;
+                    break;
                 default:
                     DebugBreak();
                     type = "Unknown";
@@ -9074,6 +9080,8 @@ private:
                     mOut.WriteRow(data[i].Handle, type, ObjectPtr(objAddr), Decimal(size), ObjectPtr(data[i].Secondary), mtName);
                 else if (data[i].Type == HNDTYPE_WEAK_WINRT)
                     mOut.WriteRow(data[i].Handle, type, ObjectPtr(objAddr), Decimal(size), Pointer(data[i].Secondary), mtName);
+                else if (data[i].Type == HNDTYPE_WEAK_INTERIOR_POINTER)
+                    mOut.WriteRow(data[i].Handle, type, ObjectPtr(objAddr), Decimal(size), Pointer(data[i].Secondary), mtName);
                 else
                     mOut.WriteRow(data[i].Handle, type, ObjectPtr(objAddr), Decimal(size), "", mtName);
             }
@@ -9098,6 +9106,7 @@ private:
         PrintHandleRow("Weak Long Handles:", pStats->weakLongHandleCount);
         PrintHandleRow("Weak Short Handles:", pStats->weakShortHandleCount);
         PrintHandleRow("Weak WinRT Handles:", pStats->weakWinRTHandleCount);
+        PrintHandleRow("Weak Interior Pointer Handles:", pStats->weakInteriorPointerHandleCount);
         PrintHandleRow("Variable Handles:", pStats->variableCount);
         PrintHandleRow("SizedRef Handles:", pStats->sizedRefCount);
         PrintHandleRow("Dependent Handles:", pStats->dependentCount);
index 2ad87f2ff681de3994be93430182aad4c6a0065e..8648e311eba0b4a9f1fc3f017f2d406f1c60ca6a 100644 (file)
@@ -115,6 +115,8 @@ class MethodTable;
 #define HNDTYPE_ASYNCPINNED                     (7)
 #define HNDTYPE_SIZEDREF                        (8)
 #define HNDTYPE_WEAK_WINRT                      (9)
+#define HNDTYPE_WEAK_INTERIOR_POINTER           (10)
+
 
 class BaseObject
 {
@@ -1708,11 +1710,12 @@ struct GCHandleStatistics
     DWORD sizedRefCount;
     DWORD dependentCount;
     DWORD weakWinRTHandleCount;
+    DWORD weakInteriorPointerHandleCount;
     DWORD unknownHandleCount;
     GCHandleStatistics()
         : strongHandleCount(0), pinnedHandleCount(0), asyncPinnedHandleCount(0), refCntHandleCount(0),
           weakLongHandleCount(0), weakShortHandleCount(0), variableCount(0), sizedRefCount(0),
-          dependentCount(0), weakWinRTHandleCount(0), unknownHandleCount(0)
+          dependentCount(0), weakWinRTHandleCount(0), weakInteriorPointerHandleCount(0), unknownHandleCount(0)
     {}
     ~GCHandleStatistics()
     {