From de9e94378179e39470f44a373688486277e78e73 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Mon, 16 Mar 2026 11:11:42 -0700 Subject: [PATCH 1/4] flush contract caches --- .../ContractRegistry.cs | 6 ++++++ .../Contracts/IContract.cs | 6 ++++++ .../Contracts/BuiltInCOM_1.cs | 2 ++ .../Contracts/CodeVersions_1.cs | 2 ++ .../Contracts/ComWrappers_1.cs | 2 ++ .../Contracts/DacStreams_1.cs | 2 ++ .../Contracts/DebugInfo/DebugInfo_1.cs | 2 ++ .../Contracts/DebugInfo/DebugInfo_2.cs | 2 ++ .../Contracts/EcmaMetadata_1.cs | 5 +++++ .../Contracts/Exception_1.cs | 2 ++ .../ExecutionManager/ExecutionManagerCore.cs | 5 +++++ .../Contracts/ExecutionManager/ExecutionManager_1.cs | 1 + .../Contracts/ExecutionManager/ExecutionManager_2.cs | 1 + .../Contracts/GC/GC_1.cs | 2 ++ .../Contracts/GCInfo/GCInfo_1.cs | 2 ++ .../Contracts/Loader_1.cs | 2 ++ .../Contracts/Notifications_1.cs | 2 ++ .../Contracts/Object_1.cs | 2 ++ .../Contracts/PlatformMetadata_1.cs | 2 ++ .../Contracts/PrecodeStubs_Common.cs | 2 ++ .../Contracts/ReJIT_1.cs | 2 ++ .../Contracts/RuntimeInfo_1.cs | 2 ++ .../Contracts/RuntimeTypeSystem_1.cs | 8 ++++++++ .../Contracts/SHash_1.cs | 2 ++ .../Contracts/Signature/SignatureDecoder_1.cs | 6 ++++++ .../Contracts/StackWalk/StackWalk_1.cs | 2 ++ .../Contracts/SyncBlock_1.cs | 2 ++ .../Contracts/Thread_1.cs | 2 ++ .../SOSDacImpl.IXCLRDataProcess.cs | 1 + .../SOSDacImpl.cs | 11 ++++++++++- .../CachingContractRegistry.cs | 8 ++++++++ 31 files changed, 97 insertions(+), 1 deletion(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.cs index a4e33db17c7fcf..37a84a10dd225b 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.cs @@ -104,4 +104,10 @@ public abstract class ContractRegistry public virtual IBuiltInCOM BuiltInCOM => GetContract(); public abstract TContract GetContract() where TContract : IContract; + + /// + /// Flush all cached data held by contracts in this registry. + /// Called when the target process state may have changed (e.g. on resume). + /// + public abstract void Flush(); } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.cs index 68b76a010d8653..7e227a8a5b36df 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.cs @@ -8,4 +8,10 @@ namespace Microsoft.Diagnostics.DataContractReader.Contracts; public interface IContract { static virtual string Name => throw new NotImplementedException(); + + /// + /// Clear any cached data held by this contract. + /// Called when the target process state may have changed (e.g. on resume). + /// + void Flush() => throw new NotImplementedException(); } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/BuiltInCOM_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/BuiltInCOM_1.cs index 7dfc12596f1e99..8660f58f5e4d28 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/BuiltInCOM_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/BuiltInCOM_1.cs @@ -43,6 +43,8 @@ internal BuiltInCOM_1(Target target) _target = target; } + public void Flush() { } + public ulong GetRefCount(TargetPointer address) { Data.ComCallWrapper wrapper = _target.ProcessedData.GetOrAdd(address); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/CodeVersions_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/CodeVersions_1.cs index fc50c95ffbf16f..ae340249e38cfa 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/CodeVersions_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/CodeVersions_1.cs @@ -18,6 +18,8 @@ public CodeVersions_1(Target target) _target = target; } + public void Flush() { } + ILCodeVersionHandle ICodeVersions.GetActiveILCodeVersion(TargetPointer methodDesc) { // CodeVersionManager::GetActiveILCodeVersion diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ComWrappers_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ComWrappers_1.cs index 0b9ce1d310cdff..78d909cb88798e 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ComWrappers_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ComWrappers_1.cs @@ -19,6 +19,8 @@ public ComWrappers_1(Target target) _target = target; } + public void Flush() { } + public TargetPointer GetComWrappersIdentity(TargetPointer address) { Data.NativeObjectWrapperObject wrapper = _target.ProcessedData.GetOrAdd(address); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DacStreams_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DacStreams_1.cs index f933cb28a07258..d3e83f9e384e45 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DacStreams_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DacStreams_1.cs @@ -29,6 +29,8 @@ internal DacStreams_1(Target target) _target = target; } + public void Flush() { } + public string? StringFromEEAddress(TargetPointer address) { // We use the data subsystem to handle caching results from processing this data diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.cs index f3d22255414ccb..a1ffbac02eb3c8 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.cs @@ -12,6 +12,8 @@ internal sealed class DebugInfo_1(Target target) : IDebugInfo { private const uint DEBUG_INFO_BOUNDS_HAS_INSTRUMENTED_BOUNDS = 0xFFFFFFFF; + public void Flush() { } + [Flags] internal enum ExtraDebugInfoFlags_1 : byte { diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.cs index 818db5e12c7bbf..0bfbe3e80ce0b0 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.cs @@ -11,6 +11,8 @@ internal sealed class DebugInfo_2(Target target) : IDebugInfo { private const uint DEBUG_INFO_FAT = 0; + public void Flush() { } + private record struct DebugInfoChunks { public TargetPointer BoundsStart; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.cs index 2e00ce75b93f70..41af68d190c2de 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.cs @@ -15,6 +15,11 @@ internal sealed class EcmaMetadata_1(Target target) : IEcmaMetadata { private Dictionary _metadata = new(); + public void Flush() + { + _metadata.Clear(); + } + public TargetSpan GetReadOnlyMetadataAddress(ModuleHandle handle) { ILoader loader = target.Contracts.Loader; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Exception_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Exception_1.cs index bd44779f0bf8b8..187d97219892f6 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Exception_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Exception_1.cs @@ -14,6 +14,8 @@ internal Exception_1(Target target) _target = target; } + public void Flush() { } + TargetPointer IException.GetNestedExceptionInfo(TargetPointer exceptionInfoAddr, out TargetPointer nextNestedExceptionInfo, out TargetPointer thrownObjectHandle) { Data.ExceptionInfo exceptionInfo = _target.ProcessedData.GetOrAdd(exceptionInfoAddr); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.cs index ad9d24248d3972..e7a980a7b0f639 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.cs @@ -32,6 +32,11 @@ public ExecutionManagerCore(Target target, Data.RangeSectionMap topRangeSectionM _r2rJitManager = new ReadyToRunJitManager(_target); } + public void Flush() + { + _codeInfos.Clear(); + } + // Note, because of RelativeOffset, this code info is per code pointer, not per method private sealed class CodeBlock { diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.cs index 76faf0d050c02a..236e017ac6b5c2 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.cs @@ -29,4 +29,5 @@ internal ExecutionManager_1(Target target, Data.RangeSectionMap topRangeSectionM public TargetNUInt GetRelativeOffset(CodeBlockHandle codeInfoHandle) => _executionManagerCore.GetRelativeOffset(codeInfoHandle); public List GetExceptionClauses(CodeBlockHandle codeInfoHandle) => _executionManagerCore.GetExceptionClauses(codeInfoHandle); public JitManagerInfo GetEEJitManagerInfo() => _executionManagerCore.GetEEJitManagerInfo(); + public void Flush() => _executionManagerCore.Flush(); } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.cs index 8e7f6bb5267510..ab5dea03e96066 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.cs @@ -29,4 +29,5 @@ internal ExecutionManager_2(Target target, Data.RangeSectionMap topRangeSectionM public TargetNUInt GetRelativeOffset(CodeBlockHandle codeInfoHandle) => _executionManagerCore.GetRelativeOffset(codeInfoHandle); public List GetExceptionClauses(CodeBlockHandle codeInfoHandle) => _executionManagerCore.GetExceptionClauses(codeInfoHandle); public JitManagerInfo GetEEJitManagerInfo() => _executionManagerCore.GetEEJitManagerInfo(); + public void Flush() => _executionManagerCore.Flush(); } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs index 935a224cebf7ce..7f3a58cb1550ab 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs @@ -47,6 +47,8 @@ internal GC_1(Target target, uint handlesPerBlock, byte blockInvalid, TargetPoin _handleMaxInternalTypes = handleMaxInternalTypes; } + public void Flush() { } + string[] IGC.GetGCIdentifiers() { string gcIdentifiers = _target.ReadGlobalString(Constants.Globals.GCIdentifiers); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.cs index f34292572a936e..1cf6d82fc187ae 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.cs @@ -15,6 +15,8 @@ internal GCInfo_1(Target target) _target = target; } + public void Flush() { } + IGCInfoHandle IGCInfo.DecodePlatformSpecificGCInfo(TargetPointer gcInfoAddress, uint gcVersion) => new GcInfoDecoder(_target, gcInfoAddress, gcVersion); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs index 60143e7535d418..f47b168360da19 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs @@ -42,6 +42,8 @@ internal Loader_1(Target target) _target = target; } + public void Flush() { } + ModuleHandle ILoader.GetModuleHandleFromModulePtr(TargetPointer modulePointer) { if (modulePointer == TargetPointer.Null) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Notifications_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Notifications_1.cs index 8ccfd67585e234..9511b8d566d364 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Notifications_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Notifications_1.cs @@ -14,6 +14,8 @@ internal Notifications_1(Target target) _target = target; } + public void Flush() { } + void INotifications.SetGcNotification(int condemnedGeneration) { TargetPointer pGcNotificationFlags = _target.ReadGlobalPointer(Constants.Globals.GcNotificationFlags); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Object_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Object_1.cs index 3dc1fe70a5bb3c..df203ceb480223 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Object_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Object_1.cs @@ -24,6 +24,8 @@ internal Object_1(Target target, ulong methodTableOffset, byte objectToMethodTab _syncTableEntries = syncTableEntries; } + public void Flush() { } + public TargetPointer GetMethodTableAddress(TargetPointer address) { TargetPointer mt = _target.ReadPointer(address + _methodTableOffset); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.cs index 0e317fa202347e..93e6d6520b3428 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.cs @@ -16,6 +16,8 @@ public PlatformMetadata_1(Target target, Data.PlatformMetadata cdacMetadata) _cdacMetadata = cdacMetadata; } + public void Flush() { } + TargetPointer IPlatformMetadata.GetPrecodeMachineDescriptor() { return _cdacMetadata.PrecodeMachineDescriptor; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_Common.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_Common.cs index 88c61ef14cb742..b11a2c6408a5db 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_Common.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_Common.cs @@ -138,6 +138,8 @@ public PrecodeStubsCommon(Target target, Data.PrecodeMachineDescriptor precodeMa _codePointerFlags = codePointerFlags; } + public void Flush() { } + TargetPointer IPrecodeStubs.GetMethodDescFromStubAddress(TargetCodePointer entryPoint) { ValidPrecode precode = GetPrecodeFromEntryPoint(entryPoint); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.cs index eb9d7af509a342..2507fc5feb3642 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.cs @@ -36,6 +36,8 @@ public ReJIT_1(Target target, Data.ProfControlBlock profControlBlock) _profControlBlock = profControlBlock; } + public void Flush() { } + bool IReJIT.IsEnabled() { bool profEnabledReJIT = (_profControlBlock.GlobalEventMask & (ulong)COR_PRF_MONITOR.COR_PRF_ENABLE_REJIT) != 0; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeInfo_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeInfo_1.cs index fdc50b0f3fd5e0..54ad9894d33904 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeInfo_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeInfo_1.cs @@ -14,6 +14,8 @@ public RuntimeInfo_1(Target target) _target = target; } + public void Flush() { } + readonly RuntimeInfoArchitecture IRuntimeInfo.GetTargetArchitecture() { if (_target.TryReadGlobalString(Constants.Globals.Architecture, out string? arch)) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs index 160fa9c19024d7..6bdc4bc751d818 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs @@ -30,6 +30,14 @@ internal partial struct RuntimeTypeSystem_1 : IRuntimeTypeSystem private readonly Dictionary _typeHandles = new(); private readonly Dictionary _typeHandlesByName = new(); + public void Flush() + { + _methodTables.Clear(); + _methodDescs.Clear(); + _typeHandles.Clear(); + _typeHandlesByName.Clear(); + } + internal struct MethodTable { internal MethodTableFlags_1 Flags { get; } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SHash_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SHash_1.cs index 6c86e95d80b09f..79869350745adf 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SHash_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SHash_1.cs @@ -15,6 +15,8 @@ public SHash_1(Target target) _target = target; } + public void Flush() { } + private class SHash : ISHash where TEntry : IData { public TargetPointer Table { get; set; } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/SignatureDecoder_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/SignatureDecoder_1.cs index 4ca665fab31915..adfdbeca340134 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/SignatureDecoder_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/SignatureDecoder_1.cs @@ -28,6 +28,12 @@ internal SignatureDecoder_1(Target target) _target = target; } + public void Flush() + { + _thProviders.Clear(); + _mdhProviders.Clear(); + } + private SignatureTypeProvider GetTypeHandleProvider(ModuleHandle moduleHandle) { if (_thProviders.TryGetValue(moduleHandle, out SignatureTypeProvider? thProvider)) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/StackWalk_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/StackWalk_1.cs index 281bf58b6d3fe3..2e4c7f244dd85c 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/StackWalk_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/StackWalk_1.cs @@ -20,6 +20,8 @@ internal StackWalk_1(Target target) _target = target; } + public void Flush() { } + public enum StackWalkState { SW_COMPLETE, diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SyncBlock_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SyncBlock_1.cs index 0a51b7cc532cdf..88d99c87dc7aba 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SyncBlock_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SyncBlock_1.cs @@ -24,6 +24,8 @@ internal SyncBlock_1(Target target, TargetPointer syncTableEntries, ulong syncBl _syncBlockLinkOffset = syncBlockLinkOffset; } + public void Flush() { } + public TargetPointer GetSyncBlock(uint index) { Data.SyncTableEntry ste = _target.ProcessedData.GetOrAdd(_syncTableEntries + index * _target.GetTypeInfo(DataType.SyncTableEntry).Size!.Value); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs index 42b52d034231f8..a41bd5b99a1c04 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs @@ -30,6 +30,8 @@ internal Thread_1(Target target, TargetPointer threadStore) _threadLinkOffset = (ulong)type.Fields[nameof(Data.Thread.LinkNext)].Offset; } + public void Flush() { } + ThreadStoreData IThread.GetThreadStoreData() { Data.ThreadStore threadStore = _target.ProcessedData.GetOrAdd(_threadStoreAddr); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs index bb76867fd06a14..2b3633b774babf 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs @@ -21,6 +21,7 @@ public sealed unsafe partial class SOSDacImpl : IXCLRDataProcess, IXCLRDataProce int IXCLRDataProcess.Flush() { _target.ProcessedData.Clear(); + _target.Contracts.Flush(); // As long as any part of cDAC falls back to the legacy DAC, we need to propagate the Flush call if (_legacyProcess is not null) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index 7fa746bcc54d4f..c1a04a1d7e4940 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -5785,7 +5785,16 @@ int ISOSDacInterface13.GetGCBookkeepingMemoryRegions(DacComNullableByRef ppEnum) => _legacyImpl13 is not null ? _legacyImpl13.GetGCFreeRegions(ppEnum) : HResults.E_NOTIMPL; int ISOSDacInterface13.LockedFlush() - => _legacyImpl13 is not null ? _legacyImpl13.LockedFlush() : HResults.E_NOTIMPL; + { + _target.ProcessedData.Clear(); + _target.Contracts.Flush(); + + // As long as any part of cDAC falls back to the legacy DAC, we need to propagate the Flush call + if (_legacyProcess is not null) + return _legacyProcess.Flush(); + + return HResults.S_OK; + } #endregion ISOSDacInterface13 #region ISOSDacInterface14 diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.cs index 1a29993494081f..f2d0d1855ac306 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.cs @@ -76,4 +76,12 @@ public override TContract GetContract() // Contract was already registered by someone else return (TContract)_contracts[typeof(TContract)]; } + + public override void Flush() + { + foreach (IContract contract in _contracts.Values) + { + contract.Flush(); + } + } } From 7255b00214f12e8cf29410c9dc6a62ff64c764ee Mon Sep 17 00:00:00 2001 From: rcj1 Date: Mon, 16 Mar 2026 11:36:14 -0700 Subject: [PATCH 2/4] code review --- .../Target.cs | 10 ++++++++++ .../Contracts/StressLog.cs | 4 ++++ .../SOSDacImpl.IXCLRDataProcess.cs | 3 +-- .../SOSDacImpl.cs | 7 +++---- src/native/managed/cdac/tests/TestPlaceholderTarget.cs | 2 ++ 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.cs index 850aab0f488320..d0d691f242c3a5 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.cs @@ -289,4 +289,14 @@ public readonly record struct FieldInfo /// A cache of the contracts for the target process /// public abstract ContractRegistry Contracts { get; } + + /// + /// Clear all cached data held by this target, including processed data and contract caches. + /// Called when the target process state may have changed (e.g. on resume). + /// + public void Flush() + { + ProcessedData.Clear(); + Contracts.Flush(); + } } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.cs index 7940f14b7faa7f..c6031179b19e3d 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.cs @@ -348,6 +348,8 @@ file sealed class StressLog_1(Target target) : IStressLog { private readonly StressLogTraversal traversal = new(target, new SmallStressMessageReader(target)); + public void Flush() { } + public bool HasStressLog() => traversal.HasStressLog(); public StressLogData GetStressLogData() => traversal.GetStressLogData(); public StressLogData GetStressLogData(TargetPointer stressLog) => traversal.GetStressLogData(stressLog); @@ -361,6 +363,8 @@ file sealed class StressLog_2(Target target) : IStressLog { private readonly StressLogTraversal traversal = new(target, new LargeStressMessageReader(target)); + public void Flush() { } + public bool HasStressLog() => traversal.HasStressLog(); public StressLogData GetStressLogData() => traversal.GetStressLogData(); public StressLogData GetStressLogData(TargetPointer stressLog) => traversal.GetStressLogData(stressLog); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs index 2b3633b774babf..76d9aa1290ce2f 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs @@ -20,8 +20,7 @@ public sealed unsafe partial class SOSDacImpl : IXCLRDataProcess, IXCLRDataProce { int IXCLRDataProcess.Flush() { - _target.ProcessedData.Clear(); - _target.Contracts.Flush(); + _target.Flush(); // As long as any part of cDAC falls back to the legacy DAC, we need to propagate the Flush call if (_legacyProcess is not null) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index c1a04a1d7e4940..894b6b28be7935 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -5786,12 +5786,11 @@ int ISOSDacInterface13.GetGCFreeRegions(DacComNullableByRef ppEn => _legacyImpl13 is not null ? _legacyImpl13.GetGCFreeRegions(ppEnum) : HResults.E_NOTIMPL; int ISOSDacInterface13.LockedFlush() { - _target.ProcessedData.Clear(); - _target.Contracts.Flush(); + _target.Flush(); // As long as any part of cDAC falls back to the legacy DAC, we need to propagate the Flush call - if (_legacyProcess is not null) - return _legacyProcess.Flush(); + if (_legacyProcess13 is not null) + return _legacyProcess13.LockedFlush(); return HResults.S_OK; } diff --git a/src/native/managed/cdac/tests/TestPlaceholderTarget.cs b/src/native/managed/cdac/tests/TestPlaceholderTarget.cs index 3b7595e1ccc129..b8e7017885cbdd 100644 --- a/src/native/managed/cdac/tests/TestPlaceholderTarget.cs +++ b/src/native/managed/cdac/tests/TestPlaceholderTarget.cs @@ -450,6 +450,8 @@ public override TContract GetContract() throw new NotImplementedException($"Contract {typeof(TContract).Name} is not registered."); } + + public override void Flush() { } } } From 7b8137d891b41ef7ca31fa8dba9bc61ef7974b24 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Mon, 16 Mar 2026 13:37:18 -0700 Subject: [PATCH 3/4] code review --- .../Contracts/IContract.cs | 2 +- .../Contracts/BuiltInCOM_1.cs | 2 -- .../Contracts/CodeVersions_1.cs | 2 -- .../Contracts/ComWrappers_1.cs | 2 -- .../Contracts/DacStreams_1.cs | 2 -- .../Contracts/DebugInfo/DebugInfo_1.cs | 2 -- .../Contracts/DebugInfo/DebugInfo_2.cs | 2 -- .../Contracts/Exception_1.cs | 2 -- .../Contracts/GC/GC_1.cs | 2 -- .../Contracts/GCInfo/GCInfo_1.cs | 2 -- .../Contracts/Loader_1.cs | 2 -- .../Contracts/Notifications_1.cs | 2 -- .../Contracts/Object_1.cs | 2 -- .../Contracts/PlatformMetadata_1.cs | 2 -- .../Contracts/PrecodeStubs_Common.cs | 2 -- .../Contracts/ReJIT_1.cs | 2 -- .../Contracts/RuntimeInfo_1.cs | 2 -- .../Contracts/SHash_1.cs | 2 -- .../Contracts/StackWalk/StackWalk_1.cs | 2 -- .../Contracts/StressLog.cs | 4 ---- .../Contracts/SyncBlock_1.cs | 2 -- .../Contracts/Thread_1.cs | 2 -- .../TargetStream.cs | 1 - .../SOSDacImpl.cs | 4 ++-- 24 files changed, 3 insertions(+), 48 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.cs index 7e227a8a5b36df..27f72d3bccddfc 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.cs @@ -13,5 +13,5 @@ public interface IContract /// Clear any cached data held by this contract. /// Called when the target process state may have changed (e.g. on resume). /// - void Flush() => throw new NotImplementedException(); + void Flush() { } } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/BuiltInCOM_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/BuiltInCOM_1.cs index 8660f58f5e4d28..7dfc12596f1e99 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/BuiltInCOM_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/BuiltInCOM_1.cs @@ -43,8 +43,6 @@ internal BuiltInCOM_1(Target target) _target = target; } - public void Flush() { } - public ulong GetRefCount(TargetPointer address) { Data.ComCallWrapper wrapper = _target.ProcessedData.GetOrAdd(address); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/CodeVersions_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/CodeVersions_1.cs index ae340249e38cfa..fc50c95ffbf16f 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/CodeVersions_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/CodeVersions_1.cs @@ -18,8 +18,6 @@ public CodeVersions_1(Target target) _target = target; } - public void Flush() { } - ILCodeVersionHandle ICodeVersions.GetActiveILCodeVersion(TargetPointer methodDesc) { // CodeVersionManager::GetActiveILCodeVersion diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ComWrappers_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ComWrappers_1.cs index 78d909cb88798e..0b9ce1d310cdff 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ComWrappers_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ComWrappers_1.cs @@ -19,8 +19,6 @@ public ComWrappers_1(Target target) _target = target; } - public void Flush() { } - public TargetPointer GetComWrappersIdentity(TargetPointer address) { Data.NativeObjectWrapperObject wrapper = _target.ProcessedData.GetOrAdd(address); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DacStreams_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DacStreams_1.cs index d3e83f9e384e45..f933cb28a07258 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DacStreams_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DacStreams_1.cs @@ -29,8 +29,6 @@ internal DacStreams_1(Target target) _target = target; } - public void Flush() { } - public string? StringFromEEAddress(TargetPointer address) { // We use the data subsystem to handle caching results from processing this data diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.cs index a1ffbac02eb3c8..f3d22255414ccb 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.cs @@ -12,8 +12,6 @@ internal sealed class DebugInfo_1(Target target) : IDebugInfo { private const uint DEBUG_INFO_BOUNDS_HAS_INSTRUMENTED_BOUNDS = 0xFFFFFFFF; - public void Flush() { } - [Flags] internal enum ExtraDebugInfoFlags_1 : byte { diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.cs index 0bfbe3e80ce0b0..818db5e12c7bbf 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.cs @@ -11,8 +11,6 @@ internal sealed class DebugInfo_2(Target target) : IDebugInfo { private const uint DEBUG_INFO_FAT = 0; - public void Flush() { } - private record struct DebugInfoChunks { public TargetPointer BoundsStart; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Exception_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Exception_1.cs index 187d97219892f6..bd44779f0bf8b8 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Exception_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Exception_1.cs @@ -14,8 +14,6 @@ internal Exception_1(Target target) _target = target; } - public void Flush() { } - TargetPointer IException.GetNestedExceptionInfo(TargetPointer exceptionInfoAddr, out TargetPointer nextNestedExceptionInfo, out TargetPointer thrownObjectHandle) { Data.ExceptionInfo exceptionInfo = _target.ProcessedData.GetOrAdd(exceptionInfoAddr); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs index 7f3a58cb1550ab..935a224cebf7ce 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs @@ -47,8 +47,6 @@ internal GC_1(Target target, uint handlesPerBlock, byte blockInvalid, TargetPoin _handleMaxInternalTypes = handleMaxInternalTypes; } - public void Flush() { } - string[] IGC.GetGCIdentifiers() { string gcIdentifiers = _target.ReadGlobalString(Constants.Globals.GCIdentifiers); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.cs index 1cf6d82fc187ae..f34292572a936e 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.cs @@ -15,8 +15,6 @@ internal GCInfo_1(Target target) _target = target; } - public void Flush() { } - IGCInfoHandle IGCInfo.DecodePlatformSpecificGCInfo(TargetPointer gcInfoAddress, uint gcVersion) => new GcInfoDecoder(_target, gcInfoAddress, gcVersion); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs index f47b168360da19..60143e7535d418 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs @@ -42,8 +42,6 @@ internal Loader_1(Target target) _target = target; } - public void Flush() { } - ModuleHandle ILoader.GetModuleHandleFromModulePtr(TargetPointer modulePointer) { if (modulePointer == TargetPointer.Null) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Notifications_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Notifications_1.cs index 9511b8d566d364..8ccfd67585e234 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Notifications_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Notifications_1.cs @@ -14,8 +14,6 @@ internal Notifications_1(Target target) _target = target; } - public void Flush() { } - void INotifications.SetGcNotification(int condemnedGeneration) { TargetPointer pGcNotificationFlags = _target.ReadGlobalPointer(Constants.Globals.GcNotificationFlags); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Object_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Object_1.cs index df203ceb480223..3dc1fe70a5bb3c 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Object_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Object_1.cs @@ -24,8 +24,6 @@ internal Object_1(Target target, ulong methodTableOffset, byte objectToMethodTab _syncTableEntries = syncTableEntries; } - public void Flush() { } - public TargetPointer GetMethodTableAddress(TargetPointer address) { TargetPointer mt = _target.ReadPointer(address + _methodTableOffset); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.cs index 93e6d6520b3428..0e317fa202347e 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.cs @@ -16,8 +16,6 @@ public PlatformMetadata_1(Target target, Data.PlatformMetadata cdacMetadata) _cdacMetadata = cdacMetadata; } - public void Flush() { } - TargetPointer IPlatformMetadata.GetPrecodeMachineDescriptor() { return _cdacMetadata.PrecodeMachineDescriptor; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_Common.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_Common.cs index b11a2c6408a5db..88c61ef14cb742 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_Common.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_Common.cs @@ -138,8 +138,6 @@ public PrecodeStubsCommon(Target target, Data.PrecodeMachineDescriptor precodeMa _codePointerFlags = codePointerFlags; } - public void Flush() { } - TargetPointer IPrecodeStubs.GetMethodDescFromStubAddress(TargetCodePointer entryPoint) { ValidPrecode precode = GetPrecodeFromEntryPoint(entryPoint); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.cs index 2507fc5feb3642..eb9d7af509a342 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.cs @@ -36,8 +36,6 @@ public ReJIT_1(Target target, Data.ProfControlBlock profControlBlock) _profControlBlock = profControlBlock; } - public void Flush() { } - bool IReJIT.IsEnabled() { bool profEnabledReJIT = (_profControlBlock.GlobalEventMask & (ulong)COR_PRF_MONITOR.COR_PRF_ENABLE_REJIT) != 0; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeInfo_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeInfo_1.cs index 54ad9894d33904..fdc50b0f3fd5e0 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeInfo_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeInfo_1.cs @@ -14,8 +14,6 @@ public RuntimeInfo_1(Target target) _target = target; } - public void Flush() { } - readonly RuntimeInfoArchitecture IRuntimeInfo.GetTargetArchitecture() { if (_target.TryReadGlobalString(Constants.Globals.Architecture, out string? arch)) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SHash_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SHash_1.cs index 79869350745adf..6c86e95d80b09f 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SHash_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SHash_1.cs @@ -15,8 +15,6 @@ public SHash_1(Target target) _target = target; } - public void Flush() { } - private class SHash : ISHash where TEntry : IData { public TargetPointer Table { get; set; } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/StackWalk_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/StackWalk_1.cs index 2e4c7f244dd85c..281bf58b6d3fe3 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/StackWalk_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/StackWalk_1.cs @@ -20,8 +20,6 @@ internal StackWalk_1(Target target) _target = target; } - public void Flush() { } - public enum StackWalkState { SW_COMPLETE, diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.cs index c6031179b19e3d..7940f14b7faa7f 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.cs @@ -348,8 +348,6 @@ file sealed class StressLog_1(Target target) : IStressLog { private readonly StressLogTraversal traversal = new(target, new SmallStressMessageReader(target)); - public void Flush() { } - public bool HasStressLog() => traversal.HasStressLog(); public StressLogData GetStressLogData() => traversal.GetStressLogData(); public StressLogData GetStressLogData(TargetPointer stressLog) => traversal.GetStressLogData(stressLog); @@ -363,8 +361,6 @@ file sealed class StressLog_2(Target target) : IStressLog { private readonly StressLogTraversal traversal = new(target, new LargeStressMessageReader(target)); - public void Flush() { } - public bool HasStressLog() => traversal.HasStressLog(); public StressLogData GetStressLogData() => traversal.GetStressLogData(); public StressLogData GetStressLogData(TargetPointer stressLog) => traversal.GetStressLogData(stressLog); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SyncBlock_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SyncBlock_1.cs index 88d99c87dc7aba..0a51b7cc532cdf 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SyncBlock_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/SyncBlock_1.cs @@ -24,8 +24,6 @@ internal SyncBlock_1(Target target, TargetPointer syncTableEntries, ulong syncBl _syncBlockLinkOffset = syncBlockLinkOffset; } - public void Flush() { } - public TargetPointer GetSyncBlock(uint index) { Data.SyncTableEntry ste = _target.ProcessedData.GetOrAdd(_syncTableEntries + index * _target.GetTypeInfo(DataType.SyncTableEntry).Size!.Value); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs index a41bd5b99a1c04..42b52d034231f8 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs @@ -30,8 +30,6 @@ internal Thread_1(Target target, TargetPointer threadStore) _threadLinkOffset = (ulong)type.Fields[nameof(Data.Thread.LinkNext)].Offset; } - public void Flush() { } - ThreadStoreData IThread.GetThreadStoreData() { Data.ThreadStore threadStore = _target.ProcessedData.GetOrAdd(_threadStoreAddr); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/TargetStream.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/TargetStream.cs index 6ddea95ceea0e5..7f52965dc1c2d3 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/TargetStream.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/TargetStream.cs @@ -51,7 +51,6 @@ public override long Seek(long offset, SeekOrigin origin) } return _offset; } - public override void Flush() { } // No-op for read-only stream public override void SetLength(long value) => throw new NotSupportedException(); public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException(); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index 894b6b28be7935..41f2f5ec085aa0 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -5789,8 +5789,8 @@ int ISOSDacInterface13.LockedFlush() _target.Flush(); // As long as any part of cDAC falls back to the legacy DAC, we need to propagate the Flush call - if (_legacyProcess13 is not null) - return _legacyProcess13.LockedFlush(); + if (_legacyImpl13 is not null) + return _legacyImpl13.LockedFlush(); return HResults.S_OK; } From 40e48368c886bd04379b52a594c7952787d5b653 Mon Sep 17 00:00:00 2001 From: Rachel Date: Mon, 16 Mar 2026 13:38:17 -0700 Subject: [PATCH 4/4] Update TargetStream.cs --- .../TargetStream.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/TargetStream.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/TargetStream.cs index 7f52965dc1c2d3..6ddea95ceea0e5 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/TargetStream.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/TargetStream.cs @@ -51,6 +51,7 @@ public override long Seek(long offset, SeekOrigin origin) } return _offset; } + public override void Flush() { } // No-op for read-only stream public override void SetLength(long value) => throw new NotSupportedException(); public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException();