diff options
author | Jan Kotas <jkotas@microsoft.com> | 2015-10-15 07:14:05 -0700 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2015-10-15 08:37:24 -0700 |
commit | 38034a26ff4e40e98d1af32abe5baef2c3eeea52 (patch) | |
tree | 987ede790cce6f2540f0e74ee71da961eb826f7b /src/gc/objecthandle.cpp | |
parent | c826885f85991fbeb1e99930f08ba4c3c4b8f9a8 (diff) | |
download | coreclr-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.cpp | 109 |
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(); } |