diff options
author | Adrian Hunter <adrian.hunter@intel.com> | 2019-02-28 08:00:30 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2019-03-01 12:56:17 -0500 |
commit | 254c0d820b86d7712e03750c58ab104e06e3655d (patch) | |
tree | 8e929a3f29fb409bd66603fea5b059b64d2f1215 /tools/perf/scripts/python/exported-sql-viewer.py | |
parent | a448ba232a5f0176c226df1bab8877ec06a7c771 (diff) |
perf scripts python: exported-sql-viewer.py: Factor out CallGraphModelBase
Factor out a base class CallGraphModelBase from CallGraphModel, so that
CallGraphModelBase can be reused.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: https://lkml.kernel.org/n/tip-76eybebzjwvgnadkm2oufrqi@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/scripts/python/exported-sql-viewer.py')
-rwxr-xr-x | tools/perf/scripts/python/exported-sql-viewer.py | 100 |
1 files changed, 55 insertions, 45 deletions
diff --git a/tools/perf/scripts/python/exported-sql-viewer.py b/tools/perf/scripts/python/exported-sql-viewer.py index b2a22525549d..c4a2134d85f5 100755 --- a/tools/perf/scripts/python/exported-sql-viewer.py +++ b/tools/perf/scripts/python/exported-sql-viewer.py | |||
@@ -558,26 +558,12 @@ class CallGraphRootItem(CallGraphLevelItemBase): | |||
558 | self.child_items.append(child_item) | 558 | self.child_items.append(child_item) |
559 | self.child_count += 1 | 559 | self.child_count += 1 |
560 | 560 | ||
561 | # Context-sensitive call graph data model | 561 | # Context-sensitive call graph data model base |
562 | 562 | ||
563 | class CallGraphModel(TreeModel): | 563 | class CallGraphModelBase(TreeModel): |
564 | 564 | ||
565 | def __init__(self, glb, parent=None): | 565 | def __init__(self, glb, parent=None): |
566 | super(CallGraphModel, self).__init__(glb, parent) | 566 | super(CallGraphModelBase, self).__init__(glb, parent) |
567 | |||
568 | def GetRoot(self): | ||
569 | return CallGraphRootItem(self.glb) | ||
570 | |||
571 | def columnCount(self, parent=None): | ||
572 | return 7 | ||
573 | |||
574 | def columnHeader(self, column): | ||
575 | headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Branch Count ", "Branch Count (%) "] | ||
576 | return headers[column] | ||
577 | |||
578 | def columnAlignment(self, column): | ||
579 | alignment = [ Qt.AlignLeft, Qt.AlignLeft, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight ] | ||
580 | return alignment[column] | ||
581 | 567 | ||
582 | def FindSelect(self, value, pattern, query): | 568 | def FindSelect(self, value, pattern, query): |
583 | if pattern: | 569 | if pattern: |
@@ -597,34 +583,7 @@ class CallGraphModel(TreeModel): | |||
597 | match = " GLOB '" + str(value) + "'" | 583 | match = " GLOB '" + str(value) + "'" |
598 | else: | 584 | else: |
599 | match = " = '" + str(value) + "'" | 585 | match = " = '" + str(value) + "'" |
600 | QueryExec(query, "SELECT call_path_id, comm_id, thread_id" | 586 | self.DoFindSelect(query, match) |
601 | " FROM calls" | ||
602 | " INNER JOIN call_paths ON calls.call_path_id = call_paths.id" | ||
603 | " INNER JOIN symbols ON call_paths.symbol_id = symbols.id" | ||
604 | " WHERE symbols.name" + match + | ||
605 | " GROUP BY comm_id, thread_id, call_path_id" | ||
606 | " ORDER BY comm_id, thread_id, call_path_id") | ||
607 | |||
608 | def FindPath(self, query): | ||
609 | # Turn the query result into a list of ids that the tree view can walk | ||
610 | # to open the tree at the right place. | ||
611 | ids = [] | ||
612 | parent_id = query.value(0) | ||
613 | while parent_id: | ||
614 | ids.insert(0, parent_id) | ||
615 | q2 = QSqlQuery(self.glb.db) | ||
616 | QueryExec(q2, "SELECT parent_id" | ||
617 | " FROM call_paths" | ||
618 | " WHERE id = " + str(parent_id)) | ||
619 | if not q2.next(): | ||
620 | break | ||
621 | parent_id = q2.value(0) | ||
622 | # The call path root is not used | ||
623 | if ids[0] == 1: | ||
624 | del ids[0] | ||
625 | ids.insert(0, query.value(2)) | ||
626 | ids.insert(0, query.value(1)) | ||
627 | return ids | ||
628 | 587 | ||
629 | def Found(self, query, found): | 588 | def Found(self, query, found): |
630 | if found: | 589 | if found: |
@@ -678,6 +637,57 @@ class CallGraphModel(TreeModel): | |||
678 | def FindDone(self, thread, callback, ids): | 637 | def FindDone(self, thread, callback, ids): |
679 | callback(ids) | 638 | callback(ids) |
680 | 639 | ||
640 | # Context-sensitive call graph data model | ||
641 | |||
642 | class CallGraphModel(CallGraphModelBase): | ||
643 | |||
644 | def __init__(self, glb, parent=None): | ||
645 | super(CallGraphModel, self).__init__(glb, parent) | ||
646 | |||
647 | def GetRoot(self): | ||
648 | return CallGraphRootItem(self.glb) | ||
649 | |||
650 | def columnCount(self, parent=None): | ||
651 | return 7 | ||
652 | |||
653 | def columnHeader(self, column): | ||
654 | headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Branch Count ", "Branch Count (%) "] | ||
655 | return headers[column] | ||
656 | |||
657 | def columnAlignment(self, column): | ||
658 | alignment = [ Qt.AlignLeft, Qt.AlignLeft, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight ] | ||
659 | return alignment[column] | ||
660 | |||
661 | def DoFindSelect(self, query, match): | ||
662 | QueryExec(query, "SELECT call_path_id, comm_id, thread_id" | ||
663 | " FROM calls" | ||
664 | " INNER JOIN call_paths ON calls.call_path_id = call_paths.id" | ||
665 | " INNER JOIN symbols ON call_paths.symbol_id = symbols.id" | ||
666 | " WHERE symbols.name" + match + | ||
667 | " GROUP BY comm_id, thread_id, call_path_id" | ||
668 | " ORDER BY comm_id, thread_id, call_path_id") | ||
669 | |||
670 | def FindPath(self, query): | ||
671 | # Turn the query result into a list of ids that the tree view can walk | ||
672 | # to open the tree at the right place. | ||
673 | ids = [] | ||
674 | parent_id = query.value(0) | ||
675 | while parent_id: | ||
676 | ids.insert(0, parent_id) | ||
677 | q2 = QSqlQuery(self.glb.db) | ||
678 | QueryExec(q2, "SELECT parent_id" | ||
679 | " FROM call_paths" | ||
680 | " WHERE id = " + str(parent_id)) | ||
681 | if not q2.next(): | ||
682 | break | ||
683 | parent_id = q2.value(0) | ||
684 | # The call path root is not used | ||
685 | if ids[0] == 1: | ||
686 | del ids[0] | ||
687 | ids.insert(0, query.value(2)) | ||
688 | ids.insert(0, query.value(1)) | ||
689 | return ids | ||
690 | |||
681 | # Vertical widget layout | 691 | # Vertical widget layout |
682 | 692 | ||
683 | class VBox(): | 693 | class VBox(): |