Index: tools/traceline/traceline/scripts/crit_sec.js |
diff --git a/tools/traceline/traceline/scripts/crit_sec.js b/tools/traceline/traceline/scripts/crit_sec.js |
new file mode 100755 |
index 0000000000000000000000000000000000000000..018309a5d6836cb2767a25a582e43d5a8053426b |
--- /dev/null |
+++ b/tools/traceline/traceline/scripts/crit_sec.js |
@@ -0,0 +1,87 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// You should run this with v8, like v8_shell_sample alloc.js datafile.json |
+ |
+function toHex(num) { |
+ var str = ""; |
+ var table = "0123456789abcdef"; |
+ while (num != 0) { |
+ str = table.charAt(num & 0xf) + str; |
+ num >>= 4; |
+ } |
+ return str; |
+} |
+ |
+function parseEvents(z) { |
+ var crits = { } |
+ var calls = { } |
+ |
+ for (var i = 0, il = z.length; i < il; ++i) { |
+ var e = z[i]; |
+ |
+ if (e['eventtype'] == 'EVENT_TYPE_ENTER_CS' || |
+ e['eventtype'] == 'EVENT_TYPE_TRYENTER_CS' || |
+ e['eventtype'] == 'EVENT_TYPE_LEAVE_CS') { |
+ cs = e['critical_section']; |
+ if (!(cs in crits)) { |
+ crits[cs] = [ ]; |
+ } |
+ crits[cs].push(e); |
+ } |
+ } |
+ |
+ // Verify that the locks get unlocked, and operations stay on the same thread. |
+ for (var key in crits) { |
+ var cs = key; |
+ var es = crits[key]; |
+ |
+ var tid_stack = [ ]; |
+ for (var j = 0, jl = es.length; j < jl; ++j) { |
+ var e = es[j]; |
+ if (e['eventtype'] == 'EVENT_TYPE_ENTER_CS') { |
+ tid_stack.push(e); |
+ } else if (e['eventtype'] == 'EVENT_TYPE_TRYENTER_CS') { |
+ if (e['retval'] != 0) |
+ tid_stack.push(e); |
+ } else if (e['eventtype'] == 'EVENT_TYPE_LEAVE_CS') { |
+ if (tid_stack.length == 0) { |
+ print('fail ' + e); |
+ } |
+ var tid = tid_stack.pop() |
+ if (tid['thread'] != e['thread']) { |
+ print('fail ' + tid); |
+ } |
+ } |
+ } |
+ } |
+ |
+ // Look for long-held / contended locks. We can't really know it is |
+ // contended without looking if anyone is waiting on the embedded event... |
+ // Just look for locks are are held a long time? Not so good... |
+ for (var key in crits) { |
+ var cs = key; |
+ var es = crits[key]; |
+ |
+ var tid_stack = [ ]; |
+ for (var j = 0, jl = es.length; j < jl; ++j) { |
+ var e = es[j]; |
+ if (e['eventtype'] == 'EVENT_TYPE_ENTER_CS') { |
+ tid_stack.push(e); |
+ } else if (e['eventtype'] == 'EVENT_TYPE_TRYENTER_CS') { |
+ if (e['retval'] != 0) |
+ tid_stack.push(e); |
+ } else if (e['eventtype'] == 'EVENT_TYPE_LEAVE_CS') { |
+ if (tid_stack.length == 0) { |
+ print('fail ' + e); |
+ } |
+ var tid = tid_stack.pop(); |
+ var dur = e['ms'] - tid['ms']; |
+ if (dur > 0.1) { |
+ print('Lock: 0x' + toHex(cs) + ' for ' + dur + ' at: ' + e['ms']); |
+ } |
+ } |
+ } |
+ } |
+} |