diff options
Diffstat (limited to 'tools/perf/scripts/python/call-graph-from-sql.py')
| -rw-r--r-- | tools/perf/scripts/python/call-graph-from-sql.py | 90 |
1 files changed, 61 insertions, 29 deletions
diff --git a/tools/perf/scripts/python/call-graph-from-sql.py b/tools/perf/scripts/python/call-graph-from-sql.py index 65c18e351bc4..ada486048ad8 100644 --- a/tools/perf/scripts/python/call-graph-from-sql.py +++ b/tools/perf/scripts/python/call-graph-from-sql.py | |||
| @@ -201,42 +201,47 @@ class TreeItem(): | |||
| 201 | self.selectCalls() | 201 | self.selectCalls() |
| 202 | return self.child_count | 202 | return self.child_count |
| 203 | 203 | ||
| 204 | def columnCount(self): | 204 | def hasChildren(self): |
| 205 | return 7 | 205 | if not self.query_done: |
| 206 | 206 | return True | |
| 207 | def columnHeader(self, column): | 207 | return self.child_count > 0 |
| 208 | headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Branch Count ", "Branch Count (%) "] | ||
| 209 | return headers[column] | ||
| 210 | 208 | ||
| 211 | def getData(self, column): | 209 | def getData(self, column): |
| 212 | return self.data[column] | 210 | return self.data[column] |
| 213 | 211 | ||
| 212 | # Tree data model | ||
| 213 | |||
| 214 | class TreeModel(QAbstractItemModel): | 214 | class TreeModel(QAbstractItemModel): |
| 215 | 215 | ||
| 216 | def __init__(self, db, parent=None): | 216 | def __init__(self, root, parent=None): |
| 217 | super(TreeModel, self).__init__(parent) | 217 | super(TreeModel, self).__init__(parent) |
| 218 | self.db = db | 218 | self.root = root |
| 219 | self.root = TreeItem(db, 0, None) | 219 | self.last_row_read = 0 |
| 220 | 220 | ||
| 221 | def columnCount(self, parent): | 221 | def Item(self, parent): |
| 222 | return self.root.columnCount() | ||
| 223 | |||
| 224 | def rowCount(self, parent): | ||
| 225 | if parent.isValid(): | 222 | if parent.isValid(): |
| 226 | parent_item = parent.internalPointer() | 223 | return parent.internalPointer() |
| 227 | else: | 224 | else: |
| 228 | parent_item = self.root | 225 | return self.root |
| 229 | return parent_item.childCount() | 226 | |
| 227 | def rowCount(self, parent): | ||
| 228 | result = self.Item(parent).childCount() | ||
| 229 | if result < 0: | ||
| 230 | result = 0 | ||
| 231 | self.dataChanged.emit(parent, parent) | ||
| 232 | return result | ||
| 233 | |||
| 234 | def hasChildren(self, parent): | ||
| 235 | return self.Item(parent).hasChildren() | ||
| 230 | 236 | ||
| 231 | def headerData(self, section, orientation, role): | 237 | def headerData(self, section, orientation, role): |
| 232 | if role == Qt.TextAlignmentRole: | 238 | if role == Qt.TextAlignmentRole: |
| 233 | if section > 1: | 239 | return self.columnAlignment(section) |
| 234 | return Qt.AlignRight | ||
| 235 | if role != Qt.DisplayRole: | 240 | if role != Qt.DisplayRole: |
| 236 | return None | 241 | return None |
| 237 | if orientation != Qt.Horizontal: | 242 | if orientation != Qt.Horizontal: |
| 238 | return None | 243 | return None |
| 239 | return self.root.columnHeader(section) | 244 | return self.columnHeader(section) |
| 240 | 245 | ||
| 241 | def parent(self, child): | 246 | def parent(self, child): |
| 242 | child_item = child.internalPointer() | 247 | child_item = child.internalPointer() |
| @@ -246,21 +251,48 @@ class TreeModel(QAbstractItemModel): | |||
| 246 | return self.createIndex(parent_item.getRow(), 0, parent_item) | 251 | return self.createIndex(parent_item.getRow(), 0, parent_item) |
| 247 | 252 | ||
| 248 | def index(self, row, column, parent): | 253 | def index(self, row, column, parent): |
| 249 | if parent.isValid(): | 254 | child_item = self.Item(parent).getChildItem(row) |
| 250 | parent_item = parent.internalPointer() | ||
| 251 | else: | ||
| 252 | parent_item = self.root | ||
| 253 | child_item = parent_item.getChildItem(row) | ||
| 254 | return self.createIndex(row, column, child_item) | 255 | return self.createIndex(row, column, child_item) |
| 255 | 256 | ||
| 257 | def DisplayData(self, item, index): | ||
| 258 | return item.getData(index.column()) | ||
| 259 | |||
| 260 | def columnAlignment(self, column): | ||
| 261 | return Qt.AlignLeft | ||
| 262 | |||
| 263 | def columnFont(self, column): | ||
| 264 | return None | ||
| 265 | |||
| 256 | def data(self, index, role): | 266 | def data(self, index, role): |
| 257 | if role == Qt.TextAlignmentRole: | 267 | if role == Qt.TextAlignmentRole: |
| 258 | if index.column() > 1: | 268 | return self.columnAlignment(index.column()) |
| 259 | return Qt.AlignRight | 269 | if role == Qt.FontRole: |
| 270 | return self.columnFont(index.column()) | ||
| 260 | if role != Qt.DisplayRole: | 271 | if role != Qt.DisplayRole: |
| 261 | return None | 272 | return None |
| 262 | index_item = index.internalPointer() | 273 | item = index.internalPointer() |
| 263 | return index_item.getData(index.column()) | 274 | return self.DisplayData(item, index) |
| 275 | |||
| 276 | # Context-sensitive call graph data model | ||
| 277 | |||
| 278 | class CallGraphModel(TreeModel): | ||
| 279 | |||
| 280 | def __init__(self, glb, parent=None): | ||
| 281 | super(CallGraphModel, self).__init__(TreeItem(glb.db, 0, None), parent) | ||
| 282 | self.glb = glb | ||
| 283 | |||
| 284 | def columnCount(self, parent=None): | ||
| 285 | return 7 | ||
| 286 | |||
| 287 | def columnHeader(self, column): | ||
| 288 | headers = ["Call Path", "Object", "Count ", "Time (ns) ", "Time (%) ", "Branch Count ", "Branch Count (%) "] | ||
| 289 | return headers[column] | ||
| 290 | |||
| 291 | def columnAlignment(self, column): | ||
| 292 | alignment = [ Qt.AlignLeft, Qt.AlignLeft, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight, Qt.AlignRight ] | ||
| 293 | return alignment[column] | ||
| 294 | |||
| 295 | # Main window | ||
| 264 | 296 | ||
| 265 | class MainWindow(QMainWindow): | 297 | class MainWindow(QMainWindow): |
| 266 | 298 | ||
| @@ -275,7 +307,7 @@ class MainWindow(QMainWindow): | |||
| 275 | self.setWindowIcon(self.style().standardIcon(QStyle.SP_ComputerIcon)) | 307 | self.setWindowIcon(self.style().standardIcon(QStyle.SP_ComputerIcon)) |
| 276 | self.setMinimumSize(200, 100) | 308 | self.setMinimumSize(200, 100) |
| 277 | 309 | ||
| 278 | self.model = TreeModel(glb.db) | 310 | self.model = CallGraphModel(glb) |
| 279 | 311 | ||
| 280 | self.view = QTreeView() | 312 | self.view = QTreeView() |
| 281 | self.view.setModel(self.model) | 313 | self.view.setModel(self.model) |
