git: 7e8ed296e120 - main - schedgraph.py: port to Python 3

From: Andriy Gapon <avg_at_FreeBSD.org>
Date: Tue, 11 Jan 2022 13:36:48 UTC
The branch main has been updated by avg:

URL: https://cgit.FreeBSD.org/src/commit/?id=7e8ed296e120a57211d377102fa27dd9411d0fbd

commit 7e8ed296e120a57211d377102fa27dd9411d0fbd
Author:     Andriy Gapon <avg@FreeBSD.org>
AuthorDate: 2022-01-11 13:31:45 +0000
Commit:     Andriy Gapon <avg@FreeBSD.org>
CommitDate: 2022-01-11 13:32:39 +0000

    schedgraph.py: port to Python 3
    
    The change does not preserve compatibility with Python 2.7.
    
    MFC after:      4 weeks
    Differential Revision:  https://reviews.freebsd.org/D33626
---
 tools/sched/schedgraph.py | 42 ++++++++++++++++++++++--------------------
 1 file changed, 22 insertions(+), 20 deletions(-)

diff --git a/tools/sched/schedgraph.py b/tools/sched/schedgraph.py
index 6d8a4b9ada14..bfd4339f6633 100644
--- a/tools/sched/schedgraph.py
+++ b/tools/sched/schedgraph.py
@@ -30,11 +30,13 @@ from __future__ import print_function
 import sys
 import re
 import random
-from Tkinter import *
+from operator import attrgetter, itemgetter
+from functools import total_ordering
+from tkinter import *
 
 # To use:
 # - Install the ports/x11-toolkits/py-tkinter package; e.g.
-#	portinstall x11-toolkits/py-tkinter package
+#	pkg install x11-toolkits/py-tkinter
 # - Add KTR_SCHED to KTR_COMPILE and KTR_MASK in your KERNCONF; e.g.
 #	options 	KTR
 #	options 	KTR_ENTRIES=32768
@@ -55,6 +57,8 @@ from Tkinter import *
 #   while the workload is still running is to avoid wasting log entries on
 #   "idle" time at the end.
 # - Dump the trace to a file: 'ktrdump -ct > ktr.out'
+# - Alternatively, use schedgraph.d script in this directory for getting
+#   the trace data by means of DTrace.  See the script for details.
 # - Run the python script: 'python schedgraph.py ktr.out' optionally provide
 #   your cpu frequency in ghz: 'python schedgraph.py ktr.out 2.4'
 #
@@ -444,10 +448,6 @@ class SourceConfigure(Toplevel):
 		for item in self.sconfig:
 			item.uncheck()
 
-# Reverse compare of second member of the tuple
-def cmp_counts(x, y):
-	return y[1] - x[1]
-
 class SourceStats(Toplevel):
 	def __init__(self, source):
 		self.source = source
@@ -473,7 +473,7 @@ class SourceStats(Toplevel):
 		for k, v in eventtypes.iteritems():
 			(c, d) = v
 			events.append((k, c, d))
-		events.sort(cmp=cmp_counts)
+		events.sort(key=itemgetter(1), reverse=True)
 
 		ypos = 0
 		for event in events:
@@ -793,10 +793,8 @@ class PadEvent(StateEvent):
 		Event.draw(self, canvas, xpos, ypos, None)
 		return (xpos + delta)
 
-# Sort function for start y address
-def source_cmp_start(x, y):
-	return x.y - y.y
 
+@total_ordering
 class EventSource:
 	def __init__(self, group, id):
 		self.name = id
@@ -808,12 +806,16 @@ class EventSource:
 		self.hidden = 0
 		self.tag = group + id
 
-	def __cmp__(self, other):
-		if (other == None):
-			return -1
-		if (self.group == other.group):
-			return cmp(self.name, other.name)
-		return cmp(self.group, other.group)
+	def __lt__(self, other):
+		if other is None:
+			return False
+		return (self.group < other.group or
+				self.group == other.group and self.name < other.name)
+
+	def __eq__(self, other):
+		if other is None:
+			return False
+		return self.group == other.group and self.name == other.name
 
 	# It is much faster to append items to a list then to insert them
 	# at the beginning.  As a result, we add events in reverse order
@@ -1478,7 +1480,7 @@ class SchedGraph(Frame):
 	# expensive due to python's canvas.move().
 	#
 	def sourceshowlist(self, srclist):
-		srclist.sort(cmp=source_cmp_start)
+		srclist.sort(key=attrgetter('y'))
 		startsize = []
 		for source in srclist:
 			if (source.hidden == 0):
@@ -1486,7 +1488,7 @@ class SchedGraph(Frame):
 			startsize.append((self.sourcepicky(source),
 			    self.sourcesize(source)))
 
-		sources.sort(cmp=source_cmp_start, reverse=True)
+		sources.sort(key=attrgetter('y'), reverse=True)
 		self.status.startup("Updating display...");
 		for source in sources:
 			if (source.hidden == 1):
@@ -1516,8 +1518,8 @@ class SchedGraph(Frame):
 	# expensive due to python's canvas.move().
 	#
 	def sourcehidelist(self, srclist):
-		srclist.sort(cmp=source_cmp_start)
-		sources.sort(cmp=source_cmp_start)
+		srclist.sort(key=attrgetter('y'))
+		sources.sort(key=attrgetter('y'))
 		startsize = []
 		off = len(sources) * 100
 		self.status.startup("Updating display...");