From aed816fd307eee3946df49699109dceb9b2f7a70 Mon Sep 17 00:00:00 2001 From: Aditya Mandaleeka Date: Tue, 11 Apr 2017 19:11:32 -0700 Subject: [PATCH] Move handle manipulation functions to interface. Commit migrated from https://github.com/dotnet/coreclr/commit/80ca6807369ff9fa468099a936072a121215d3dc --- src/coreclr/src/gc/gc.cpp | 4 ++-- src/coreclr/src/gc/gchandletable.cpp | 15 +++++++++++++++ src/coreclr/src/gc/gchandletableimpl.h | 6 ++++++ src/coreclr/src/gc/gcinterface.h | 6 ++++++ src/coreclr/src/gc/objecthandle.h | 12 +----------- src/coreclr/src/vm/appdomain.cpp | 3 ++- src/coreclr/src/vm/gchandleutilities.h | 17 +++++++++++++++++ 7 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/coreclr/src/gc/gc.cpp b/src/coreclr/src/gc/gc.cpp index 6d53c89..7d4a8d6 100644 --- a/src/coreclr/src/gc/gc.cpp +++ b/src/coreclr/src/gc/gc.cpp @@ -34222,7 +34222,7 @@ bool GCHeap::StressHeap(gc_alloc_context * context) if (g_pConfig->AppDomainLeaks() && str->SetAppDomainNoThrow()) { #endif - StoreObjectInHandle(m_StressObjs[i], ObjectToOBJECTREF(str)); + HndAssignHandle(m_StressObjs[i], ObjectToOBJECTREF(str)); #if CHECK_APP_DOMAIN_LEAKS } #endif @@ -34255,7 +34255,7 @@ bool GCHeap::StressHeap(gc_alloc_context * context) { // Let the string itself become garbage. // will be realloced next time around - StoreObjectInHandle(m_StressObjs[m_CurStressObj], 0); + HndAssignHandle(m_StressObjs[m_CurStressObj], 0); } } } diff --git a/src/coreclr/src/gc/gchandletable.cpp b/src/coreclr/src/gc/gchandletable.cpp index 68a1c97..3077133 100644 --- a/src/coreclr/src/gc/gchandletable.cpp +++ b/src/coreclr/src/gc/gchandletable.cpp @@ -132,3 +132,18 @@ void* GCHandleManager::GetExtraInfoFromHandle(OBJECTHANDLE handle) { return (void*)::HndGetHandleExtraInfo(handle); } + +void GCHandleManager::StoreObjectInHandle(OBJECTHANDLE handle, Object* object) +{ + ::HndAssignHandle(handle, ObjectToOBJECTREF(object)); +} + +bool GCHandleManager::StoreObjectInHandleIfNull(OBJECTHANDLE handle, Object* object) +{ + return !!::HndFirstAssignHandle(handle, ObjectToOBJECTREF(object)); +} + +Object* GCHandleManager::CompareAndSwapObjectInHandle(OBJECTHANDLE handle, Object* object, Object* comparandObject) +{ + return (Object*)::HndInterlockedCompareExchangeHandle(handle, ObjectToOBJECTREF(object), ObjectToOBJECTREF(comparandObject)); +} diff --git a/src/coreclr/src/gc/gchandletableimpl.h b/src/coreclr/src/gc/gchandletableimpl.h index 9247615..2183b9b 100644 --- a/src/coreclr/src/gc/gchandletableimpl.h +++ b/src/coreclr/src/gc/gchandletableimpl.h @@ -54,6 +54,12 @@ public: virtual void DestroyHandleOfUnknownType(OBJECTHANDLE handle); virtual void* GetExtraInfoFromHandle(OBJECTHANDLE handle); + + virtual void StoreObjectInHandle(OBJECTHANDLE handle, Object* object); + + virtual bool StoreObjectInHandleIfNull(OBJECTHANDLE handle, Object* object); + + virtual Object* CompareAndSwapObjectInHandle(OBJECTHANDLE handle, Object* object, Object* comparandObject); }; #endif // GCHANDLETABLE_H_ diff --git a/src/coreclr/src/gc/gcinterface.h b/src/coreclr/src/gc/gcinterface.h index 85c331b..60dfd3f 100644 --- a/src/coreclr/src/gc/gcinterface.h +++ b/src/coreclr/src/gc/gcinterface.h @@ -444,6 +444,12 @@ public: virtual void DestroyHandleOfUnknownType(OBJECTHANDLE handle) = 0; virtual void* GetExtraInfoFromHandle(OBJECTHANDLE handle) = 0; + + virtual void StoreObjectInHandle(OBJECTHANDLE handle, Object* object) = 0; + + virtual bool StoreObjectInHandleIfNull(OBJECTHANDLE handle, Object* object) = 0; + + virtual Object* CompareAndSwapObjectInHandle(OBJECTHANDLE handle, Object* object, Object* comparandObject) = 0; }; // IGCHeap is the interface that the VM will use when interacting with the GC. diff --git a/src/coreclr/src/gc/objecthandle.h b/src/coreclr/src/gc/objecthandle.h index 945e8d6..c320dcc 100644 --- a/src/coreclr/src/gc/objecthandle.h +++ b/src/coreclr/src/gc/objecthandle.h @@ -21,16 +21,6 @@ #include #endif // FEATURE_COMINTEROP -/* - * Convenience macros for accessing handles. StoreFirstObjectInHandle is like - * StoreObjectInHandle, except it only succeeds if transitioning from NULL to - * non-NULL. In other words, if this handle is being initialized for the first - * time. - */ -#define StoreObjectInHandle(handle, object) HndAssignHandle(handle, object) -#define InterlockedCompareExchangeObjectInHandle(handle, object, oldObj) HndInterlockedCompareExchangeHandle(handle, object, oldObj) -#define StoreFirstObjectInHandle(handle, object) HndFirstAssignHandle(handle, object) - typedef DPTR(struct HandleTableMap) PTR_HandleTableMap; typedef DPTR(struct HandleTableBucket) PTR_HandleTableBucket; typedef DPTR(PTR_HandleTableBucket) PTR_PTR_HandleTableBucket; @@ -94,7 +84,7 @@ inline void ResetOBJECTHANDLE(OBJECTHANDLE handle) { WRAPPER_NO_CONTRACT; - StoreObjectInHandle(handle, NULL); + HndAssignHandle(handle, NULL); } #ifndef FEATURE_REDHAWK diff --git a/src/coreclr/src/vm/appdomain.cpp b/src/coreclr/src/vm/appdomain.cpp index 942d11b..4fd35b0 100644 --- a/src/coreclr/src/vm/appdomain.cpp +++ b/src/coreclr/src/vm/appdomain.cpp @@ -4679,7 +4679,8 @@ OBJECTREF AppDomain::GetExposedObject() obj = (APPDOMAINREF) AllocateObject(pMT); obj->SetDomain(this); - if(StoreFirstObjectInHandle(m_ExposedObject, (OBJECTREF) obj) == FALSE) { + if (!StoreFirstObjectInHandle(m_ExposedObject, (OBJECTREF) obj)) + { obj = (APPDOMAINREF) GetRawExposedObject(); _ASSERTE(obj); } diff --git a/src/coreclr/src/vm/gchandleutilities.h b/src/coreclr/src/vm/gchandleutilities.h index 79bfc1b..f6d2d0c 100644 --- a/src/coreclr/src/vm/gchandleutilities.h +++ b/src/coreclr/src/vm/gchandleutilities.h @@ -169,6 +169,23 @@ inline OBJECTHANDLE CreateVariableHandle(IGCHandleStore* store, OBJECTREF object return store->CreateHandleWithExtraInfo(OBJECTREFToObject(object), HNDTYPE_VARIABLE, (void*)((uintptr_t)type)); } +// Handle object manipulation convenience functions + +inline void StoreObjectInHandle(OBJECTHANDLE handle, OBJECTREF object) +{ + GCHandleUtilities::GetGCHandleManager()->StoreObjectInHandle(handle, OBJECTREFToObject(object)); +} + +inline bool StoreFirstObjectInHandle(OBJECTHANDLE handle, OBJECTREF object) +{ + return GCHandleUtilities::GetGCHandleManager()->StoreObjectInHandleIfNull(handle, OBJECTREFToObject(object)); +} + +inline void* InterlockedCompareExchangeObjectInHandle(OBJECTHANDLE handle, OBJECTREF object, OBJECTREF comparandObject) +{ + return GCHandleUtilities::GetGCHandleManager()->CompareAndSwapObjectInHandle(handle, OBJECTREFToObject(object), OBJECTREFToObject(comparandObject)); +} + // Handle destruction convenience functions inline void DestroyHandle(OBJECTHANDLE handle) -- 2.7.4