The metadata fd was not emptying all the buffers on POLLHUP | POLLERR.
This patch makes the read subbuffer operation, for hung up metadata fd,
loop until the returned len is a negative value. For user space tracing,
-EAGAIN is returned and -ENODATA for the kernel tracer.
We also fixes another issue where an error returned (not -EAGAIN) by the
read subbuffer function call was stopping the thread. Now, the fd is
removed from the poll set, the stream is freed and the thread continues.
Fixes #378
Signed-off-by: David Goulet <dgoulet@efficios.com>
lttng_ustconsumer_on_stream_hangup(stream);
/* We just flushed the stream now read it. */
- len = ctx->on_buffer_ready(stream, ctx);
- /* It's ok to have an unavailable sub-buffer */
- if (len < 0 && len != -EAGAIN) {
- rcu_read_unlock();
- goto end;
- }
+ do {
+ len = ctx->on_buffer_ready(stream, ctx);
+ /*
+ * We don't check the return value here since if we get
+ * a negative len, it means an error occured thus we
+ * simply remove it from the poll set and free the
+ * stream.
+ */
+ } while (len > 0);
}
lttng_poll_del(&events, stream->wait_fd);