diff options
author | Aditya Mandaleeka <adityam@microsoft.com> | 2017-04-11 18:28:03 -0700 |
---|---|---|
committer | Aditya Mandaleeka <adityam@microsoft.com> | 2017-04-11 18:30:16 -0700 |
commit | 3e6334b8797731bc24a2b9c69a7b7073a92b66a9 (patch) | |
tree | 528d18edc054dc85b45f0604d83984a62b3fc4a3 /src/gc | |
parent | bf7cf40e14b8cf35c68be089735dd16081db9dc4 (diff) | |
download | coreclr-3e6334b8797731bc24a2b9c69a7b7073a92b66a9.tar.gz coreclr-3e6334b8797731bc24a2b9c69a7b7073a92b66a9.tar.bz2 coreclr-3e6334b8797731bc24a2b9c69a7b7073a92b66a9.zip |
Hide knowledge of handle table buckets and home heaps from VM side.
Diffstat (limited to 'src/gc')
-rw-r--r-- | src/gc/gchandletable.cpp | 30 | ||||
-rw-r--r-- | src/gc/gchandletableimpl.h | 8 | ||||
-rw-r--r-- | src/gc/gcinterface.h | 8 |
3 files changed, 43 insertions, 3 deletions
diff --git a/src/gc/gchandletable.cpp b/src/gc/gchandletable.cpp index 7ac006ddb6..28852df038 100644 --- a/src/gc/gchandletable.cpp +++ b/src/gc/gchandletable.cpp @@ -38,9 +38,31 @@ void* GCHandleTable::GetHandleContext(OBJECTHANDLE handle) return (void*)((uintptr_t)::HndGetHandleTableADIndex(::HndGetHandleTable(handle)).m_dwIndex); } +void GCHandleTable::DestroyHandleTable(void* table) +{ + Ref_DestroyHandleTableBucket((HandleTableBucket*) table); +} + +void GCHandleTable::UprootHandleTable(void* table) +{ + Ref_RemoveHandleTableBucket((HandleTableBucket*) table); +} + +bool GCHandleTable::ContainsHandle(void* table, OBJECTHANDLE handle) +{ + return ((HandleTableBucket*)table)->Contains(handle); +} + OBJECTHANDLE GCHandleTable::CreateHandleOfType(void* table, Object* object, int type) { - return ::HndCreateHandle((HHANDLETABLE)table, type, ObjectToOBJECTREF(object)); + HHANDLETABLE handletable = ((HandleTableBucket*)table)->pTable[GetCurrentThreadHomeHeapNumber()]; + return ::HndCreateHandle(handletable, type, ObjectToOBJECTREF(object)); +} + +OBJECTHANDLE GCHandleTable::CreateHandleOfType(void* table, Object* object, int type, int heapToAffinitizeTo) +{ + HHANDLETABLE handletable = ((HandleTableBucket*)table)->pTable[heapToAffinitizeTo]; + return ::HndCreateHandle(handletable, type, ObjectToOBJECTREF(object)); } OBJECTHANDLE GCHandleTable::CreateGlobalHandleOfType(Object* object, int type) @@ -50,12 +72,14 @@ OBJECTHANDLE GCHandleTable::CreateGlobalHandleOfType(Object* object, int type) OBJECTHANDLE GCHandleTable::CreateHandleWithExtraInfo(void* table, Object* object, int type, void* pExtraInfo) { - return ::HndCreateHandle((HHANDLETABLE)table, type, ObjectToOBJECTREF(object), reinterpret_cast<uintptr_t>(pExtraInfo)); + HHANDLETABLE handletable = ((HandleTableBucket*)table)->pTable[GetCurrentThreadHomeHeapNumber()]; + return ::HndCreateHandle(handletable, type, ObjectToOBJECTREF(object), reinterpret_cast<uintptr_t>(pExtraInfo)); } OBJECTHANDLE GCHandleTable::CreateDependentHandle(void* table, Object* primary, Object* secondary) { - OBJECTHANDLE handle = ::HndCreateHandle((HHANDLETABLE)table, HNDTYPE_DEPENDENT, ObjectToOBJECTREF(primary)); + HHANDLETABLE handletable = ((HandleTableBucket*)table)->pTable[GetCurrentThreadHomeHeapNumber()]; + OBJECTHANDLE handle = ::HndCreateHandle(handletable, HNDTYPE_DEPENDENT, ObjectToOBJECTREF(primary)); ::SetDependentHandleSecondary(handle, ObjectToOBJECTREF(secondary)); return handle; diff --git a/src/gc/gchandletableimpl.h b/src/gc/gchandletableimpl.h index 1cac0d22f0..a45f98395d 100644 --- a/src/gc/gchandletableimpl.h +++ b/src/gc/gchandletableimpl.h @@ -20,8 +20,16 @@ public: virtual void* GetHandleContext(OBJECTHANDLE handle); + virtual void DestroyHandleTable(void* table); + + virtual void UprootHandleTable(void* table); + + virtual bool ContainsHandle(void* table, OBJECTHANDLE handle); + virtual OBJECTHANDLE CreateHandleOfType(void* table, Object* object, int type); + virtual OBJECTHANDLE CreateHandleOfType(void* table, Object* object, int type, int heapToAffinitizeTo); + virtual OBJECTHANDLE CreateHandleWithExtraInfo(void* table, Object* object, int type, void* pExtraInfo); virtual OBJECTHANDLE CreateDependentHandle(void* table, Object* primary, Object* secondary); diff --git a/src/gc/gcinterface.h b/src/gc/gcinterface.h index 5be332b602..b2bfbb7298 100644 --- a/src/gc/gcinterface.h +++ b/src/gc/gcinterface.h @@ -415,8 +415,16 @@ public: virtual void* GetNewHandleTable(void* context) = 0; + virtual void DestroyHandleTable(void* table) = 0; + + virtual void UprootHandleTable(void* table) = 0; + + virtual bool ContainsHandle(void* table, OBJECTHANDLE handle) = 0; + virtual OBJECTHANDLE CreateHandleOfType(void* table, Object* object, int type) = 0; + virtual OBJECTHANDLE CreateHandleOfType(void* table, Object* object, int type, int heapToAffinitizeTo) = 0; + virtual OBJECTHANDLE CreateHandleWithExtraInfo(void* table, Object* object, int type, void* pExtraInfo) = 0; virtual OBJECTHANDLE CreateDependentHandle(void* table, Object* primary, Object* secondary) = 0; |