プログラムのパフォーマンス解析

locks

locks は以下の構文を持っています。


locks [-co] lock ...
locks [-col]
locks [-col] [directly] affected by func ...
locks [-col] [directly] inverted by func ...

読み込まれたファイルのロックに関する情報をリストします。ロック操作ルーチン中で実際に使用される変数のみが提示されますが、宣言されているだけで、実際には操作されることのないロックは提示されません。

表 A-8 locks のオプション

オプション 

定義 

-c

(cover) ロックの階層関係についての情報を提示します。こうした関係は、assert rwlock covers サブコマンドを使って記述されます (ロックがこうした関係で配置されている場合、カバーされる側のロックが保持される際には、少なくとも読み取りアクセスに対するカバーする側のロックが保持されなければなりません。一方、書き込みアクセスに対してはカバーする側のロックを保持している間は、カバーされる側のロックは保持する必要はありません)。ロックがほかのロックをカバーする場合、ロックは次のように提示されます。

covered={ lock ... }

ロックがほかのロックによってカバーされている場合、ロックは次のように表示されます。 

cover=lock

-l

(long) -co に相当します。

-o

(other) ロックの型を type として示します。ロックの型には、mutex (相互排他型)、rwlock (読み込み/書き込み型)、ambiguous (あいまい型) (ある場所では mutex 型、別の場所では rwlock 型として使用される) があります。

locks [-co] lock ...

個々のロックについての情報をリストします。デフォルトでは、この形式のサブコマンドは、-co が指定されているものとして、ロックの詳細情報をすべて表示します。

locks [-col]

すべてのロックについての情報をリストします。

locks [-col] [directly] affected by func ...

指定された関数を呼び出した結果として、影響 (獲得、解放、昇格、降格) を受ける可能性のあるロックのみをリストします。キーワード directly が指定された場合は、スレッドライブラリルーチンを使用し、直接ロックに影響 (獲得、解放、昇格、降格) を与える関数のみが表示されます。キーワード directly が指定されない場合は、ロックに影響を与える関数を呼び出すすべての関数、さらに、そうした関数を呼び出すすべての関数といった具合に、関連するすべての関数が表示されます。

locks [-col] [directly] inverted by func ...

指定された関数の 1 つを呼び出すことで、逆転させられる可能性のあるロックのみを表示します(「ロックの逆転」 を参照) 。

キーワード directly が指定された場合は、指定された関数 (スレッドライブラリルーチンを使って、実際にロックの獲得および解放を行う関数) によって直接逆転させられるロックのみが表示されます。キーワード directly が指定されない場合は、指定された関数のどれか 1 つによって保持され、そこから呼び出される関数によって逆転させられる (以下同様の) ロックも表示されます。たとえば、以下のコードでは、f1m1 を直接逆転し、さらに、m2 を間接的に逆転しています。


f1() { pthread_mutex_unlock(&m1); f2(); pthread_mutex_lock(&m1); }
f2() { f3(); }
f3() { pthread_mutex_unlock(&m2); pthread_mutex_lock(&m2); }