--- /dev/null
+#!/usr/bin/perl
+
+use File::Find;
+use IO::File;
+
+use strict;
+use vars qw($Pat @Locks $DupOnly);
+
+# This pattern matches the function names we are looking for
+$Pat = qr/(?:NB)?Obtain(?:Write|Shared|)Lock|UpgradeSToWLock/;
+
+if (@ARGV[0] eq '-d') {
+ $DupOnly = 1;
+ shift @ARGV;
+}
+
+find(
+ sub {
+ return unless -f $_;
+
+ my $path = $File::Find::name;
+ my $F = new IO::File($_, O_RDONLY) or die "$path: $!\n";
+ while (<$F>) {
+ next unless /\b(?:$Pat)\(.*,\s*(\d+)\)/o;
+ $Locks[$1] ||= [];
+ push(@{$Locks[$1]}, sprintf("%s:%d", $path, $.));
+ }
+ $F->close;
+ }, @ARGV);
+
+foreach my $id (0 .. @Locks) {
+ next unless defined $Locks[$id];
+ next if $DupOnly && @{$Locks[$id]} < 2;
+ printf("%5d %s", $id, join(" ", map("$_\n", @{$Locks[$id]})))
+}