diff options
Diffstat (limited to 'src/gc/gchandletable.cpp')
-rw-r--r-- | src/gc/gchandletable.cpp | 128 |
1 files changed, 85 insertions, 43 deletions
diff --git a/src/gc/gchandletable.cpp b/src/gc/gchandletable.cpp index 82ab269861..52fede6299 100644 --- a/src/gc/gchandletable.cpp +++ b/src/gc/gchandletable.cpp @@ -8,104 +8,146 @@ #include "gchandletableimpl.h" #include "objecthandle.h" -IGCHandleTable* CreateGCHandleTable() +GCHandleStore* g_gcGlobalHandleStore; + +IGCHandleManager* CreateGCHandleManager() { - return new(nothrow) GCHandleTable(); + return new (nothrow) GCHandleManager(); } -bool GCHandleTable::Initialize() +void GCHandleStore::Uproot() { - return Ref_Initialize(); + Ref_RemoveHandleTableBucket(&_underlyingBucket); } -void GCHandleTable::Shutdown() +bool GCHandleStore::ContainsHandle(OBJECTHANDLE handle) { - Ref_Shutdown(); + return _underlyingBucket.Contains(handle); } -void* GCHandleTable::GetGlobalHandleStore() +OBJECTHANDLE GCHandleStore::CreateHandleOfType(Object* object, int type) { - return (void*)g_HandleTableMap.pBuckets[0]; + HHANDLETABLE handletable = _underlyingBucket.pTable[GetCurrentThreadHomeHeapNumber()]; + return ::HndCreateHandle(handletable, type, ObjectToOBJECTREF(object)); } -void* GCHandleTable::CreateHandleStore(void* context) +OBJECTHANDLE GCHandleStore::CreateHandleOfType(Object* object, int type, int heapToAffinitizeTo) { -#ifndef FEATURE_REDHAWK - return (void*)::Ref_CreateHandleTableBucket(ADIndex((DWORD)(uintptr_t)context)); -#else - assert("CreateHandleStore is not implemented when FEATURE_REDHAWK is defined!"); - return nullptr; -#endif + HHANDLETABLE handletable = _underlyingBucket.pTable[heapToAffinitizeTo]; + return ::HndCreateHandle(handletable, type, ObjectToOBJECTREF(object)); } -void* GCHandleTable::GetHandleContext(OBJECTHANDLE handle) +OBJECTHANDLE GCHandleStore::CreateHandleWithExtraInfo(Object* object, int type, void* pExtraInfo) { - return (void*)((uintptr_t)::HndGetHandleTableADIndex(::HndGetHandleTable(handle)).m_dwIndex); + HHANDLETABLE handletable = _underlyingBucket.pTable[GetCurrentThreadHomeHeapNumber()]; + return ::HndCreateHandle(handletable, type, ObjectToOBJECTREF(object), reinterpret_cast<uintptr_t>(pExtraInfo)); } -void GCHandleTable::DestroyHandleStore(void* store) +OBJECTHANDLE GCHandleStore::CreateDependentHandle(Object* primary, Object* secondary) { - Ref_DestroyHandleTableBucket((HandleTableBucket*) store); + HHANDLETABLE handletable = _underlyingBucket.pTable[GetCurrentThreadHomeHeapNumber()]; + OBJECTHANDLE handle = ::HndCreateHandle(handletable, HNDTYPE_DEPENDENT, ObjectToOBJECTREF(primary)); + if (!handle) + { + return nullptr; + } + + ::SetDependentHandleSecondary(handle, ObjectToOBJECTREF(secondary)); + return handle; } -void GCHandleTable::UprootHandleStore(void* store) +GCHandleStore::~GCHandleStore() { - Ref_RemoveHandleTableBucket((HandleTableBucket*) store); + ::Ref_DestroyHandleTableBucket(&_underlyingBucket); } -bool GCHandleTable::ContainsHandle(void* store, OBJECTHANDLE handle) +bool GCHandleManager::Initialize() { - return ((HandleTableBucket*)store)->Contains(handle); + return Ref_Initialize(); } -OBJECTHANDLE GCHandleTable::CreateHandleOfType(void* store, Object* object, int type) +void GCHandleManager::Shutdown() { - HHANDLETABLE handletable = ((HandleTableBucket*)store)->pTable[GetCurrentThreadHomeHeapNumber()]; - return ::HndCreateHandle(handletable, type, ObjectToOBJECTREF(object)); + if (g_gcGlobalHandleStore != nullptr) + { + DestroyHandleStore(g_gcGlobalHandleStore); + } + + ::Ref_Shutdown(); } -OBJECTHANDLE GCHandleTable::CreateHandleOfType(void* store, Object* object, int type, int heapToAffinitizeTo) +IGCHandleStore* GCHandleManager::GetGlobalHandleStore() { - HHANDLETABLE handletable = ((HandleTableBucket*)store)->pTable[heapToAffinitizeTo]; - return ::HndCreateHandle(handletable, type, ObjectToOBJECTREF(object)); + return g_gcGlobalHandleStore; } -OBJECTHANDLE GCHandleTable::CreateGlobalHandleOfType(Object* object, int type) +IGCHandleStore* GCHandleManager::CreateHandleStore(void* context) { - return ::HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], type, ObjectToOBJECTREF(object)); +#ifndef FEATURE_REDHAWK + GCHandleStore* store = new (nothrow) GCHandleStore(); + if (store == nullptr) + return nullptr; + + bool success = ::Ref_InitializeHandleTableBucket(&store->_underlyingBucket, context); + if (!success) + { + delete store; + return nullptr; + } + + return store; +#else + assert("CreateHandleStore is not implemented when FEATURE_REDHAWK is defined!"); + return nullptr; +#endif } -OBJECTHANDLE GCHandleTable::CreateHandleWithExtraInfo(void* store, Object* object, int type, void* pExtraInfo) +void GCHandleManager::DestroyHandleStore(IGCHandleStore* store) { - HHANDLETABLE handletable = ((HandleTableBucket*)store)->pTable[GetCurrentThreadHomeHeapNumber()]; - return ::HndCreateHandle(handletable, type, ObjectToOBJECTREF(object), reinterpret_cast<uintptr_t>(pExtraInfo)); + delete store; } -OBJECTHANDLE GCHandleTable::CreateDependentHandle(void* store, Object* primary, Object* secondary) +void* GCHandleManager::GetHandleContext(OBJECTHANDLE handle) { - HHANDLETABLE handletable = ((HandleTableBucket*)store)->pTable[GetCurrentThreadHomeHeapNumber()]; - OBJECTHANDLE handle = ::HndCreateHandle(handletable, HNDTYPE_DEPENDENT, ObjectToOBJECTREF(primary)); - ::SetDependentHandleSecondary(handle, ObjectToOBJECTREF(secondary)); + return (void*)((uintptr_t)::HndGetHandleTableADIndex(::HndGetHandleTable(handle)).m_dwIndex); +} - return handle; +OBJECTHANDLE GCHandleManager::CreateGlobalHandleOfType(Object* object, int type) +{ + return ::HndCreateHandle(g_HandleTableMap.pBuckets[0]->pTable[GetCurrentThreadHomeHeapNumber()], type, ObjectToOBJECTREF(object)); } -OBJECTHANDLE GCHandleTable::CreateDuplicateHandle(OBJECTHANDLE handle) +OBJECTHANDLE GCHandleManager::CreateDuplicateHandle(OBJECTHANDLE handle) { return ::HndCreateHandle(HndGetHandleTable(handle), HNDTYPE_DEFAULT, ::HndFetchHandle(handle)); } -void GCHandleTable::DestroyHandleOfType(OBJECTHANDLE handle, int type) +void GCHandleManager::DestroyHandleOfType(OBJECTHANDLE handle, int type) { ::HndDestroyHandle(::HndGetHandleTable(handle), type, handle); } -void GCHandleTable::DestroyHandleOfUnknownType(OBJECTHANDLE handle) +void GCHandleManager::DestroyHandleOfUnknownType(OBJECTHANDLE handle) { ::HndDestroyHandleOfUnknownType(::HndGetHandleTable(handle), handle); } -void* GCHandleTable::GetExtraInfoFromHandle(OBJECTHANDLE handle) +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::InterlockedCompareExchangeObjectInHandle(OBJECTHANDLE handle, Object* object, Object* comparandObject) +{ + return (Object*)::HndInterlockedCompareExchangeHandle(handle, ObjectToOBJECTREF(object), ObjectToOBJECTREF(comparandObject)); +} |