[lttng-dev] [PATCH] Avoid using the heap for small strings with tracef/tracelog

Norbert Lange nolange79 at gmail.com
Thu May 20 08:20:46 EDT 2021


Am Mi., 19. Mai 2021 um 21:00 Uhr schrieb Mathieu Desnoyers
<mathieu.desnoyers at efficios.com>:
>
> ----- On May 19, 2021, at 12:56 PM, lttng-dev lttng-dev at lists.lttng.org wrote:
>
> > Try to use vsnprintf with a 512 Byte buffer on the Stack,
> > if that fails allocate a larger one.
>
> I agree with the approach.
>
> Can we move the hardcoded "512" to a #define within src/common/tracer.h ?
>
> Thanks,
>
> Mathieu
>
> >
> > Signed-off-by: Norbert Lange <nolange79 at gmail.com>
> > ---
> > liblttng-ust/tracef.c   | 13 ++++++++++---
> > liblttng-ust/tracelog.c | 12 +++++++++---
> > 2 files changed, 19 insertions(+), 6 deletions(-)
> >
> > diff --git a/liblttng-ust/tracef.c b/liblttng-ust/tracef.c
> > index ea98e43e..18c29e25 100644
> > --- a/liblttng-ust/tracef.c
> > +++ b/liblttng-ust/tracef.c
> > @@ -32,17 +32,24 @@
> > void _lttng_ust_tracef(const char *fmt, ...)
> > {
> >       va_list ap;
> > -     char *msg;
> > +     char local_buf[512];
> > +     char *msg = local_buf;
> >       int len;
> >
> >       va_start(ap, fmt);
> > -     len = vasprintf(&msg, fmt, ap);
> > +     len = vsnprintf(local_buf, sizeof(local_buf), fmt, ap);
> > +     if (len >= sizeof(local_buf)) {
> > +             msg = (char *)malloc(len + 1);
> > +             len = msg ? vsnprintf(msg, len + 1, fmt, ap) : -1;
> > +     }
> > +
> >       /* len does not include the final \0 */
> >       if (len < 0)
> >               goto end;
> >       __tracepoint_cb_lttng_ust_tracef___event(msg, len,
> >               LTTNG_UST_CALLER_IP());
> > -     free(msg);
> > end:
> > +     if (msg != local_buf)
> > +             free(msg);
> >       va_end(ap);
> > }
> > diff --git a/liblttng-ust/tracelog.c b/liblttng-ust/tracelog.c
> > index 65fc87ed..a5d110fa 100644
> > --- a/liblttng-ust/tracelog.c
> > +++ b/liblttng-ust/tracelog.c
> > @@ -35,19 +35,25 @@
> >                       const char *fmt, ...) \
> >       { \
> >               va_list ap; \
> > -             char *msg; \
> > +             char local_buf[512]; \
> > +             char *msg = local_buf; \
> >               int len; \
> >               \
> >               va_start(ap, fmt); \
> > -             len = vasprintf(&msg, fmt, ap); \
> > +             len = vsnprintf(local_buf, sizeof(local_buf), fmt, ap); \
> > +             if (len >= sizeof(local_buf)) { \
> > +                     msg = (char *)malloc(len + 1); \
> > +                     len = msg ? vsnprintf(msg, len + 1, fmt, ap) : -1; \
> > +             } \
> >               /* len does not include the final \0 */ \
> >               if (len < 0) \
> >                       goto end; \
> >               __tracepoint_cb_lttng_ust_tracelog___##level(file, \
> >                       line, func, msg, len, \
> >                       LTTNG_UST_CALLER_IP()); \
> > -             free(msg); \
> >       end: \
> > +             if (msg != local_buf) \
> > +                     free(msg); \
> >               va_end(ap); \
> >       }
> >
> > --
> > 2.30.2
> >
> > _______________________________________________
> > lttng-dev mailing list
> > lttng-dev at lists.lttng.org
> > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
>
> --
> Mathieu Desnoyers
> EfficiOS Inc.
> http://www.efficios.com

This patch was intended for 2.12, no src/common/tracer.h there.
Also this patch is brocken, as a va_list cant be iterated twice.


More information about the lttng-dev mailing list