IReferenceTrackerHost
COM公式ドキュメント
XAML フレームワークが使用するガベージコレクション (GC) システムに対して、グローバルなサービスを提供するインターフェースを定義します。
解説(Remarks)
このインターフェースの実装は、IReferenceTrackerManager::SetReferenceTrackerHost メソッドに渡すことで、XAML フレームワークに登録する必要があります。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ホストに対してガベージコレクションを実行し、不要な参照ソースをすべて削除するよう要求します。
| options | XAML_REFERENCETRACKER_DISCONNECT | in | 0 または 1 を指定できます。1 はアプリケーションの中断 (suspend) が進行中であることを示します。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは参照ソースに IReferenceTracker::DisconnectFromTrackerSource を呼び出させる可能性がありますが、トラッカーソースに対して直ちに IUnknown::Release を呼び出す必要はありません。CLR ではこの呼び出しによってガベージコレクションがトリガーされますが、WaitForPendingFinalizers はトリガーされません。フラグが 1 の場合、ガベージコレクションは GCCollectionMode.Optimized の状態で実行されます。
参照ソースによって切断された参照トラッカーオブジェクトに対して、ホストが IUnknown::Release を呼び出すよう要求します。
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
Release の呼び出しは同一スレッドから行われる必要はありません。 この呼び出しの中で、CLR は WaitForPendingFinalizers を呼び出します。
呼び出し元スレッドで参照トラッキングが利用できなくなったことをホストに通知します。XAML は FrameworkView が初期化解除されたときにこれを呼び出します。
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
参照トラッカーソースを参照する参照トラッカーターゲットを提供するようホストに要求します。このトラッカーターゲットは、その後トラッカーソースのライフタイムを制御します。
| unknown | IUnknown* | in | 参照トラッカーソース。 |
| newReference | IReferenceTrackerTarget** | out | 参照トラッカーターゲット。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
たとえば、このメソッドを呼び出した後にトラッカーターゲットに対して Peg を呼び出すと、トラッカーソースが回収されるのを防ぐことができます。
前回の通知以降にメモリ割り当てが増加したことをホストに通知します。CLR はこれを、ガベージコレクションをいつ実行するかを決定するアルゴリズムに反映するために使用します。
| bytesAllocated | ULONGLONG | in | 現在割り当てられているバイト数。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
前回の通知以降にメモリ割り当てが減少したことをホストに通知します。
| bytesAllocated | ULONGLONG | in | 現在割り当てられているバイト数。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IReferenceTrackerHost "{29A71C6A-3C42-4416-A39D-E2825A07A773}"
#usecom global IReferenceTrackerHost IID_IReferenceTrackerHost "{}"
#comfunc global IReferenceTrackerHost_DisconnectUnusedReferenceSources 3 int
#comfunc global IReferenceTrackerHost_ReleaseDisconnectedReferenceSources 4
#comfunc global IReferenceTrackerHost_NotifyEndOfReferenceTrackingOnThread 5
#comfunc global IReferenceTrackerHost_GetTrackerTarget 6 sptr,sptr
#comfunc global IReferenceTrackerHost_AddMemoryPressure 7 int64
#comfunc global IReferenceTrackerHost_RemoveMemoryPressure 8 int64
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。