summaryrefslogtreecommitdiff
path: root/src/gc/objecthandle.cpp
diff options
context:
space:
mode:
authorJan Kotas <jkotas@microsoft.com>2015-10-15 07:14:05 -0700
committerJan Kotas <jkotas@microsoft.com>2015-10-15 08:37:24 -0700
commit38034a26ff4e40e98d1af32abe5baef2c3eeea52 (patch)
tree987ede790cce6f2540f0e74ee71da961eb826f7b /src/gc/objecthandle.cpp
parentc826885f85991fbeb1e99930f08ba4c3c4b8f9a8 (diff)
downloadcoreclr-38034a26ff4e40e98d1af32abe5baef2c3eeea52.tar.gz
coreclr-38034a26ff4e40e98d1af32abe5baef2c3eeea52.tar.bz2
coreclr-38034a26ff4e40e98d1af32abe5baef2c3eeea52.zip
Cleanup GC-EE Interface
- Add proper abstractions for threading methods to GCToEEInterface - Split sample gcenv into multiple files to avoid redundant content - Add handle table methods needed by .NET Native WinRT implementation Part of #1550
Diffstat (limited to 'src/gc/objecthandle.cpp')
-rw-r--r--src/gc/objecthandle.cpp109
1 files changed, 78 insertions, 31 deletions
diff --git a/src/gc/objecthandle.cpp b/src/gc/objecthandle.cpp
index 8e07e9e20f..b62407a765 100644
--- a/src/gc/objecthandle.cpp
+++ b/src/gc/objecthandle.cpp
@@ -46,7 +46,7 @@ struct VARSCANINFO
{
LPARAM lEnableMask; // mask of types to trace
HANDLESCANPROC pfnTrace; // tracing function to use
- LPARAM lp2; // second parameter
+ LPARAM lp2; // second parameter
};
@@ -73,7 +73,7 @@ void CALLBACK VariableTraceDispatcher(_UNCHECKED_OBJECTREF *pObjRef, LPARAM *pEx
}
}
-#ifdef FEATURE_COMINTEROP
+#if defined(FEATURE_COMINTEROP) || defined(FEATURE_REDHAWK)
/*
* Scan callback for tracing ref-counted handles.
*
@@ -97,12 +97,7 @@ void CALLBACK PromoteRefCounted(_UNCHECKED_OBJECTREF *pObjRef, LPARAM *pExtraInf
if (!HndIsNullOrDestroyedHandle(pObj) && !GCHeap::GetGCHeap()->IsPromoted(pObj))
{
- //<REVISIT_TODO>@todo optimize the access to the ref-count
- ComCallWrapper* pWrap = ComCallWrapper::GetWrapperForObject((OBJECTREF)pObj);
- _ASSERTE(pWrap != NULL);
-
- BOOL fIsActive = pWrap->IsWrapperActive();
- if (fIsActive)
+ if (GCToEEInterface::RefCountedHandleCallbacks(pObj))
{
_ASSERTE(lp2);
promote_func* callback = (promote_func*) lp2;
@@ -113,7 +108,7 @@ void CALLBACK PromoteRefCounted(_UNCHECKED_OBJECTREF *pObjRef, LPARAM *pExtraInf
// Assert this object wasn't relocated since we are passing a temporary object's address.
_ASSERTE(pOldObj == pObj);
}
-#endif // FEATURE_COMINTEROP
+#endif // FEATURE_COMINTEROP || FEATURE_REDHAWK
void CALLBACK TraceDependentHandle(_UNCHECKED_OBJECTREF *pObjRef, LPARAM *pExtraInfo, LPARAM lp1, LPARAM lp2)
{
@@ -446,14 +441,28 @@ void CALLBACK ScanPointerForProfilerAndETW(_UNCHECKED_OBJECTREF *pObjRef, LPARAM
break;
case HNDTYPE_VARIABLE:
-#if 0 // this feature appears to be unused for now
- rootFlags |= COR_PRF_GC_ROOT_VARIABLE;
+#ifdef FEATURE_REDHAWK
+ {
+ // Set the appropriate ETW flags for the current strength of this variable handle
+ UINT nVarHandleType = GetVariableHandleType(handle);
+ if (((nVarHandleType & VHT_WEAK_SHORT) != 0) ||
+ ((nVarHandleType & VHT_WEAK_LONG) != 0))
+ {
+ rootFlags |= kEtwGCRootFlagsWeakRef;
+ }
+ if ((nVarHandleType & VHT_PINNED) != 0)
+ {
+ rootFlags |= kEtwGCRootFlagsPinning;
+ }
+
+ // No special ETW flag for strong handles (VHT_STRONG)
+ }
#else
_ASSERTE(!"Variable handle encountered");
#endif
break;
-#ifdef FEATURE_COMINTEROP
+#if defined(FEATURE_COMINTEROP) && !defined(FEATURE_REDHAWK)
case HNDTYPE_REFCOUNTED:
rootFlags |= kEtwGCRootFlagsRefCounted;
if (*pRef != NULL)
@@ -463,7 +472,7 @@ void CALLBACK ScanPointerForProfilerAndETW(_UNCHECKED_OBJECTREF *pObjRef, LPARAM
rootFlags |= kEtwGCRootFlagsWeakRef;
}
break;
-#endif // FEATURE_COMINTEROP
+#endif // FEATURE_COMINTEROP || FEATURE_REDHAWK
}
_UNCHECKED_OBJECTREF pSec = NULL;
@@ -948,6 +957,17 @@ OBJECTHANDLE CreateVariableHandle(HHANDLETABLE hTable, OBJECTREF object, UINT ty
return HndCreateHandle(hTable, HNDTYPE_VARIABLE, object, (LPARAM)type);
}
+/*
+* GetVariableHandleType.
+*
+* Retrieves the dynamic type of a variable-strength handle.
+*/
+UINT GetVariableHandleType(OBJECTHANDLE handle)
+{
+ WRAPPER_NO_CONTRACT;
+
+ return (UINT)HndGetHandleExtraInfo(handle);
+}
/*
* UpdateVariableHandleType.
@@ -981,6 +1001,23 @@ void UpdateVariableHandleType(OBJECTHANDLE handle, UINT type)
HndSetHandleExtraInfo(handle, HNDTYPE_VARIABLE, (LPARAM)type);
}
+/*
+* CompareExchangeVariableHandleType.
+*
+* Changes the dynamic type of a variable-strength handle. Unlike UpdateVariableHandleType we assume that the
+* types have already been validated.
+*/
+UINT CompareExchangeVariableHandleType(OBJECTHANDLE handle, UINT oldType, UINT newType)
+{
+ WRAPPER_NO_CONTRACT;
+
+ // verify that we are being asked to get/set valid types
+ _ASSERTE(IS_VALID_VHT_VALUE(oldType) && IS_VALID_VHT_VALUE(newType));
+
+ // attempt to store the type in the handle's extra info
+ return (UINT)HndCompareExchangeHandleExtraInfo(handle, HNDTYPE_VARIABLE, (LPARAM)oldType, (LPARAM)newType);
+}
+
/*
* TraceVariableHandles.
@@ -1122,7 +1159,7 @@ void Ref_TraceNormalRoots(UINT condemned, UINT maxgen, ScanContext* sc, Ref_prom
// promote objects pointed to by variable handles whose dynamic type is VHT_STRONG
TraceVariableHandles(PromoteObject, LPARAM(sc), LPARAM(fn), VHT_STRONG, condemned, maxgen, flags);
-#ifdef FEATURE_COMINTEROP
+#if defined(FEATURE_COMINTEROP) || defined(FEATURE_REDHAWK)
// don't scan ref-counted handles during concurrent phase as the clean-up of CCWs can race with AD unload and cause AV's
if (!sc->concurrent)
{
@@ -1141,7 +1178,7 @@ void Ref_TraceNormalRoots(UINT condemned, UINT maxgen, ScanContext* sc, Ref_prom
walk = walk->pNext;
}
}
-#endif // FEATURE_COMINTEROP
+#endif // FEATURE_COMINTEROP || FEATURE_REDHAWK
}
#ifdef FEATURE_COMINTEROP
@@ -1184,9 +1221,9 @@ void Ref_CheckReachable(UINT condemned, UINT maxgen, LPARAM lp1)
UINT types[] =
{
HNDTYPE_WEAK_LONG,
-#ifdef FEATURE_COMINTEROP
+#if defined(FEATURE_COMINTEROP) || defined(FEATURE_REDHAWK)
HNDTYPE_REFCOUNTED,
-#endif // FEATURE_COMINTEROP
+#endif // FEATURE_COMINTEROP || FEATURE_REDHAWK
};
// check objects pointed to by short weak handles
@@ -1534,8 +1571,10 @@ void Ref_UpdatePointers(UINT condemned, UINT maxgen, ScanContext* sc, Ref_promot
HNDTYPE_WEAK_SHORT,
HNDTYPE_WEAK_LONG,
HNDTYPE_STRONG,
-#ifdef FEATURE_COMINTEROP
+#if defined(FEATURE_COMINTEROP) || defined(FEATURE_REDHAWK)
HNDTYPE_REFCOUNTED,
+#endif // FEATURE_COMINTEROP || FEATURE_REDHAWK
+#ifdef FEATURE_COMINTEROP
HNDTYPE_WEAK_WINRT,
#endif // FEATURE_COMINTEROP
HNDTYPE_SIZEDREF,
@@ -1547,12 +1586,12 @@ void Ref_UpdatePointers(UINT condemned, UINT maxgen, ScanContext* sc, Ref_promot
HandleTableMap *walk = &g_HandleTableMap;
while (walk) {
for (UINT i = 0; i < INITIAL_HANDLE_TABLE_ARRAY_SIZE; i ++)
- if (walk->pBuckets[i] != NULL)
- {
- HHANDLETABLE hTable = walk->pBuckets[i]->pTable[getSlotNumber(sc)];
- if (hTable)
- HndScanHandlesForGC(hTable, UpdatePointer, LPARAM(sc), LPARAM(fn), types, _countof(types), condemned, maxgen, flags);
- }
+ if (walk->pBuckets[i] != NULL)
+ {
+ HHANDLETABLE hTable = walk->pBuckets[i]->pTable[getSlotNumber(sc)];
+ if (hTable)
+ HndScanHandlesForGC(hTable, UpdatePointer, LPARAM(sc), LPARAM(fn), types, _countof(types), condemned, maxgen, flags);
+ }
walk = walk->pNext;
}
@@ -1578,10 +1617,12 @@ void Ref_ScanPointersForProfilerAndETW(UINT maxgen, LPARAM lp1)
HNDTYPE_WEAK_SHORT,
HNDTYPE_WEAK_LONG,
HNDTYPE_STRONG,
-#ifdef FEATURE_COMINTEROP
+#if defined(FEATURE_COMINTEROP) || defined(FEATURE_REDHAWK)
HNDTYPE_REFCOUNTED,
+#endif // FEATURE_COMINTEROP || FEATURE_REDHAWK
+#ifdef FEATURE_COMINTEROP
HNDTYPE_WEAK_WINRT,
-#endif // FEATURE_COMINTEROP,
+#endif // FEATURE_COMINTEROP
HNDTYPE_PINNED,
// HNDTYPE_VARIABLE,
HNDTYPE_ASYNCPINNED,
@@ -1671,8 +1712,10 @@ void Ref_AgeHandles(UINT condemned, UINT maxgen, LPARAM lp1)
HNDTYPE_PINNED,
HNDTYPE_VARIABLE,
-#ifdef FEATURE_COMINTEROP
+#if defined(FEATURE_COMINTEROP) || defined(FEATURE_REDHAWK)
HNDTYPE_REFCOUNTED,
+#endif // FEATURE_COMINTEROP || FEATURE_REDHAWK
+#ifdef FEATURE_COMINTEROP
HNDTYPE_WEAK_WINRT,
#endif // FEATURE_COMINTEROP
HNDTYPE_ASYNCPINNED,
@@ -1712,8 +1755,10 @@ void Ref_RejuvenateHandles(UINT condemned, UINT maxgen, LPARAM lp1)
HNDTYPE_PINNED,
HNDTYPE_VARIABLE,
-#ifdef FEATURE_COMINTEROP
+#if defined(FEATURE_COMINTEROP) || defined(FEATURE_REDHAWK)
HNDTYPE_REFCOUNTED,
+#endif // FEATURE_COMINTEROP || FEATURE_REDHAWK
+#ifdef FEATURE_COMINTEROP
HNDTYPE_WEAK_WINRT,
#endif // FEATURE_COMINTEROP
HNDTYPE_ASYNCPINNED,
@@ -1752,8 +1797,10 @@ void Ref_VerifyHandleTable(UINT condemned, UINT maxgen, ScanContext* sc)
HNDTYPE_PINNED,
HNDTYPE_VARIABLE,
-#ifdef FEATURE_COMINTEROP
+#if defined(FEATURE_COMINTEROP) || defined(FEATURE_REDHAWK)
HNDTYPE_REFCOUNTED,
+#endif // FEATURE_COMINTEROP || FEATURE_REDHAWK
+#ifdef FEATURE_COMINTEROP
HNDTYPE_WEAK_WINRT,
#endif // FEATURE_COMINTEROP
HNDTYPE_ASYNCPINNED,
@@ -1781,8 +1828,8 @@ int GetCurrentThreadHomeHeapNumber()
{
WRAPPER_NO_CONTRACT;
- if (!GCHeap::IsGCHeapInitialized())
- return 0;
+ if (!GCHeap::IsGCHeapInitialized())
+ return 0;
return GCHeap::GetGCHeap()->GetHomeHeapNumber();
}