diff options
Diffstat (limited to 'src/vm/eetoprofinterfaceimpl.cpp')
-rw-r--r-- | src/vm/eetoprofinterfaceimpl.cpp | 106 |
1 files changed, 96 insertions, 10 deletions
diff --git a/src/vm/eetoprofinterfaceimpl.cpp b/src/vm/eetoprofinterfaceimpl.cpp index 09553fa6d1..232fc6d883 100644 --- a/src/vm/eetoprofinterfaceimpl.cpp +++ b/src/vm/eetoprofinterfaceimpl.cpp @@ -409,6 +409,7 @@ EEToProfInterfaceImpl::EEToProfInterfaceImpl() : m_pCallback4(NULL), m_pCallback5(NULL), m_pCallback6(NULL), + m_pCallback7(NULL), m_hmodProfilerDLL(NULL), m_fLoadedViaAttach(FALSE), m_pProfToEE(NULL), @@ -659,21 +660,24 @@ HRESULT EEToProfInterfaceImpl::CreateProfiler( m_hmodProfilerDLL = hmodProfilerDLL.Extract(); hmodProfilerDLL = NULL; - // The profiler may optionally support ICorProfilerCallback3,4,5,6. Let's check. - - ReleaseHolder<ICorProfilerCallback6> pCallback6; + // The profiler may optionally support ICorProfilerCallback3,4,5,6,7. Let's check. + + ReleaseHolder<ICorProfilerCallback7> pCallback7; hr = m_pCallback2->QueryInterface( - IID_ICorProfilerCallback6, - (LPVOID *) &pCallback6); - if (SUCCEEDED(hr) && (pCallback6 != NULL)) + IID_ICorProfilerCallback7, + (LPVOID *)&pCallback7); + if (SUCCEEDED(hr) && (pCallback7 != NULL)) { // Nifty. Transfer ownership to this class - _ASSERTE(m_pCallback6 == NULL); - m_pCallback6 = pCallback6.Extract(); - pCallback6 = NULL; + _ASSERTE(m_pCallback7 == NULL); + m_pCallback7 = pCallback7.Extract(); + pCallback7 = NULL; - // And while we're at it, we must now also have an ICorProfilerCallback3,4,5 + // And while we're at it, we must now also have an ICorProfilerCallback3,4,5,6 // due to inheritance relationship of the interfaces + _ASSERTE(m_pCallback6 == NULL); + m_pCallback6 = static_cast<ICorProfilerCallback6 *>(m_pCallback7); + m_pCallback6->AddRef(); _ASSERTE(m_pCallback5 == NULL); m_pCallback5 = static_cast<ICorProfilerCallback5 *>(m_pCallback6); @@ -687,6 +691,36 @@ HRESULT EEToProfInterfaceImpl::CreateProfiler( m_pCallback3 = static_cast<ICorProfilerCallback3 *>(m_pCallback4); m_pCallback3->AddRef(); } + + if (m_pCallback6 == NULL) + { + ReleaseHolder<ICorProfilerCallback6> pCallback6; + hr = m_pCallback2->QueryInterface( + IID_ICorProfilerCallback6, + (LPVOID *)&pCallback6); + if (SUCCEEDED(hr) && (pCallback6 != NULL)) + { + // Nifty. Transfer ownership to this class + _ASSERTE(m_pCallback6 == NULL); + m_pCallback6 = pCallback6.Extract(); + pCallback6 = NULL; + + // And while we're at it, we must now also have an ICorProfilerCallback3,4,5 + // due to inheritance relationship of the interfaces + + _ASSERTE(m_pCallback5 == NULL); + m_pCallback5 = static_cast<ICorProfilerCallback5 *>(m_pCallback6); + m_pCallback5->AddRef(); + + _ASSERTE(m_pCallback4 == NULL); + m_pCallback4 = static_cast<ICorProfilerCallback4 *>(m_pCallback5); + m_pCallback4->AddRef(); + + _ASSERTE(m_pCallback3 == NULL); + m_pCallback3 = static_cast<ICorProfilerCallback3 *>(m_pCallback4); + m_pCallback3->AddRef(); + } + } if (m_pCallback5 == NULL) { @@ -828,6 +862,13 @@ EEToProfInterfaceImpl::~EEToProfInterfaceImpl() m_pCallback6 = NULL; } + if (m_pCallback7 != NULL) + { + REMOVE_STACK_GUARD_FOR_PROFILER_CALL; + m_pCallback7->Release(); + m_pCallback7 = NULL; + } + // Only unload the V4 profiler if this is not part of shutdown. This protects // Whidbey profilers that aren't used to being FreeLibrary'd. if (fIsV4Profiler && !g_fEEShutDown) @@ -2299,6 +2340,12 @@ HRESULT EEToProfInterfaceImpl::SetEventMask(DWORD dwEventMask, DWORD dwEventMask return CORPROF_E_CALLBACK6_REQUIRED; } + if (((dwEventMaskHigh & COR_PRF_HIGH_IN_MEMORY_SYMBOLS_UPDATED) != 0) && + !IsCallback7Supported()) + { + return CORPROF_E_CALLBACK7_REQUIRED; + } + // Now save the modified masks g_profControlBlock.dwEventMask = dwEventMask; g_profControlBlock.dwEventMaskHigh = dwEventMaskHigh; @@ -3649,6 +3696,45 @@ HRESULT EEToProfInterfaceImpl::ModuleAttachedToAssembly( } } +HRESULT EEToProfInterfaceImpl::ModuleInMemorySymbolsUpdated(ModuleID moduleId) +{ + CONTRACTL + { + // Yay! + NOTHROW; + + // Yay! + GC_TRIGGERS; + + // Yay! + MODE_PREEMPTIVE; + + // Yay! + CAN_TAKE_LOCK; + + SO_NOT_MAINLINE; + } + CONTRACTL_END; + + CLR_TO_PROFILER_ENTRYPOINT((LF_CORPROF, + LL_INFO10, + "**PROF: ModuleInMemorySymbolsUpdated. moduleId: 0x%p.\n", + moduleId + )); + HRESULT hr = S_OK; + + _ASSERTE(IsCallback7Supported()); + + { + // All callbacks are really NOTHROW, but that's enforced partially by the profiler, + // whose try/catch blocks aren't visible to the contract system + PERMANENT_CONTRACT_VIOLATION(ThrowsViolation, ReasonProfilerCallout); + hr = m_pCallback7->ModuleInMemorySymbolsUpdated(moduleId); + } + + return hr; +} + //--------------------------------------------------------------------------------------- // CLASS EVENTS // |