タスクがANNOTATE_OBSERVE_USESアノテーションでマークされたメモリーにアクセスすると発生します。この場合、問題は情報を示すだけでありアクションは必要ありません。これは、タスクの実行中に参照されるメモリー位置の使用を特定するのに役立ちます。
次のいずれかの条件が発生しました。



ID |
コードの場所 |
説明 |
|---|---|---|
1 |
並列サイト |
存在する場合、メモリー監視の問題を含む並列サイトの位置と関連するコールスタックを示します。 |
2 |
監視開始 |
メモリー位置をマークするANNOTATE_OBSERVE_USES();アノテーションの場所と関連するコールスタックを示します。 |
3 |
読み取り |
タスクが監視されているメモリー位置を読み取った場所と関連するコールスタックを示します。 |
4 |
書き込み |
タスクが監視されているメモリー位置に書き込んだ場所と関連するコールスタックを示します。 |
5 |
更新 |
タスクが監視されているメモリー位置を読み書きした場所と関連するコールスタックを示します。 |
void watch_memory() {
ANNOTATE_OBSERVE_USES(&watch, sizeof(watch)); // 監視開始
ANNOTATE_SITE_BEGIN(watch_site); // 並列サイト
{
ANNOTATE_TASK_BEGIN(watch_task1);
{
ANNOTATE_LOCK_ACQUIRE(&watch);
watch++; /* メモリーを監視 */ // 読み取りと/または書き込み
ANNOTATE_LOCK_RELEASE(&watch);
}
ANNOTATE_TASK_END();
ANNOTATE_TASK_BEGIN(watch_task2);
{
ANNOTATE_LOCK_ACQUIRE(&watch);
watch++; /* メモリーを監視 */ // 読み取りまたは書き込み
ANNOTATE_LOCK_RELEASE(&watch);
}
ANNOTATE_TASK_END();
}
ANNOTATE_SITE_END();
ANNOTATE_CLEAR_USES(&watch);
}この例は、watch_memory() の呼び出し中に watch で参照されるメモリー位置を参照するすべての場所をレポートします。
偶発的な共有の問題を修正するため ANNOTATE_OBSERVE_USES を使用するには、共有メモリーを非共有メモリーに置き換えられる場所をマークするため次の操作を行います。
タスクに ANNOTATE_OBSERVE_USES アノテーションを追加します。
動的タスク範囲における、共有メモリー位置の使用をすべて検出します。