tracetool: add CHECK_TRACE_EVENT_GET_STATE

Add a new attribute CHECK_TRACE_EVENT_GET_STATE to the backends.
When present and True, the code generated by the generate function
is wrapped in a conditional that checks whether the event is enabled;
this removes the need for repeating the same conditional in multiple
backends.

Signed-off-by: Tanish Desai <tanishdesai37@gmail.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-ID: <20250929154938.594389-7-pbonzini@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Tanish Desai
2025-10-01 11:22:07 -04:00
committed by Stefan Hajnoczi
parent 02d4a4a674
commit 809caa0d40
2 changed files with 35 additions and 15 deletions
+27 -12
View File
@@ -19,11 +19,15 @@ All backends must generate their contents through the 'tracetool.out' routine.
Backend attributes
------------------
========= ====================================================================
Attribute Description
========= ====================================================================
PUBLIC If exists and is set to 'True', the backend is considered "public".
========= ====================================================================
=========================== ====================================================
Attribute Description
=========================== ====================================================
PUBLIC If exists and is set to 'True', the backend is
considered "public".
CHECK_TRACE_EVENT_GET_STATE If exists and is set to 'True', the backend-specific
code inside the tracepoint is emitted within an
``if trace_event_get_state()`` conditional.
=========================== ====================================================
Backend functions
@@ -101,22 +105,33 @@ class Wrapper:
def __init__(self, backends, format):
self._backends = [backend.replace("-", "_") for backend in backends]
self._format = format.replace("-", "_")
self.check_trace_event_get_state = False
for backend in self._backends:
assert exists(backend)
assert tracetool.format.exists(self._format)
for backend in self.backend_modules():
check_trace_event_get_state = getattr(backend, "CHECK_TRACE_EVENT_GET_STATE", False)
self.check_trace_event_get_state = self.check_trace_event_get_state or check_trace_event_get_state
def _run_function(self, name, *args, **kwargs):
def backend_modules(self):
for backend in self._backends:
func = tracetool.try_import("tracetool.backend." + backend,
name % self._format, None)[1]
if func is not None:
func(*args, **kwargs)
module = tracetool.try_import("tracetool.backend." + backend)[1]
if module is not None:
yield module
def _run_function(self, name, *args, check_trace_event_get_state=None, **kwargs):
for backend in self.backend_modules():
func = getattr(backend, name % self._format, None)
if func is not None and \
(check_trace_event_get_state is None or
check_trace_event_get_state == getattr(backend, 'CHECK_TRACE_EVENT_GET_STATE', False)):
func(*args, **kwargs)
def generate_begin(self, events, group):
self._run_function("generate_%s_begin", events, group)
def generate(self, event, group):
self._run_function("generate_%s", event, group)
def generate(self, event, group, check_trace_event_get_state=None):
self._run_function("generate_%s", event, group, check_trace_event_get_state=check_trace_event_get_state)
def generate_backend_dstate(self, event, group):
self._run_function("generate_%s_backend_dstate", event, group)
+8 -3
View File
@@ -55,7 +55,6 @@ def generate(events, backend, group):
out(' false)')
# tracer without checks
out('',
'static inline void %(api)s(%(args)s)',
'{',
@@ -63,11 +62,17 @@ def generate(events, backend, group):
args=e.args)
if "disable" not in e.properties:
backend.generate(e, group)
backend.generate(e, group, check_trace_event_get_state=False)
if backend.check_trace_event_get_state:
event_id = 'TRACE_' + e.name.upper()
cond = "trace_event_get_state(%s)" % event_id
out(' if (%(cond)s) {',
cond=cond)
backend.generate(e, group, check_trace_event_get_state=True)
out(' }')
out('}')
backend.generate_end(events, group)
out('#endif /* TRACE_%s_GENERATED_TRACERS_H */' % group.upper())