git: eb1c0d74cbb9 - main - Convert fully to Python 3. Remove licence text, only keep
Date: Mon, 05 Jan 2026 11:48:11 UTC
The branch main has been updated by gnn:
URL: https://cgit.FreeBSD.org/src/commit/?id=eb1c0d74cbb99f329767b3d565ae57a3ec032bee
commit eb1c0d74cbb99f329767b3d565ae57a3ec032bee
Author: George V. Neville-Neil <gnn@FreeBSD.org>
AuthorDate: 2026-01-05 11:40:12 +0000
Commit: George V. Neville-Neil <gnn@FreeBSD.org>
CommitDate: 2026-01-05 11:40:12 +0000
Convert fully to Python 3. Remove licence text, only keep
SPDX.
Update to use argparse rather than OptionParser (now deprecated).
---
tools/test/hwpmc/pmctest.py | 73 ++++++++++++---------------------------------
1 file changed, 19 insertions(+), 54 deletions(-)
diff --git a/tools/test/hwpmc/pmctest.py b/tools/test/hwpmc/pmctest.py
index 4bd4910b00a9..bda2f3500d7d 100755
--- a/tools/test/hwpmc/pmctest.py
+++ b/tools/test/hwpmc/pmctest.py
@@ -2,37 +2,9 @@
# SPDX-License-Identifier: BSD-3-Clause
#
# Copyright (c) 2012, Neville-Neil Consulting
+# Copyright (c) 2026, George V. Neville-Neil
# All rights reserved.
#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-#
-# Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# Neither the name of Neville-Neil Consulting nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# Author: George V. Neville-Neil
-#
# Description: A program to run a simple program against every available
# pmc counter present in a system.
@@ -44,17 +16,19 @@
# This should result in ls being run with every available counter
# and the system should neither lock up nor panic.
#
-# The default is to wait after each counter is tested. Since the
+# The default is not to wait after each counter is tested. Since the
# prompt would go to stdout you won't see it, just press return
# to continue or Ctrl-D to stop.
-import sys
import subprocess
from subprocess import PIPE
+import argparse
-# Use input() for Python version 3
-if sys.version_info[0] == 3:
- raw_input = input
+def gather_counters():
+ """Run program and return output as array of lines."""
+ result = subprocess.run("pmccontrol -L", shell=True, capture_output=True, text=True)
+ tabbed = result.stdout.strip().split('\n')
+ return [line.replace('\t', '') for line in tabbed]
# A list of strings that are not really counters, just
# name tags that are output by pmccontrol -L
@@ -62,37 +36,28 @@ notcounter = ["IAF", "IAP", "TSC", "UNC", "UCF", "UCP", "SOFT" ]
def main():
- from optparse import OptionParser
-
- parser = OptionParser()
- parser.add_option("-p", "--program", dest="program",
- help="program to execute")
- parser.add_option("-w", "--wait", action="store_true", dest="wait",
- default=True, help="wait after each execution")
+ parser = argparse.ArgumentParser(description='Exercise a program under hwpmc')
+ parser.add_argument('--program', type=str, required=True, help='target program')
+ parser.add_argument('--wait', action='store_true', help='Wait after each counter.')
- (options, args) = parser.parse_args()
+ args = parser.parse_args()
- if (options.program == None):
- print("specify program, such as ls, with -p/--program")
- sys.exit()
-
- p = subprocess.Popen(["pmccontrol", "-L"], stdout=PIPE)
- counters = p.communicate()[0]
+ counters = gather_counters()
if len(counters) <= 0:
print("no counters found")
sys.exit()
- for counter in counters.split():
+ for counter in counters:
if counter in notcounter:
continue
- p = subprocess.Popen(["pmcstat", "-p", counter, options.program],
- stdout=PIPE)
- result = p.communicate()[0]
+ p = subprocess.Popen(["pmcstat", "-p", counter, args.program],
+ text=True, stderr=PIPE)
+ result = p.communicate()[1]
print(result)
- if (options.wait == True):
+ if (args.wait == True):
try:
- value = raw_input("next?")
+ value = input("Waitin for you to press ENTER")
except EOFError:
sys.exit()