summaryrefslogtreecommitdiff
path: root/src/gc
diff options
context:
space:
mode:
authorAditya Mandaleeka <adityam@microsoft.com>2017-04-11 18:28:03 -0700
committerAditya Mandaleeka <adityam@microsoft.com>2017-04-11 18:30:16 -0700
commit3e6334b8797731bc24a2b9c69a7b7073a92b66a9 (patch)
tree528d18edc054dc85b45f0604d83984a62b3fc4a3 /src/gc
parentbf7cf40e14b8cf35c68be089735dd16081db9dc4 (diff)
downloadcoreclr-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.cpp30
-rw-r--r--src/gc/gchandletableimpl.h8
-rw-r--r--src/gc/gcinterface.h8
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;