[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