summaryrefslogtreecommitdiff
path: root/src/vm/eetoprofinterfaceimpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/eetoprofinterfaceimpl.cpp')
-rw-r--r--src/vm/eetoprofinterfaceimpl.cpp93
1 files changed, 84 insertions, 9 deletions
diff --git a/src/vm/eetoprofinterfaceimpl.cpp b/src/vm/eetoprofinterfaceimpl.cpp
index ca35717bec..75f4a02af2 100644
--- a/src/vm/eetoprofinterfaceimpl.cpp
+++ b/src/vm/eetoprofinterfaceimpl.cpp
@@ -415,6 +415,7 @@ EEToProfInterfaceImpl::EEToProfInterfaceImpl() :
m_pCallback6(NULL),
m_pCallback7(NULL),
m_pCallback8(NULL),
+ m_pCallback9(NULL),
m_hmodProfilerDLL(NULL),
m_fLoadedViaAttach(FALSE),
m_pProfToEE(NULL),
@@ -665,21 +666,25 @@ HRESULT EEToProfInterfaceImpl::CreateProfiler(
m_hmodProfilerDLL = hmodProfilerDLL.Extract();
hmodProfilerDLL = NULL;
- // The profiler may optionally support ICorProfilerCallback3,4,5,6,7,8. Let's check.
+ // The profiler may optionally support ICorProfilerCallback3,4,5,6,7,8,9. Let's check.
- ReleaseHolder<ICorProfilerCallback8> pCallback8;
+ ReleaseHolder<ICorProfilerCallback9> pCallback9;
hr = m_pCallback2->QueryInterface(
- IID_ICorProfilerCallback8,
- (LPVOID *)&pCallback8);
- if (SUCCEEDED(hr) && (pCallback8 != NULL))
+ IID_ICorProfilerCallback9,
+ (LPVOID *)&pCallback9);
+ if (SUCCEEDED(hr) && (pCallback9 != NULL))
{
// Nifty. Transfer ownership to this class
- _ASSERTE(m_pCallback8 == NULL);
- m_pCallback8 = pCallback8.Extract();
- pCallback8 = NULL;
+ _ASSERTE(m_pCallback9 == NULL);
+ m_pCallback9 = pCallback9.Extract();
+ pCallback9 = NULL;
- // And while we're at it, we must now also have an ICorProfilerCallback3,4,5,6,7
+ // And while we're at it, we must now also have an ICorProfilerCallback3,4,5,6,7,8
// due to inheritance relationship of the interfaces
+ _ASSERTE(m_pCallback8 == NULL);
+ m_pCallback8 = static_cast<ICorProfilerCallback8 *>(m_pCallback9);
+ m_pCallback8->AddRef();
+
_ASSERTE(m_pCallback7 == NULL);
m_pCallback7 = static_cast<ICorProfilerCallback7 *>(m_pCallback8);
m_pCallback7->AddRef();
@@ -701,6 +706,44 @@ HRESULT EEToProfInterfaceImpl::CreateProfiler(
m_pCallback3->AddRef();
}
+ if (m_pCallback8 == NULL)
+ {
+ ReleaseHolder<ICorProfilerCallback8> pCallback8;
+ hr = m_pCallback2->QueryInterface(
+ IID_ICorProfilerCallback8,
+ (LPVOID *)&pCallback8);
+ if (SUCCEEDED(hr) && (pCallback8 != NULL))
+ {
+ // Nifty. Transfer ownership to this class
+ _ASSERTE(m_pCallback8 == NULL);
+ m_pCallback8 = pCallback8.Extract();
+ pCallback8 = NULL;
+
+ // And while we're at it, we must now also have an ICorProfilerCallback3,4,5,6,7
+ // due to inheritance relationship of the interfaces
+
+ _ASSERTE(m_pCallback7 == NULL);
+ m_pCallback7 = static_cast<ICorProfilerCallback7 *>(m_pCallback8);
+ m_pCallback7->AddRef();
+
+ _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);
+ 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_pCallback7 == NULL)
{
ReleaseHolder<ICorProfilerCallback7> pCallback7;
@@ -3218,6 +3261,38 @@ HRESULT EEToProfInterfaceImpl::JITCompilationStarted(FunctionID functionId,
}
}
+HRESULT EEToProfInterfaceImpl::DynamicMethodUnloaded(FunctionID functionId)
+{
+ CONTRACTL
+ {
+ THROWS;
+ GC_TRIGGERS;
+ MODE_COOPERATIVE; // RuntimeMethodHandle::Destroy (the caller) moves from QCALL to GCX_COOP
+ CAN_TAKE_LOCK;
+ SO_TOLERANT;
+ }
+ CONTRACTL_END;
+
+ CLR_TO_PROFILER_ENTRYPOINT((LF_CORPROF,
+ LL_INFO1000,
+ "**PROF: DynamicMethodUnloaded 0x%p.\n",
+ functionId));
+
+ _ASSERTE(functionId);
+
+ if (m_pCallback9 == NULL)
+ {
+ return S_OK;
+ }
+
+ {
+ // 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);
+ return m_pCallback9->DynamicMethodUnloaded(functionId);
+ }
+}
+
HRESULT EEToProfInterfaceImpl::DynamicMethodJITCompilationFinished(FunctionID functionId,
HRESULT hrStatus,
BOOL fIsSafeToBlock)