From: Aditya Mandaleeka Date: Thu, 6 Apr 2017 02:31:32 +0000 (-0700) Subject: Add creation of special handle types to IGCHandleTable. X-Git-Tag: submit/tizen/20210909.063632~11030^2~7329^2~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=910f5fbdcc5a9f89584a936e3af3f3e80636aee0;p=platform%2Fupstream%2Fdotnet%2Fruntime.git Add creation of special handle types to IGCHandleTable. Commit migrated from https://github.com/dotnet/coreclr/commit/7721f89f517f09f90d46a1078f0d26caf3b310c0 --- diff --git a/src/coreclr/src/gc/gchandletable.cpp b/src/coreclr/src/gc/gchandletable.cpp index c4b1688..f8222b1 100644 --- a/src/coreclr/src/gc/gchandletable.cpp +++ b/src/coreclr/src/gc/gchandletable.cpp @@ -37,3 +37,21 @@ OBJECTHANDLE GCHandleTable::CreateHandleOfType(void* table, Object* object, int { return ::HndCreateHandle((HHANDLETABLE)table, type, ObjectToOBJECTREF(object)); } + +OBJECTHANDLE GCHandleTable::CreateGlobalHandleOfType(Object* object, int type) +{ + return ::HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], type, ObjectToOBJECTREF(object)); +} + +OBJECTHANDLE GCHandleTable::CreateHandleWithExtraInfo(void* table, Object* object, int type, void* pExtraInfo) +{ + return ::HndCreateHandle((HHANDLETABLE)table, type, ObjectToOBJECTREF(object), reinterpret_cast(pExtraInfo)); +} + +OBJECTHANDLE GCHandleTable::CreateDependentHandle(void* table, Object* primary, Object* secondary) +{ + OBJECTHANDLE handle = ::HndCreateHandle((HHANDLETABLE)table, HNDTYPE_DEPENDENT, ObjectToOBJECTREF(primary)); + ::SetDependentHandleSecondary(handle, ObjectToOBJECTREF(secondary)); + + return handle; +} \ No newline at end of file diff --git a/src/coreclr/src/gc/gchandletableimpl.h b/src/coreclr/src/gc/gchandletableimpl.h index f98fd96..787e0c1 100644 --- a/src/coreclr/src/gc/gchandletableimpl.h +++ b/src/coreclr/src/gc/gchandletableimpl.h @@ -19,6 +19,12 @@ public: virtual void* GetHandleTableForHandle(OBJECTHANDLE handle); virtual OBJECTHANDLE CreateHandleOfType(void* table, Object* object, int type); + + virtual OBJECTHANDLE CreateHandleWithExtraInfo(void* table, Object* object, int type, void* pExtraInfo); + + virtual OBJECTHANDLE CreateDependentHandle(void* table, Object* primary, Object* secondary); + + virtual OBJECTHANDLE CreateGlobalHandleOfType(Object* object, int type); }; #endif // GCHANDLETABLE_H_ diff --git a/src/coreclr/src/gc/gcinterface.h b/src/coreclr/src/gc/gcinterface.h index 4407fac..2fe9b3a 100644 --- a/src/coreclr/src/gc/gcinterface.h +++ b/src/coreclr/src/gc/gcinterface.h @@ -397,6 +397,12 @@ public: virtual void* GetHandleTableForHandle(OBJECTHANDLE handle) = 0; virtual OBJECTHANDLE CreateHandleOfType(void* table, Object* object, int type) = 0; + + virtual OBJECTHANDLE CreateHandleWithExtraInfo(void* table, Object* object, int type, void* pExtraInfo) = 0; + + virtual OBJECTHANDLE CreateDependentHandle(void* table, Object* primary, Object* secondary) = 0; + + virtual OBJECTHANDLE CreateGlobalHandleOfType(Object* object, int type) = 0; }; // IGCHeap is the interface that the VM will use when interacting with the GC. diff --git a/src/coreclr/src/gc/objecthandle.cpp b/src/coreclr/src/gc/objecthandle.cpp index 5f5ecbf..cf749bf 100644 --- a/src/coreclr/src/gc/objecthandle.cpp +++ b/src/coreclr/src/gc/objecthandle.cpp @@ -871,24 +871,6 @@ void Ref_EndSynchronousGC(uint32_t condemned, uint32_t maxgen) */ } - -OBJECTHANDLE CreateDependentHandle(HHANDLETABLE table, OBJECTREF primary, OBJECTREF secondary) -{ - CONTRACTL - { - THROWS; - GC_NOTRIGGER; - MODE_COOPERATIVE; - } - CONTRACTL_END; - - OBJECTHANDLE handle = HndCreateHandle(table, HNDTYPE_DEPENDENT, primary); - - SetDependentHandleSecondary(handle, secondary); - - return handle; -} - void SetDependentHandleSecondary(OBJECTHANDLE handle, OBJECTREF objref) { CONTRACTL diff --git a/src/coreclr/src/gc/objecthandle.h b/src/coreclr/src/gc/objecthandle.h index 69ddb2c..a665bf7 100644 --- a/src/coreclr/src/gc/objecthandle.h +++ b/src/coreclr/src/gc/objecthandle.h @@ -100,13 +100,6 @@ inline void DestroyHandle(OBJECTHANDLE handle) HndDestroyHandle(HndGetHandleTable(handle), HNDTYPE_DEFAULT, handle); } -inline OBJECTHANDLE CreateDuplicateHandle(OBJECTHANDLE handle) { - WRAPPER_NO_CONTRACT; - - // Create a new STRONG handle in the same table as an existing handle. - return HndCreateHandle(HndGetHandleTable(handle), HNDTYPE_DEFAULT, HndFetchHandle(handle)); -} - inline void DestroyWeakHandle(OBJECTHANDLE handle) { WRAPPER_NO_CONTRACT; @@ -176,13 +169,6 @@ inline void DestroyRefcountedHandle(OBJECTHANDLE handle) HndDestroyHandle(HndGetHandleTable(handle), HNDTYPE_REFCOUNTED, handle); } -inline OBJECTHANDLE CreateWinRTWeakHandle(HHANDLETABLE table, OBJECTREF object, IWeakReference* pWinRTWeakReference) -{ - WRAPPER_NO_CONTRACT; - _ASSERTE(pWinRTWeakReference != NULL); - return HndCreateHandle(table, HNDTYPE_WEAK_WINRT, object, reinterpret_cast(pWinRTWeakReference)); -} - void DestroyWinRTWeakHandle(OBJECTHANDLE handle); #endif // FEATURE_COMINTEROP @@ -192,7 +178,6 @@ void DestroyWinRTWeakHandle(OBJECTHANDLE handle); OBJECTREF GetDependentHandleSecondary(OBJECTHANDLE handle); #ifndef DACCESS_COMPILE -OBJECTHANDLE CreateDependentHandle(HHANDLETABLE table, OBJECTREF primary, OBJECTREF secondary); void SetDependentHandleSecondary(OBJECTHANDLE handle, OBJECTREF secondary); inline void DestroyDependentHandle(OBJECTHANDLE handle) @@ -268,12 +253,6 @@ public: int GetCurrentThreadHomeHeapNumber(); -inline OBJECTHANDLE CreateGlobalTypedHandle(OBJECTREF object, int type) -{ - WRAPPER_NO_CONTRACT; - return HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], type, object); -} - inline void DestroyGlobalTypedHandle(OBJECTHANDLE handle) { WRAPPER_NO_CONTRACT; @@ -281,14 +260,6 @@ inline void DestroyGlobalTypedHandle(OBJECTHANDLE handle) HndDestroyHandleOfUnknownType(HndGetHandleTable(handle), handle); } -inline OBJECTHANDLE CreateGlobalHandle(OBJECTREF object) -{ - WRAPPER_NO_CONTRACT; - CONDITIONAL_CONTRACT_VIOLATION(ModeViolation, object == NULL); - - return HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], HNDTYPE_DEFAULT, object); -} - inline void DestroyGlobalHandle(OBJECTHANDLE handle) { WRAPPER_NO_CONTRACT; @@ -296,13 +267,6 @@ inline void DestroyGlobalHandle(OBJECTHANDLE handle) HndDestroyHandle(HndGetHandleTable(handle), HNDTYPE_DEFAULT, handle); } -inline OBJECTHANDLE CreateGlobalWeakHandle(OBJECTREF object) -{ - WRAPPER_NO_CONTRACT; - - return HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], HNDTYPE_WEAK_DEFAULT, object); -} - inline void DestroyGlobalWeakHandle(OBJECTHANDLE handle) { WRAPPER_NO_CONTRACT; @@ -310,14 +274,6 @@ inline void DestroyGlobalWeakHandle(OBJECTHANDLE handle) HndDestroyHandle(HndGetHandleTable(handle), HNDTYPE_WEAK_DEFAULT, handle); } -inline OBJECTHANDLE CreateGlobalShortWeakHandle(OBJECTREF object) -{ - WRAPPER_NO_CONTRACT; - CONDITIONAL_CONTRACT_VIOLATION(ModeViolation, object == NULL); - - return HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], HNDTYPE_WEAK_SHORT, object); -} - inline void DestroyGlobalShortWeakHandle(OBJECTHANDLE handle) { WRAPPER_NO_CONTRACT; @@ -329,13 +285,6 @@ inline void DestroyGlobalShortWeakHandle(OBJECTHANDLE handle) typedef Holder,DestroyGlobalShortWeakHandle> GlobalShortWeakHandleHolder; #endif -inline OBJECTHANDLE CreateGlobalLongWeakHandle(OBJECTREF object) -{ - WRAPPER_NO_CONTRACT; - - return HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], HNDTYPE_WEAK_LONG, object); -} - inline void DestroyGlobalLongWeakHandle(OBJECTHANDLE handle) { WRAPPER_NO_CONTRACT; @@ -343,14 +292,6 @@ inline void DestroyGlobalLongWeakHandle(OBJECTHANDLE handle) HndDestroyHandle(HndGetHandleTable(handle), HNDTYPE_WEAK_LONG, handle); } -inline OBJECTHANDLE CreateGlobalStrongHandle(OBJECTREF object) -{ - WRAPPER_NO_CONTRACT; - CONDITIONAL_CONTRACT_VIOLATION(ModeViolation, object == NULL); - - return HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], HNDTYPE_STRONG, object); -} - inline void DestroyGlobalStrongHandle(OBJECTHANDLE handle) { WRAPPER_NO_CONTRACT; @@ -362,13 +303,6 @@ inline void DestroyGlobalStrongHandle(OBJECTHANDLE handle) typedef Holder,DestroyGlobalStrongHandle> GlobalStrongHandleHolder; #endif -inline OBJECTHANDLE CreateGlobalPinningHandle(OBJECTREF object) -{ - WRAPPER_NO_CONTRACT; - - return HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], HNDTYPE_PINNED, object); -} - inline void DestroyGlobalPinningHandle(OBJECTHANDLE handle) { WRAPPER_NO_CONTRACT; @@ -377,13 +311,6 @@ inline void DestroyGlobalPinningHandle(OBJECTHANDLE handle) } #ifdef FEATURE_COMINTEROP -inline OBJECTHANDLE CreateGlobalRefcountedHandle(OBJECTREF object) -{ - WRAPPER_NO_CONTRACT; - - return HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], HNDTYPE_REFCOUNTED, object); -} - inline void DestroyGlobalRefcountedHandle(OBJECTHANDLE handle) { WRAPPER_NO_CONTRACT; diff --git a/src/coreclr/src/gc/sample/GCSample.cpp b/src/coreclr/src/gc/sample/GCSample.cpp index 45915c0..ed67e89 100644 --- a/src/coreclr/src/gc/sample/GCSample.cpp +++ b/src/coreclr/src/gc/sample/GCSample.cpp @@ -201,7 +201,7 @@ int __cdecl main(int argc, char* argv[]) return -1; // Create strong handle and store the object into it - OBJECTHANDLE oh = CreateGlobalHandle(pObj); + OBJECTHANDLE oh = HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], HNDTYPE_DEFAULT, pObj); if (oh == NULL) return -1; @@ -224,7 +224,7 @@ int __cdecl main(int argc, char* argv[]) } // Create weak handle that points to our object - OBJECTHANDLE ohWeak = CreateGlobalWeakHandle(HndFetchHandle(oh)); + OBJECTHANDLE ohWeak = HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], HNDTYPE_WEAK_DEFAULT, HndFetchHandle(oh)); if (ohWeak == NULL) return -1; diff --git a/src/coreclr/src/vm/appdomain.hpp b/src/coreclr/src/vm/appdomain.hpp index 343857b..1da057c 100644 --- a/src/coreclr/src/vm/appdomain.hpp +++ b/src/coreclr/src/vm/appdomain.hpp @@ -1325,8 +1325,16 @@ public: OBJECTHANDLE CreateDependentHandle(OBJECTREF primary, OBJECTREF secondary) { - WRAPPER_NO_CONTRACT; - return ::CreateDependentHandle(m_hHandleTableBucket->pTable[GetCurrentThreadHomeHeapNumber()], primary, secondary); + CONTRACTL + { + THROWS; + GC_NOTRIGGER; + MODE_COOPERATIVE; + } + CONTRACTL_END; + + IGCHandleTable *pHandleTable = GCHandleTableUtilities::GetGCHandleTable(); + return pHandleTable->CreateDependentHandle((void*)m_hHandleTableBucket->pTable[GetCurrentThreadHomeHeapNumber()], OBJECTREFToObject(primary), OBJECTREFToObject(secondary)); } #endif // DACCESS_COMPILE && !CROSSGEN_COMPILE diff --git a/src/coreclr/src/vm/gchandletableutilities.h b/src/coreclr/src/vm/gchandletableutilities.h index 62b68e5..dbd8efe 100644 --- a/src/coreclr/src/vm/gchandletableutilities.h +++ b/src/coreclr/src/vm/gchandletableutilities.h @@ -7,6 +7,10 @@ #include "gcinterface.h" +#ifdef FEATURE_COMINTEROP +#include +#endif + extern "C" IGCHandleTable* g_pGCHandleTable; class GCHandleTableUtilities @@ -43,6 +47,13 @@ inline OBJECTREF ObjectFromHandle(OBJECTHANDLE handle) #ifndef DACCESS_COMPILE +// Handle creation convenience functions + +inline OBJECTHANDLE CreateHandle(HHANDLETABLE table, OBJECTREF object) +{ + return GCHandleTableUtilities::GetGCHandleTable()->CreateHandleOfType(table, OBJECTREFToObject(object), HNDTYPE_DEFAULT); +} + inline OBJECTHANDLE CreateWeakHandle(HHANDLETABLE table, OBJECTREF object) { return GCHandleTableUtilities::GetGCHandleTable()->CreateHandleOfType(table, OBJECTREFToObject(object), HNDTYPE_WEAK_DEFAULT); @@ -58,11 +69,6 @@ inline OBJECTHANDLE CreateLongWeakHandle(HHANDLETABLE table, OBJECTREF object) return GCHandleTableUtilities::GetGCHandleTable()->CreateHandleOfType(table, OBJECTREFToObject(object), HNDTYPE_WEAK_LONG); } -inline OBJECTHANDLE CreateHandle(HHANDLETABLE table, OBJECTREF object) -{ - return GCHandleTableUtilities::GetGCHandleTable()->CreateHandleOfType(table, OBJECTREFToObject(object), HNDTYPE_DEFAULT); -} - inline OBJECTHANDLE CreateStrongHandle(HHANDLETABLE table, OBJECTREF object) { return GCHandleTableUtilities::GetGCHandleTable()->CreateHandleOfType(table, OBJECTREFToObject(object), HNDTYPE_STRONG); @@ -88,6 +94,55 @@ inline OBJECTHANDLE CreateRefcountedHandle(HHANDLETABLE table, OBJECTREF object) return GCHandleTableUtilities::GetGCHandleTable()->CreateHandleOfType(table, OBJECTREFToObject(object), HNDTYPE_REFCOUNTED); } +// Global handle creation convenience functions + +inline OBJECTHANDLE CreateGlobalHandle(OBJECTREF object) +{ + CONDITIONAL_CONTRACT_VIOLATION(ModeViolation, object == NULL); + return GCHandleTableUtilities::GetGCHandleTable()->CreateGlobalHandleOfType(OBJECTREFToObject(object), HNDTYPE_DEFAULT); +} + +inline OBJECTHANDLE CreateGlobalWeakHandle(OBJECTREF object) +{ + return GCHandleTableUtilities::GetGCHandleTable()->CreateGlobalHandleOfType(OBJECTREFToObject(object), HNDTYPE_WEAK_DEFAULT); +} + +inline OBJECTHANDLE CreateGlobalShortWeakHandle(OBJECTREF object) +{ + CONDITIONAL_CONTRACT_VIOLATION(ModeViolation, object == NULL); + return GCHandleTableUtilities::GetGCHandleTable()->CreateGlobalHandleOfType(OBJECTREFToObject(object), HNDTYPE_WEAK_SHORT); +} + +inline OBJECTHANDLE CreateGlobalLongWeakHandle(OBJECTREF object) +{ + return GCHandleTableUtilities::GetGCHandleTable()->CreateGlobalHandleOfType(OBJECTREFToObject(object), HNDTYPE_WEAK_LONG); +} + +inline OBJECTHANDLE CreateGlobalStrongHandle(OBJECTREF object) +{ + CONDITIONAL_CONTRACT_VIOLATION(ModeViolation, object == NULL); + return GCHandleTableUtilities::GetGCHandleTable()->CreateGlobalHandleOfType(OBJECTREFToObject(object), HNDTYPE_STRONG); +} + +inline OBJECTHANDLE CreateGlobalPinningHandle(OBJECTREF object) +{ + return GCHandleTableUtilities::GetGCHandleTable()->CreateGlobalHandleOfType(OBJECTREFToObject(object), HNDTYPE_PINNED); +} + +inline OBJECTHANDLE CreateGlobalRefcountedHandle(OBJECTREF object) +{ + return GCHandleTableUtilities::GetGCHandleTable()->CreateGlobalHandleOfType(OBJECTREFToObject(object), HNDTYPE_REFCOUNTED); +} + +// Special handle creation convenience functions + +#ifdef FEATURE_COMINTEROP +inline OBJECTHANDLE CreateWinRTWeakHandle(HHANDLETABLE table, OBJECTREF object, IWeakReference* pWinRTWeakReference) +{ + return GCHandleTableUtilities::GetGCHandleTable()->CreateHandleWithExtraInfo(table, OBJECTREFToObject(object), HNDTYPE_WEAK_WINRT, (void*)pWinRTWeakReference); +} +#endif // FEATURE_COMINTEROP + #endif // !DACCESS_COMPILE #endif // _GCHANDLETABLEUTILITIES_H_ diff --git a/src/coreclr/src/vm/threads.cpp b/src/coreclr/src/vm/threads.cpp index da805bd..d1dd772 100644 --- a/src/coreclr/src/vm/threads.cpp +++ b/src/coreclr/src/vm/threads.cpp @@ -5074,9 +5074,13 @@ void Thread::SafeUpdateLastThrownObject(void) { EX_TRY { - // Using CreateDuplicateHandle here ensures that the AD of the last thrown object matches the domain of - // the current throwable. - SetLastThrownObjectHandle(CreateDuplicateHandle(hThrowable)); + IGCHandleTable *pHandleTable = GCHandleTableUtilities::GetGCHandleTable(); + void* table = pHandleTable->GetHandleTableForHandle(hThrowable); + + // Creating a duplicate handle here ensures that the AD of the last thrown object + // matches the domain of the current throwable. + OBJECTHANDLE duplicateHandle = pHandleTable->CreateHandleOfType(table, OBJECTREFToObject(ObjectFromHandle(hThrowable)), HNDTYPE_DEFAULT); + SetLastThrownObjectHandle(duplicateHandle); } EX_CATCH {