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();
{
return true;
}
-
- uint8_t* GetLoaderAllocatorObjectForGC()
- {
- // [LOCALGC TODO] this is not correct
- return nullptr;
- }
};
class Object
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);
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
}
}
+uint8_t* GCToEEInterface::GetLoaderAllocatorObjectForGC(Object* pObject)
+{
+ return NULL;
+}
+
void GCToEEInterface::SyncBlockCacheWeakPtrScan(HANDLESCANPROC /*scanProc*/, uintptr_t /*lp1*/, uintptr_t /*lp2*/)
{
}
}
}
+
+uint8_t* GCToEEInterface::GetLoaderAllocatorObjectForGC(Object* pObject)
+{
+ CONTRACTL
+ {
+ NOTHROW;
+ GC_NOTRIGGER;
+ }
+ CONTRACTL_END;
+
+ return pObject->GetMethodTable()->GetLoaderAllocatorObjectForGC();
+}
+
bool GCToEEInterface::IsPreemptiveGCDisabled()
{
WRAPPER_NO_CONTRACT;
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);