// Remember the profiler is doing this, as that means we must never detach it!
g_profControlBlock.pProfInterface->SetUnrevertiblyModifiedILFlag();
+
+ HRESULT hr = SetupThreadForReJIT();
+ if (FAILED(hr))
+ {
+ return hr;
+ }
GCX_PREEMP();
return ReJitManager::RequestReJIT(cFunctions, moduleIds, methodIds, static_cast<COR_PRF_REJIT_FLAGS>(dwRejitFlags));
return ReJitManager::GetReJITIDs(pMD, cReJitIds, pcReJitIds, reJitIds);
}
+
+HRESULT ProfToEEInterfaceImpl::SetupThreadForReJIT()
+{
+ LIMITED_METHOD_CONTRACT;
+
+ HRESULT hr = S_OK;
+ EX_TRY
+ {
+ if (GetThread() == NULL)
+ {
+ SetupThread();
+ }
+
+ Thread *pThread = GetThread();
+ pThread->SetProfilerCallbackStateFlags(COR_PRF_CALLBACKSTATE_REJIT_WAS_CALLED);
+ }
+ EX_CATCH_HRESULT(hr);
+
+ return hr;
+}
+
HRESULT ProfToEEInterfaceImpl::RequestReJIT(ULONG cFunctions, // in
ModuleID moduleIds[], // in
mdMethodDef methodIds[]) // in
// Remember the profiler is doing this, as that means we must never detach it!
g_profControlBlock.pProfInterface->SetUnrevertiblyModifiedILFlag();
+ HRESULT hr = SetupThreadForReJIT();
+ if (FAILED(hr))
+ {
+ return hr;
+ }
+
GCX_PREEMP();
return ReJitManager::RequestReJIT(cFunctions, moduleIds, methodIds, static_cast<COR_PRF_REJIT_FLAGS>(0));
}
memset(rgHrStatuses, 0, sizeof(HRESULT) * cFunctions);
_ASSERTE(S_OK == rgHrStatuses[0]);
}
+
+ HRESULT hr = SetupThreadForReJIT();
+ if (FAILED(hr))
+ {
+ return hr;
+ }
GCX_PREEMP();
return ReJitManager::RequestRevert(cFunctions, moduleIds, methodIds, rgHrStatuses);
BOOL fRet;
BEGIN_GETTHREAD_ALLOWED_IN_NO_THROW_REGION;
DWORD dwProfilerCallbackFullStateFlags = pThread->GetProfilerCallbackFullState();
- if ((dwProfilerCallbackFullStateFlags & COR_PRF_CALLBACKSTATE_FORCEGC_WAS_CALLED) != 0)
+ if (((dwProfilerCallbackFullStateFlags & COR_PRF_CALLBACKSTATE_FORCEGC_WAS_CALLED) != 0)
+ || ((dwProfilerCallbackFullStateFlags & COR_PRF_CALLBACKSTATE_REJIT_WAS_CALLED) != 0))
{
- // Threads on which ForceGC() was successfully called should be treated just
+ // Threads on which ForceGC() or RequestReJIT() was successfully called should be treated just
// like native threads. Profiler can do whatever it wants
return TRUE;
}