diff options
author | Aaron Robinson <arobins@microsoft.com> | 2021-05-25 18:15:39 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-25 18:15:39 +0300 |
commit | 4bdaa8e2fb06b1065d0e418d21abd80dfff00a8f (patch) | |
tree | 3dd71901e25f193746d6478c1e6f50cb0a17dc07 /src/coreclr/interop | |
parent | 517421c3545f5ed5c90a5768f01d3f27ba3d24e2 (diff) |
Cleanup internal ComWrappers cache when object enters Finalization queue (#52771)
* Clean up the ExternalObjectContext cache for ComWrappers' RCWs.
* Add testing for verifying internal cache clean up.
Diffstat (limited to 'src/coreclr/interop')
-rw-r--r-- | src/coreclr/interop/comwrappers.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/coreclr/interop/comwrappers.cpp b/src/coreclr/interop/comwrappers.cpp index 8485125c8b7..90c366cead4 100644 --- a/src/coreclr/interop/comwrappers.cpp +++ b/src/coreclr/interop/comwrappers.cpp @@ -357,7 +357,8 @@ ManagedObjectWrapper* ManagedObjectWrapper::MapFromIUnknown(_In_ IUnknown* pUnk) // If the first Vtable entry is part of the ManagedObjectWrapper IUnknown impl, // we know how to interpret the IUnknown. void** vtable = *reinterpret_cast<void***>(pUnk); - if (*vtable != ManagedObjectWrapper_IUnknownImpl.QueryInterface) + if (*vtable != ManagedObjectWrapper_IUnknownImpl.QueryInterface + && *vtable != ManagedObjectWrapper_IReferenceTrackerTargetImpl.QueryInterface) return nullptr; ABI::ComInterfaceDispatch* disp = reinterpret_cast<ABI::ComInterfaceDispatch*>(pUnk); @@ -841,7 +842,7 @@ void* NativeObjectWrapperContext::GetRuntimeContext() const noexcept IReferenceTracker* NativeObjectWrapperContext::GetReferenceTracker() const noexcept { - return ((_trackerObjectState == TrackerObjectState::NotSet) ? nullptr : _trackerObject); + return ((_trackerObjectState == TrackerObjectState::NotSet || _trackerObjectDisconnected) ? nullptr : _trackerObject); } // See TrackerObjectManager::AfterWrapperCreated() for AddRefFromTrackerSource() usage. |