diff options
author | Andrew Au <andrewau@microsoft.com> | 2018-05-09 09:40:47 -0700 |
---|---|---|
committer | Andrew Au <cshung@gmail.com> | 2018-11-06 18:34:47 -0800 |
commit | 1df9f792fa4a421014354063f8a63eca925c20e7 (patch) | |
tree | 2fa2bb4e121b70746eb1b2b093be21ef237d7f50 /src/debug/di/rsmain.cpp | |
parent | 6a67567b0e75d396e3e088494465c6b1276b0c35 (diff) | |
download | coreclr-1df9f792fa4a421014354063f8a63eca925c20e7.tar.gz coreclr-1df9f792fa4a421014354063f8a63eca925c20e7.tar.bz2 coreclr-1df9f792fa4a421014354063f8a63eca925c20e7.zip |
Saving progress - works towards gc events
Diffstat (limited to 'src/debug/di/rsmain.cpp')
-rw-r--r-- | src/debug/di/rsmain.cpp | 98 |
1 files changed, 94 insertions, 4 deletions
diff --git a/src/debug/di/rsmain.cpp b/src/debug/di/rsmain.cpp index 75a6ad00db..39ac60d0c2 100644 --- a/src/debug/di/rsmain.cpp +++ b/src/debug/di/rsmain.cpp @@ -852,6 +852,84 @@ namespace pAppDomain->Continue(false); return S_OK; } + + // + // DefaultManagedCallback4 + // + // In the event that the debugger is of an older version than the Right Side & Left Side, the Right Side may issue + // new callbacks that the debugger is not expecting. In this case, we need to provide a default behavior for those + // new callbacks, if for nothing else than to force the debugger to Continue(). + // + class DefaultManagedCallback4 : public ICorDebugManagedCallback4 + { + public: + DefaultManagedCallback4(ICorDebug* pDebug); + virtual ~DefaultManagedCallback4() { } + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** pInterface); + virtual ULONG STDMETHODCALLTYPE AddRef(); + virtual ULONG STDMETHODCALLTYPE Release(); + COM_METHOD SomeWork(ICorDebugThread * pThread, ICorDebugAppDomain * pAppDomain); + private: + // not implemented + DefaultManagedCallback4(const DefaultManagedCallback4&); + DefaultManagedCallback4& operator=(const DefaultManagedCallback4&); + + ICorDebug* m_pDebug; + LONG m_refCount; + }; + + DefaultManagedCallback4::DefaultManagedCallback4(ICorDebug* pDebug) : m_pDebug(pDebug), m_refCount(0) + { + } + + HRESULT + DefaultManagedCallback4::QueryInterface(REFIID iid, void** pInterface) + { + if (IID_ICorDebugManagedCallback4 == iid) + { + *pInterface = static_cast<ICorDebugManagedCallback4*>(this); + } + else if (IID_IUnknown == iid) + { + *pInterface = static_cast<IUnknown*>(this); + } + else + { + *pInterface = NULL; + return E_NOINTERFACE; + } + + this->AddRef(); + return S_OK; + } + + ULONG + DefaultManagedCallback4::AddRef() + { + return InterlockedIncrement(&m_refCount); + } + + ULONG + DefaultManagedCallback4::Release() + { + ULONG ulRef = InterlockedDecrement(&m_refCount); + if (0 == ulRef) + { + delete this; + } + + return ulRef; + } + + HRESULT + DefaultManagedCallback4::SomeWork(ICorDebugThread * pThread, ICorDebugAppDomain * pAppDomain) + { + // + // Just ignore and continue the process. + // + pAppDomain->Continue(false); + return S_OK; + } } /* ------------------------------------------------------------------------- * @@ -1055,6 +1133,7 @@ HRESULT Cordb::Terminate() m_managedCallback.Clear(); m_managedCallback2.Clear(); m_managedCallback3.Clear(); + m_managedCallback4.Clear(); m_unmanagedCallback.Clear(); // The Shell may still have outstanding references, so we don't want to shutdown logging yet. @@ -1209,7 +1288,7 @@ void Cordb::AddProcess(CordbProcess* process) // can have another debuggee. STRESS_LOG1(LF_CORDB, LL_INFO10, "Cordb::AddProcess %08x...\n", process); - if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL)) + if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL) || (m_managedCallback4 == NULL)) { ThrowHR(E_FAIL); } @@ -1352,6 +1431,7 @@ HRESULT Cordb::SetManagedHandler(ICorDebugManagedCallback *pCallback) m_managedCallback.Clear(); m_managedCallback2.Clear(); m_managedCallback3.Clear(); + m_managedCallback4.Clear(); // For SxS, V2.0 debuggers must implement ManagedCallback2 to handle v2.0 debug events. // For Single-CLR, A v1.0 debugger may actually geta V2.0 debuggee. @@ -1376,7 +1456,6 @@ HRESULT Cordb::SetManagedHandler(ICorDebugManagedCallback *pCallback) } } - pCallback->QueryInterface(IID_ICorDebugManagedCallback3, (void **)&m_managedCallback3); if (m_managedCallback3 == NULL) { @@ -1388,6 +1467,17 @@ HRESULT Cordb::SetManagedHandler(ICorDebugManagedCallback *pCallback) return E_OUTOFMEMORY; } + pCallback->QueryInterface(IID_ICorDebugManagedCallback4, (void **)&m_managedCallback4); + if (m_managedCallback4 == NULL) + { + m_managedCallback4.Assign(new (nothrow) DefaultManagedCallback4(this)); + } + + if (m_managedCallback4 == NULL) + { + return E_OUTOFMEMORY; + } + m_managedCallback.Assign(pCallback); return S_OK; } @@ -1567,7 +1657,7 @@ HRESULT Cordb::CreateProcessCommon(ICorDebugRemoteTarget * pRemoteTarget, #endif // FEATURE_INTEROP_DEBUGGING // Must have a managed-callback by now. - if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL)) + if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL) || (m_managedCallback4 == NULL)) { ThrowHR(E_FAIL); } @@ -1702,7 +1792,7 @@ HRESULT Cordb::DebugActiveProcessCommon(ICorDebugRemoteTarget * pRemoteTarget, } // Must have a managed-callback by now. - if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL)) + if ((m_managedCallback == NULL) || (m_managedCallback2 == NULL) || (m_managedCallback3 == NULL) || (m_managedCallback4 == NULL)) { ThrowHR(E_FAIL); } |