X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=lib%2Fringbuffer%2Fring_buffer_frontend.c;h=708bc6d39af56e50629b34f9e3c66c849d5f9c0c;hb=b6155a916c35bfa4c4e5d49c52072e12c3daebba;hp=42cf317a01d56482ae07401b8d1d8123b332a1d5;hpb=b63af41cb645dcf8513e997714e47fafcb4492b4;p=lttng-modules.git diff --git a/lib/ringbuffer/ring_buffer_frontend.c b/lib/ringbuffer/ring_buffer_frontend.c index 42cf317a..708bc6d3 100644 --- a/lib/ringbuffer/ring_buffer_frontend.c +++ b/lib/ringbuffer/ring_buffer_frontend.c @@ -900,6 +900,15 @@ int lib_ring_buffer_snapshot(struct lib_ring_buffer *buf, unsigned long consumed_cur, write_offset; int finalized; + /* + * First, ensure we perform a "final" flush onto the stream. This will + * ensure we create a packet of padding if we encounter an empty + * packet. This ensures the time-stamps right before the snapshot is + * used as end of packet timestamp. + */ + if (!buf->quiescent) + _lib_ring_buffer_switch_remote(buf, SWITCH_FLUSH); + retry: finalized = ACCESS_ONCE(buf->finalized); /* @@ -1289,7 +1298,8 @@ void lib_ring_buffer_print_errors(struct channel *chan, /* * lib_ring_buffer_switch_old_start: Populate old subbuffer header. * - * Only executed when the buffer is finalized, in SWITCH_FLUSH. + * Only executed by SWITCH_FLUSH, which can be issued while tracing is active + * or at buffer finalization (destroy). */ static void lib_ring_buffer_switch_old_start(struct lib_ring_buffer *buf, @@ -1480,12 +1490,14 @@ int lib_ring_buffer_try_switch_slow(enum switch_mode mode, unsigned long sb_index, commit_count; /* - * We are performing a SWITCH_FLUSH. At this stage, there are no - * concurrent writes into the buffer. + * We are performing a SWITCH_FLUSH. There may be concurrent + * writes into the buffer if e.g. invoked while performing a + * snapshot on an active trace. * - * The client does not save any header information. Don't - * switch empty subbuffer on finalize, because it is invalid to - * deliver a completely empty subbuffer. + * If the client does not save any header information (sub-buffer + * header size == 0), don't switch empty subbuffer on finalize, + * because it is invalid to deliver a completely empty + * subbuffer. */ if (!config->cb.subbuffer_header_size()) return -1;