mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
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:
committed by
Stefan Hajnoczi
parent
02d4a4a674
commit
809caa0d40
@@ -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)
|
||||
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user