次の方法で共有


ICorProfilerCallback4::ReJITCompilationStarted メソッド

Just-in-time (JIT) コンパイラで関数の再コンパイルが開始されたことをプロファイラーに通知します。

構文

HRESULT ReJITCompilationStarted(
    [in] FunctionID functionId,  
    [in] ReJITID    rejitId,  
    [in] BOOL       fIsSafeToBlock);  

パラメーター

functionId
[in] JIT コンパイラが再コンパイルを開始した関数の ID。

rejitId
[in] 関数の新しいバージョンの再コンパイル ID。

fIsSafeToBlock
[in] true の場合、ブロックが原因で、呼び出し元のスレッドがこのコールバックから戻るのをランタイムが待機する場合があることを示します。false の場合、ブロックがランタイムの動作に影響を与えないことを示します。 true の値によってランタイムに問題が起きることはありませんが、プロファイルの結果に影響を与える可能性があります。

解説

ランタイムでクラス コンストラクターを処理する方法によって、各関数に対して ReJITCompilationStartedReJITCompilationFinished 呼び出しの複数の組を受け取ることがあります。 たとえば、ランタイムがメソッド A の再コンパイルを開始する一方、クラス B のクラス コンストラクターを実行する必要があるとします。 このため、ランタイムはクラス B のコンストラクターを再コンパイルして実行します。 コンストラクターが実行されている間、メソッド A が呼び出され、これによってメソッド A が再び再コンパイルされます。 このシナリオでは、メソッド A の最初の再コンパイルが停止します。 ただし、メソッド A を再コンパイルする両方の試行が、JIT 再コンパイル イベントを使用して報告されます。

2 つのスレッドが同時にコールバックを実行する場合、プロファイラーは JIT 再コンパイル コールバックのシーケンスをサポートする必要があります。 たとえば、スレッド A が ReJITCompilationStarted を呼び出すとします。ただし、スレッド A で ReJITCompilationFinished を呼び出す前に、スレッド B で、スレッド A の ReJITCompilationStarted コールバックからの関数 ID を使用して、ICorProfilerCallback::ExceptionSearchFunctionEnter を呼び出します。ReJITCompilationFinished の呼び出しが、プロファイラーによってまだ受信されていないため、関数 ID がまだ有効ではないように見えるかもしれません。 ただし、この場合、関数 ID は有効です。

必要条件

:システム要件」を参照してください。

ヘッダー : CorProf.idl、CorProf.h

ライブラリ: CorGuids.lib

.NET Framework のバージョン: 4.5 以降で使用可能

関連項目