This is for two reasons. First, to avoid for the caller to create the
stream name. Second, on snprintf() error, we can't continue so put back
the reserved FDs and return an error.
We do that name creation now *before* the stream is created on the
application side so we don't have to release that object on error.
Only after that the stream is added to the list and the channel count
updated. This makes more sense and better handle the error path. Also,
this patch removes a XXX: statement which are always not cool on
production software :).
Signed-off-by: David Goulet <dgoulet@efficios.com>
+ /*
+ * Set the stream name before creating it. On error, we don't have to
+ * delete it on the tracer side.
+ */
+ ret = snprintf(stream->name, sizeof(stream->name), "%s_%u",
+ ua_chan->name, ua_chan->streams.count);
+ if (ret < 0) {
+ /* Without the stream name we can't continue using it. */
+ PERROR("snprintf UST create stream");
+ /* Just to make sure we never return -ENOENT. */
+ ret = -1;
+ goto error;
+ }
+
ret = ustctl_create_stream(app->sock, ua_chan->obj, &stream->obj);
if (ret < 0) {
lttng_fd_put(LTTNG_FD_APPS, 2);
ret = ustctl_create_stream(app->sock, ua_chan->obj, &stream->obj);
if (ret < 0) {
lttng_fd_put(LTTNG_FD_APPS, 2);
health_code_update(&health_thread_cmd);
health_code_update(&health_thread_cmd);
- /* Order is important */
+ /* Order is important this is why a list is used. */
cds_list_add_tail(&ustream->list, &ua_chan->streams.head);
cds_list_add_tail(&ustream->list, &ua_chan->streams.head);
- ret = snprintf(ustream->name, sizeof(ustream->name), "%s_%u",
- ua_chan->name, ua_chan->streams.count);
ua_chan->streams.count++;
ua_chan->streams.count++;
- if (ret < 0) {
- PERROR("asprintf UST create stream");
- /*
- * XXX what should we do here with the
- * stream ?
- */
- continue;
- }
DBG2("UST stream %d ready (handle: %d)", ua_chan->streams.count,
ustream->handle);
}
DBG2("UST stream %d ready (handle: %d)", ua_chan->streams.count,
ustream->handle);
}