On Thu, 30 Jan 2025 14:43:38 +0100 Cédric Le Goater <c...@redhat.com> wrote:
> Depending on the configuration, a passthrough device may produce > recurring DMA mapping errors at runtime and produce a lot of > output. It is useful to report only once. > > Cc: Markus Armbruster <arm...@redhat.com> > Signed-off-by: Cédric Le Goater <c...@redhat.com> > --- > include/qapi/error.h | 5 +++++ > util/error.c | 9 +++++++++ > 2 files changed, 14 insertions(+) > > diff --git a/include/qapi/error.h b/include/qapi/error.h > index > 71f8fb2c50eee9a544992d0c05263c9793956fe1..b6ea274882b9788b64d4bb213c3458d7c674a881 > 100644 > --- a/include/qapi/error.h > +++ b/include/qapi/error.h > @@ -448,6 +448,11 @@ void error_free_or_abort(Error **errp); > */ > void warn_report_err(Error *err); > > +/* > + * Convenience function to call warn_report_err() once. > + */ > +void warn_report_once_err(Error *err); > + Turning it into a macro would do what you want: #define warn_report_once_err(err) ({ \ static bool print_once_; \ if (!print_once_) { \ warn_report_err(err); \ print_once_ = true; \ } \ }) So long as we only want once per call site and not once per object, which would pull in something like warn_report_once_cond(). Thanks, Alex > /* > * Convenience function to error_report() and free @err. > * The report includes hints added with error_append_hint(). > diff --git a/util/error.c b/util/error.c > index > e5e247209a9e0796074a9794f5598325f22f8d35..b8a211cccaa609a93091b86316144a0ad0a02662 > 100644 > --- a/util/error.c > +++ b/util/error.c > @@ -247,6 +247,15 @@ void warn_report_err(Error *err) > error_free(err); > } > > +void warn_report_once_err(Error *err) > +{ > + static bool print_once_; > + if (!print_once_) { > + warn_report_err(err); > + print_once_ = true; > + } > +} > + > void error_reportf_err(Error *err, const char *fmt, ...) > { > va_list ap;