[lttng-dev] [RFC PATCH lttng-modules 07/10] Fix callstack context: write empty sequence if no stack trace
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Fri Mar 31 13:17:16 UTC 2017
The trace content needs to match the metadata, else the trace will be
corrupted.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
---
lttng-context-callstack.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/lttng-context-callstack.c b/lttng-context-callstack.c
index 3b7859e..57738be 100644
--- a/lttng-context-callstack.c
+++ b/lttng-context-callstack.c
@@ -156,8 +156,12 @@ size_t lttng_callstack_get_size(size_t offset, struct lttng_ctx_field *field,
/* do not write data if no space is available */
trace = stack_trace_context(field, ctx);
- if (!trace)
- return 0;
+ if (unlikely(!trace)) {
+ size += lib_ring_buffer_align(offset, lttng_alignof(unsigned int));
+ size += sizeof(unsigned int);
+ size += lib_ring_buffer_align(offset, lttng_alignof(unsigned long));
+ return size;
+ }
/* reset stack trace, no need to clear memory */
trace->nr_entries = 0;
@@ -191,8 +195,13 @@ void lttng_callstack_record(struct lttng_ctx_field *field,
struct stack_trace *trace = stack_trace_context(field, ctx);
unsigned int nr_seq_entries;
- if (!trace)
+ if (unlikely(!trace)) {
+ nr_seq_entries = 0;
+ lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned int));
+ chan->ops->event_write(ctx, &nr_seq_entries, sizeof(unsigned int));
+ lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned long));
return;
+ }
lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned int));
nr_seq_entries = trace->nr_entries;
if (trace->nr_entries == trace->max_entries)
--
2.1.4
More information about the lttng-dev
mailing list