On Thu, Aug 04, 2016 at 02:58:38PM -0700, Joe Stringer wrote: > To assist debugging pipelines when resubmit resource checks fail, print > the base_flow from the translation context. This base flow can then be > used from ofproto/trace to figure out which parts of the pipeline lead > to this translation error. > > As far as I can see, the "## __VA_ARGS__" trick is a GCC thing rather > than part of the C standard, but it successfully compiles on GCC 6.1.1, > Clang 3.8.1, and the compiler that Appveyor CI uses so it seems like it > is widely supported. > > Signed-off-by: Joe Stringer <j...@ovn.org>
It's a little extra-tricky. Any change you'd instead be willing to use ds_put_format() on the local 'ds' instead? Something like this: struct ds ds = DS_EMPTY_INITIALIZER; flow_format(&ds, &ctx->base_flow); ds_put_cstr(&ds, ": "); ds_put_format(&ds, __VA_LIST__); It might be slightly slower but this is not a fast path. > ofproto/ofproto-dpif-xlate.c | 21 ++++++++++++++------- > 1 file changed, 14 insertions(+), 7 deletions(-) > > diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c > index 393854e4bfc7..73ab3e558f9d 100644 > --- a/ofproto/ofproto-dpif-xlate.c > +++ b/ofproto/ofproto-dpif-xlate.c > @@ -627,13 +627,20 @@ xlate_report(struct xlate_ctx *ctx, const char *format, > ...) > > static struct vlog_rate_limit error_report_rl = VLOG_RATE_LIMIT_INIT(1, 5); > > -#define XLATE_REPORT_ERROR(CTX, ...) \ > - do { \ > - if (OVS_UNLIKELY((CTX)->xin->report_hook)) { \ > - xlate_report(CTX, __VA_ARGS__); \ > - } else { \ > - VLOG_ERR_RL(&error_report_rl, __VA_ARGS__); \ > - } \ > +#define XLATE_REORDER(LAST, DUMMY, ...) __VA_ARGS__, LAST > +#define XLATE_REPORT_ERROR(CTX, FMT, ...) \ > + do { \ > + if (OVS_UNLIKELY((CTX)->xin->report_hook)) { \ > + xlate_report(CTX, FMT, ## __VA_ARGS__); \ > + } else { \ > + struct ds ds = DS_EMPTY_INITIALIZER; \ > + \ > + flow_format(&ds, &ctx->base_flow); \ > + VLOG_ERR_RL(&error_report_rl, \ > + XLATE_REORDER(ds_cstr(&ds), dummy, \ > + FMT": %s", ## __VA_ARGS__)); \ > + ds_destroy(&ds); \ > + } \ > } while (0) > > static inline void > -- > 2.9.2 > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev