Add GetLoaderAllocatorObjectForGC to IGCToCLR (#17443)
authorDavid Mason <davmason@microsoft.com>
Fri, 6 Apr 2018 20:19:21 +0000 (13:19 -0700)
committerGitHub <noreply@github.com>
Fri, 6 Apr 2018 20:19:21 +0000 (13:19 -0700)
src/gc/env/gcenv.ee.h
src/gc/env/gcenv.object.h
src/gc/gcenv.ee.standalone.inl
src/gc/gcinterface.ee.h
src/gc/sample/gcenv.ee.cpp
src/vm/gcenv.ee.cpp
src/vm/gcenv.ee.h

index db96631..ec79877 100644 (file)
@@ -55,6 +55,9 @@ public:
     static gc_alloc_context * GetAllocContext();
 
     static void GcEnumAllocContexts(enum_alloc_context_func* fn, void* param);
+
+    static uint8_t* GetLoaderAllocatorObjectForGC(Object* pObject);
+
     // Diagnostics methods.
     static void DiagGCStart(int gen, bool isInduced);
     static void DiagUpdateGenerationBounds();
index 191c7a1..930e0bc 100644 (file)
@@ -122,12 +122,6 @@ public:
     {
         return true;
     }
-
-    uint8_t* GetLoaderAllocatorObjectForGC()
-    {
-        // [LOCALGC TODO] this is not correct
-        return nullptr;
-    }
 };
 
 class Object
index c4ec29d..4fc8ca6 100644 (file)
@@ -125,6 +125,12 @@ inline void GCToEEInterface::GcEnumAllocContexts(enum_alloc_context_func* fn, vo
     g_theGCToCLR->GcEnumAllocContexts(fn, param);
 }
 
+inline uint8_t *GCToEEInterface::GetLoaderAllocatorObjectForGC(Object* pObject)
+{
+    assert(g_theGCToCLR != nullptr);
+    return g_theGCToCLR->GetLoaderAllocatorObjectForGC(pObject);
+}
+
 inline void GCToEEInterface::DiagGCStart(int gen, bool isInduced)
 {
     assert(g_theGCToCLR != nullptr);
index 2d811e4..82d8934 100644 (file)
@@ -251,6 +251,10 @@ public:
     virtual
     void GcEnumAllocContexts(enum_alloc_context_func* fn, void* param) = 0;
 
+    // Get the Allocator for objects from collectible assemblies
+    virtual
+    uint8_t* GetLoaderAllocatorObjectForGC(Object* pObject) = 0;
+
     // Creates and returns a new thread.
     // Parameters:
     //  threadStart - The function that will serve as the thread stub for the
index 996701e..0311c0e 100644 (file)
@@ -218,6 +218,11 @@ void GCToEEInterface::GcEnumAllocContexts (enum_alloc_context_func* fn, void* pa
     }
 }
 
+uint8_t* GCToEEInterface::GetLoaderAllocatorObjectForGC(Object* pObject)
+{
+    return NULL;
+}
+
 void GCToEEInterface::SyncBlockCacheWeakPtrScan(HANDLESCANPROC /*scanProc*/, uintptr_t /*lp1*/, uintptr_t /*lp2*/)
 {
 }
index 590cc10..5954b7b 100644 (file)
@@ -347,6 +347,19 @@ void GCToEEInterface::GcEnumAllocContexts(enum_alloc_context_func* fn, void* par
     }
 }
 
+
+uint8_t* GCToEEInterface::GetLoaderAllocatorObjectForGC(Object* pObject)
+{
+    CONTRACTL
+    {
+        NOTHROW;
+        GC_NOTRIGGER;
+    }
+    CONTRACTL_END;
+
+    return pObject->GetMethodTable()->GetLoaderAllocatorObjectForGC();
+}
+
 bool GCToEEInterface::IsPreemptiveGCDisabled()
 {
     WRAPPER_NO_CONTRACT;
index 97413e3..0dbf70d 100644 (file)
@@ -35,6 +35,7 @@ public:
     Thread* GetThread();
     gc_alloc_context * GetAllocContext();
     void GcEnumAllocContexts(enum_alloc_context_func* fn, void* param);
+    uint8_t* GetLoaderAllocatorObjectForGC(Object* pObject);
 
     // Diagnostics methods.
     void DiagGCStart(int gen, bool isInduced);