The branch main has been updated by gnn:

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

commit eb1c0d74cbb99f329767b3d565ae57a3ec032bee
Author:     George V. Neville-Neil <[email protected]>
AuthorDate: 2026-01-05 11:40:12 +0000
Commit:     George V. Neville-Neil <[email protected]>
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()
 

Reply via email to