| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import argparse, os, sys, json, subprocess, pickle, StringIO | 6 import argparse, os, sys, json, subprocess, pickle, StringIO |
| 7 | 7 |
| 8 parser = argparse.ArgumentParser( | 8 parser = argparse.ArgumentParser( |
| 9 description = | 9 description = |
| 10 "Process the Blink points-to graph generated by the Blink GC plugin.") | 10 "Process the Blink points-to graph generated by the Blink GC plugin.") |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 if current.cost < dst.cost: | 250 if current.cost < dst.cost: |
| 251 dst.cost = current.cost + 1 | 251 dst.cost = current.cost + 1 |
| 252 dst.path = e | 252 dst.path = e |
| 253 minlist.append(dst) | 253 minlist.append(dst) |
| 254 | 254 |
| 255 def detect_cycles(): | 255 def detect_cycles(): |
| 256 for root_edge in roots: | 256 for root_edge in roots: |
| 257 reset_graph() | 257 reset_graph() |
| 258 # Mark ignored classes as already visited | 258 # Mark ignored classes as already visited |
| 259 for ignore in args.ignore_classes: | 259 for ignore in args.ignore_classes: |
| 260 name = ignore.find("::") > 0 and ignore or ("WebCore::" + ignore) | 260 name = ignore.find("::") > 0 and ignore or ("blink::" + ignore) |
| 261 node = graph.get(name) | 261 node = graph.get(name) |
| 262 if node: | 262 if node: |
| 263 node.visited = True | 263 node.visited = True |
| 264 src = graph[root_edge.src] | 264 src = graph[root_edge.src] |
| 265 dst = graph.get(root_edge.dst) | 265 dst = graph.get(root_edge.dst) |
| 266 if src.visited: | 266 if src.visited: |
| 267 continue | 267 continue |
| 268 if root_edge.dst == "WTF::String": | 268 if root_edge.dst == "WTF::String": |
| 269 continue | 269 continue |
| 270 if dst is None: | 270 if dst is None: |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 if not line or line.startswith('Found'): | 337 if not line or line.startswith('Found'): |
| 338 if len(block) > 0: | 338 if len(block) > 0: |
| 339 ignored_cycles.append(block) | 339 ignored_cycles.append(block) |
| 340 block = [] | 340 block = [] |
| 341 else: | 341 else: |
| 342 block += l | 342 block += l |
| 343 if len(block) > 0: | 343 if len(block) > 0: |
| 344 ignored_cycles.append(block) | 344 ignored_cycles.append(block) |
| 345 | 345 |
| 346 gc_bases = ( | 346 gc_bases = ( |
| 347 'WebCore::GarbageCollected', | 347 'blink::GarbageCollected', |
| 348 'WebCore::GarbageCollectedFinalized', | 348 'blink::GarbageCollectedFinalized', |
| 349 'WebCore::GarbageCollectedMixin', | 349 'blink::GarbageCollectedMixin', |
| 350 ) | 350 ) |
| 351 ref_bases = ( | 351 ref_bases = ( |
| 352 'WTF::RefCounted', | 352 'WTF::RefCounted', |
| 353 'WTF::ThreadSafeRefCounted', | 353 'WTF::ThreadSafeRefCounted', |
| 354 ) | 354 ) |
| 355 gcref_bases = ( | 355 gcref_bases = ( |
| 356 'WebCore::RefCountedGarbageCollected', | 356 'blink::RefCountedGarbageCollected', |
| 357 'WebCore::ThreadSafeRefCountedGarbageCollected', | 357 'blink::ThreadSafeRefCountedGarbageCollected', |
| 358 ) | 358 ) |
| 359 ref_mixins = ( | 359 ref_mixins = ( |
| 360 'WebCore::EventTarget', | 360 'blink::EventTarget', |
| 361 'WebCore::EventTargetWithInlineData', | 361 'blink::EventTargetWithInlineData', |
| 362 'WebCore::ActiveDOMObject', | 362 'blink::ActiveDOMObject', |
| 363 ) | 363 ) |
| 364 | 364 |
| 365 def print_stats(): | 365 def print_stats(): |
| 366 gcref_managed = [] | 366 gcref_managed = [] |
| 367 ref_managed = [] | 367 ref_managed = [] |
| 368 gc_managed = [] | 368 gc_managed = [] |
| 369 hierarchies = [] | 369 hierarchies = [] |
| 370 | 370 |
| 371 for node in graph.itervalues(): | 371 for node in graph.itervalues(): |
| 372 node.update_counts() | 372 node.update_counts() |
| (...skipping 20 matching lines...) Expand all Loading... |
| 393 hierarchies.append((base, stats)) | 393 hierarchies.append((base, stats)) |
| 394 | 394 |
| 395 print "\nHierarchies in transition (RefCountedGarbageCollected):" | 395 print "\nHierarchies in transition (RefCountedGarbageCollected):" |
| 396 hierarchies.sort(key=lambda (n,s): -s['classes']) | 396 hierarchies.sort(key=lambda (n,s): -s['classes']) |
| 397 for (node, stats) in hierarchies: | 397 for (node, stats) in hierarchies: |
| 398 total = stats['mem'] + stats['ref'] + stats['raw'] | 398 total = stats['mem'] + stats['ref'] + stats['raw'] |
| 399 print ( | 399 print ( |
| 400 "%s %3d%% of %-30s: %3d cls, %3d mem, %3d ref, %3d raw, %3d ref-mixins" % | 400 "%s %3d%% of %-30s: %3d cls, %3d mem, %3d ref, %3d raw, %3d ref-mixins" % |
| 401 (stats['ref'] == 0 and stats['ref-mixins'] == 0 and "*" or " ", | 401 (stats['ref'] == 0 and stats['ref-mixins'] == 0 and "*" or " ", |
| 402 total == 0 and 100 or stats['mem'] * 100 / total, | 402 total == 0 and 100 or stats['mem'] * 100 / total, |
| 403 node.name.replace('WebCore::', ''), | 403 node.name.replace('blink::', ''), |
| 404 stats['classes'], | 404 stats['classes'], |
| 405 stats['mem'], | 405 stats['mem'], |
| 406 stats['ref'], | 406 stats['ref'], |
| 407 stats['raw'], | 407 stats['raw'], |
| 408 stats['ref-mixins'], | 408 stats['ref-mixins'], |
| 409 )) | 409 )) |
| 410 | 410 |
| 411 def hierarchy_stats(node, stats): | 411 def hierarchy_stats(node, stats): |
| 412 if not node: return | 412 if not node: return |
| 413 stats['classes'] += 1 | 413 stats['classes'] += 1 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 detect_cycles() | 455 detect_cycles() |
| 456 if args.print_stats: | 456 if args.print_stats: |
| 457 log("Printing statistics") | 457 log("Printing statistics") |
| 458 print_stats() | 458 print_stats() |
| 459 if reported_error(): | 459 if reported_error(): |
| 460 return 1 | 460 return 1 |
| 461 return 0 | 461 return 0 |
| 462 | 462 |
| 463 if __name__ == '__main__': | 463 if __name__ == '__main__': |
| 464 sys.exit(main()) | 464 sys.exit(main()) |
| OLD | NEW |