Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Robinson <arobins@microsoft.com>2021-05-25 18:15:39 +0300
committerGitHub <noreply@github.com>2021-05-25 18:15:39 +0300
commit4bdaa8e2fb06b1065d0e418d21abd80dfff00a8f (patch)
tree3dd71901e25f193746d6478c1e6f50cb0a17dc07 /src/coreclr/interop
parent517421c3545f5ed5c90a5768f01d3f27ba3d24e2 (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.cpp5
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.