qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Mads Ynddal <mads@ynddal.dk>
To: qemu-devel@nongnu.org
Cc: John Snow <jsnow@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Cleber Rosa <crosa@redhat.com>,
	Mads Ynddal <m.ynddal@samsung.com>
Subject: [PATCH 5/9] simpletrace: Changed Analyzer class to become context-manager
Date: Tue, 21 Feb 2023 10:01:00 +0100	[thread overview]
Message-ID: <20230221090104.86103-6-mads@ynddal.dk> (raw)
In-Reply-To: <20230221090104.86103-1-mads@ynddal.dk>

From: Mads Ynddal <m.ynddal@samsung.com>

Instead of explicitly calling `begin` and `end`, we can change the class
to use the context-manager paradigm. This is mostly a styling choice,
used in modern Python code. But it also allows for more advanced analyzers
to handle exceptions gracefully in the `__exit__` method (not
demonstrated here).

Signed-off-by: Mads Ynddal <m.ynddal@samsung.com>
---
 scripts/simpletrace.py | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/scripts/simpletrace.py b/scripts/simpletrace.py
index 7444a6e090..01bd47a130 100755
--- a/scripts/simpletrace.py
+++ b/scripts/simpletrace.py
@@ -121,12 +121,12 @@ def read_trace_records(event_mapping, event_id_to_name, fobj):
 
             yield rec
 
-class Analyzer(object):
+class Analyzer:
     """A trace file analyzer which processes trace records.
 
-    An analyzer can be passed to run() or process().  The begin() method is
-    invoked, then each trace record is processed, and finally the end() method
-    is invoked.
+    An analyzer can be passed to run() or process().  The __enter__() method is
+    invoked when opening the analyzer using the `with` statement, then each trace
+    record is processed, and finally the __exit__() method is invoked.
 
     If a method matching a trace event name exists, it is invoked to process
     that trace record.  Otherwise the catchall() method is invoked.
@@ -152,19 +152,19 @@ def runstate_set(self, timestamp, pid, new_state):
           ...
     """
 
-    def begin(self):
+    def __enter__(self):
         """Called at the start of the trace."""
-        pass
+        return self
 
     def catchall(self, event, rec):
         """Called if no specific method for processing a trace event has been found."""
         pass
 
-    def end(self):
+    def __exit__(self, _type, value, traceback):
         """Called at the end of the trace."""
         pass
 
-def process(events, log, analyzer, read_header=True):
+def process(events, log, analyzer_class, read_header=True):
     """Invoke an analyzer on each event in a log."""
     if read_header:
         read_trace_header(log)
@@ -203,15 +203,15 @@ def build_fn(analyzer, event):
             # Just arguments, no timestamp or pid
             return lambda _, rec: fn(*rec[3:3 + event_argcount])
 
-    analyzer.begin()
-    fn_cache = {}
-    for rec in read_trace_records(event_mapping, event_id_to_name, log):
-        event_num = rec[0]
-        event = event_mapping[event_num]
-        if event_num not in fn_cache:
-            fn_cache[event_num] = build_fn(analyzer, event)
-        fn_cache[event_num](event, rec)
-    analyzer.end()
+    with analyzer_class() as analyzer:
+        fn_cache = {}
+        for rec in read_trace_records(event_mapping, event_id_to_name, log):
+            event_num = rec[0]
+            event = event_mapping[event_num]
+            if event_num not in fn_cache:
+                fn_cache[event_num] = build_fn(analyzer, event)
+            fn_cache[event_num](event, rec)
+
 
 def run(analyzer):
     """Execute an analyzer on a trace file given on the command-line.
@@ -254,4 +254,4 @@ def catchall(self, event, rec):
                 i += 1
             print(' '.join(fields))
 
-    run(Formatter())
+    run(Formatter)
-- 
2.38.1



  parent reply	other threads:[~2023-02-21  9:02 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-21  9:00 [PATCH 0/9] simpletrace: refactor and general improvements Mads Ynddal
2023-02-21  9:00 ` [PATCH 1/9] simpletrace: Improve parsing of sys.argv; fix files never closed Mads Ynddal
2023-02-21  9:00 ` [PATCH 2/9] simpletrace: Annotate magic constants from QEMU code Mads Ynddal
2023-02-21  9:00 ` [PATCH 3/9] simpletrace: changed naming of edict and idtoname to improve readability Mads Ynddal
2023-02-21  9:10   ` Philippe Mathieu-Daudé
2023-02-21  9:00 ` [PATCH 4/9] simpletrace: update code for Python 3.11 Mads Ynddal
2023-02-21  9:01 ` Mads Ynddal [this message]
2023-02-21  9:01 ` [PATCH 6/9] simpletrace: Simplify construction of tracing methods Mads Ynddal
2023-02-21  9:01 ` [PATCH 7/9] simpletrace: Improved error handling on struct unpack Mads Ynddal
2023-02-21  9:01 ` [PATCH 8/9] simpletrace: define exception and add handling Mads Ynddal
2023-02-21  9:12   ` Philippe Mathieu-Daudé
2023-02-21  9:01 ` [PATCH 9/9] simpletrace: Refactor to separate responsibilities Mads Ynddal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230221090104.86103-6-mads@ynddal.dk \
    --to=mads@ynddal.dk \
    --cc=crosa@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=m.ynddal@samsung.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).