callstack context: use delimiter when stack is incomplete
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 24 Oct 2015 08:17:44 +0000 (04:17 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 11 Jun 2018 18:39:07 +0000 (14:39 -0400)
Reverse the delimiter logic so we only consume trace space and pollute
the user output when the stack is incomplete.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
lttng-context-callstack.c

index d95cbc2eef3f7117f0fcb38508ff173106f9fadf..6bfe794c2d58725b91a714516b77261ddd834385 100644 (file)
@@ -159,10 +159,22 @@ size_t lttng_callstack_get_size(size_t offset, struct lttng_ctx_field *field,
 
        /* do the real work and reserve space */
        cs_types[fdata->mode].save_func(trace);
+       /*
+        * Remove final ULONG_MAX delimiter. If we cannot find it, add
+        * our own marker to show that the stack is incomplete. This is
+        * more compact for a trace.
+        */
+       if (trace->nr_entries > 0
+                       && trace->entries[trace->nr_entries - 1] == ULONG_MAX) {
+               trace->nr_entries--;
+       }
        size += lib_ring_buffer_align(offset, lttng_alignof(unsigned int));
        size += sizeof(unsigned int);
        size += lib_ring_buffer_align(offset, lttng_alignof(unsigned long));
        size += sizeof(unsigned long) * trace->nr_entries;
+       /* Add our own ULONG_MAX delimiter to show incomplete stack. */
+       if (trace->nr_entries == trace->max_entries)
+               size += sizeof(unsigned long);
        return size;
 }
 
@@ -172,14 +184,24 @@ void lttng_callstack_record(struct lttng_ctx_field *field,
                            struct lttng_channel *chan)
 {
        struct stack_trace *trace = stack_trace_context(field, ctx);
+       unsigned int nr_seq_entries;
 
        if (!trace)
                return;
        lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned int));
-       chan->ops->event_write(ctx, &trace->nr_entries, sizeof(unsigned int));
+       nr_seq_entries = trace->nr_entries;
+       if (trace->nr_entries == trace->max_entries)
+               nr_seq_entries++;
+       chan->ops->event_write(ctx, &nr_seq_entries, sizeof(unsigned int));
        lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned long));
        chan->ops->event_write(ctx, trace->entries,
                        sizeof(unsigned long) * trace->nr_entries);
+       /* Add our own ULONG_MAX delimiter to show incomplete stack. */
+       if (trace->nr_entries == trace->max_entries) {
+               unsigned long delim = ULONG_MAX;
+
+               chan->ops->event_write(ctx, &delim, sizeof(unsigned long));
+       }
 }
 
 static
This page took 0.026687 seconds and 4 git commands to generate.