qapi/gen: Add FOO.trace-events output module

We are going to generate trace events for QMP commands. We should
generate both trace_*() function calls and trace-events files listing
events for trace generator.

So, add an output module FOO.trace-events for each FOO schema module.

Since we're going to add trace events only to command marshallers,
make the trace-events output optional, so we don't generate so many
useless empty files.

Currently nobody set add_trace_events to True, so new functionality is
disabled. It will be enabled for QAPISchemaGenCommandVisitor
in a further commit.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-Id: <20220126161130.3240892-2-vsementsov@virtuozzo.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2022-01-26 17:11:24 +01:00 committed by Markus Armbruster
parent 7e7237cd2b
commit 4e86df1732

View File

@ -192,6 +192,11 @@ class QAPIGenH(QAPIGenC):
return guardend(self.fname) return guardend(self.fname)
class QAPIGenTrace(QAPIGen):
def _top(self) -> str:
return super()._top() + '# AUTOMATICALLY GENERATED, DO NOT MODIFY\n\n'
@contextmanager @contextmanager
def ifcontext(ifcond: QAPISchemaIfCond, *args: QAPIGenCCode) -> Iterator[None]: def ifcontext(ifcond: QAPISchemaIfCond, *args: QAPIGenCCode) -> Iterator[None]:
""" """
@ -244,15 +249,18 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
what: str, what: str,
user_blurb: str, user_blurb: str,
builtin_blurb: Optional[str], builtin_blurb: Optional[str],
pydoc: str): pydoc: str,
gen_tracing: bool = False):
self._prefix = prefix self._prefix = prefix
self._what = what self._what = what
self._user_blurb = user_blurb self._user_blurb = user_blurb
self._builtin_blurb = builtin_blurb self._builtin_blurb = builtin_blurb
self._pydoc = pydoc self._pydoc = pydoc
self._current_module: Optional[str] = None self._current_module: Optional[str] = None
self._module: Dict[str, Tuple[QAPIGenC, QAPIGenH]] = {} self._module: Dict[str, Tuple[QAPIGenC, QAPIGenH,
Optional[QAPIGenTrace]]] = {}
self._main_module: Optional[str] = None self._main_module: Optional[str] = None
self._gen_tracing = gen_tracing
@property @property
def _genc(self) -> QAPIGenC: def _genc(self) -> QAPIGenC:
@ -264,6 +272,14 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
assert self._current_module is not None assert self._current_module is not None
return self._module[self._current_module][1] return self._module[self._current_module][1]
@property
def _gen_trace_events(self) -> QAPIGenTrace:
assert self._gen_tracing
assert self._current_module is not None
gent = self._module[self._current_module][2]
assert gent is not None
return gent
@staticmethod @staticmethod
def _module_dirname(name: str) -> str: def _module_dirname(name: str) -> str:
if QAPISchemaModule.is_user_module(name): if QAPISchemaModule.is_user_module(name):
@ -293,7 +309,12 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
basename = self._module_filename(self._what, name) basename = self._module_filename(self._what, name)
genc = QAPIGenC(basename + '.c', blurb, self._pydoc) genc = QAPIGenC(basename + '.c', blurb, self._pydoc)
genh = QAPIGenH(basename + '.h', blurb, self._pydoc) genh = QAPIGenH(basename + '.h', blurb, self._pydoc)
self._module[name] = (genc, genh)
gent: Optional[QAPIGenTrace] = None
if self._gen_tracing:
gent = QAPIGenTrace(basename + '.trace-events')
self._module[name] = (genc, genh, gent)
self._current_module = name self._current_module = name
@contextmanager @contextmanager
@ -304,11 +325,13 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
self._current_module = old_module self._current_module = old_module
def write(self, output_dir: str, opt_builtins: bool = False) -> None: def write(self, output_dir: str, opt_builtins: bool = False) -> None:
for name, (genc, genh) in self._module.items(): for name, (genc, genh, gent) in self._module.items():
if QAPISchemaModule.is_builtin_module(name) and not opt_builtins: if QAPISchemaModule.is_builtin_module(name) and not opt_builtins:
continue continue
genc.write(output_dir) genc.write(output_dir)
genh.write(output_dir) genh.write(output_dir)
if gent is not None:
gent.write(output_dir)
def _begin_builtin_module(self) -> None: def _begin_builtin_module(self) -> None:
pass pass