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:
parent
7e7237cd2b
commit
4e86df1732
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user