* this function.
*/
static
-void delete_ust_app_stream(int sock, struct ltt_ust_stream *stream)
+void delete_ust_app_stream(int sock, struct ust_app_stream *stream)
{
if (stream->obj) {
ustctl_release_object(sock, stream->obj);
struct lttng_ht_iter iter;
struct ust_app_event *ua_event;
struct ust_app_ctx *ua_ctx;
- struct ltt_ust_stream *stream, *stmp;
+ struct ust_app_stream *stream, *stmp;
/* Wipe stream */
cds_list_for_each_entry_safe(stream, stmp, &ua_chan->streams.head, list) {
/* Copy attributes */
if (attr) {
- memcpy(&ua_chan->attr, attr, sizeof(ua_chan->attr));
+ /* Translate from lttng_ust_channel to lttng_ust_channel_attr.*/
+ ua_chan->attr.subbuf_size = attr->subbuf_size;
+ ua_chan->attr.num_subbuf = attr->num_subbuf;
+ ua_chan->attr.overwrite = attr->overwrite;
+ ua_chan->attr.switch_timer_interval = attr->switch_timer_interval;
+ ua_chan->attr.read_timer_interval = attr->read_timer_interval;
+ ua_chan->attr.output = attr->output;
}
DBG3("UST app channel %s allocated", ua_chan->name);
return NULL;
}
+/*
+ * Allocate and initialize a UST app stream.
+ *
+ * Return newly allocated stream pointer or NULL on error.
+ */
+static struct ust_app_stream *alloc_ust_app_stream(void)
+{
+ struct ust_app_stream *stream = NULL;
+
+ stream = zmalloc(sizeof(*stream));
+ if (stream == NULL) {
+ PERROR("zmalloc ust app stream");
+ goto error;
+ }
+
+ /* Zero could be a valid value for a handle so flag it to -1. */
+ stream->handle = -1;
+
+error:
+ return stream;
+}
+
/*
* Alloc new UST app event.
*/
* On error, return a negative value.
*/
static int create_ust_stream(struct ust_app *app,
- struct ust_app_channel *ua_chan, struct ltt_ust_stream *stream)
+ struct ust_app_channel *ua_chan, struct ust_app_stream *stream)
{
int ret;
goto error;
}
+ /*
+ * 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);
/* Indicates that there is no more stream for that channel. */
- if (ret != -ENOENT) {
+ if (ret != -LTTNG_UST_ERR_NOENT) {
ERR("UST create metadata stream failed (ret: %d)", ret);
}
goto error;
health_code_update(&health_thread_cmd);
- /* TODO: remove cast and use lttng-ust-abi.h */
-
/* We are going to receive 2 fds, we need to reserve them. */
ret = lttng_fd_get(LTTNG_FD_APPS, 2);
if (ret < 0) {
health_code_update(&health_thread_cmd);
- ret = ustctl_create_channel(app->sock, ua_sess->handle,
- (struct lttng_ust_channel_attr *)&ua_chan->attr, &ua_chan->obj);
+ ret = ustctl_create_channel(app->sock, ua_sess->handle, &ua_chan->attr,
+ &ua_chan->obj);
if (ret < 0) {
ERR("Creating channel %s for app (pid: %d, sock: %d) "
"and session handle %d with ret %d",
struct lttng_ht_iter iter;
struct ust_app_session *ua_sess;
struct ust_app_channel *ua_chan;
- struct ltt_ust_stream *ustream;
+ struct ust_app_stream *ustream;
struct consumer_socket *socket;
DBG("Starting tracing for ust app pid %d", app->pid);
/* Create all streams */
while (1) {
/* Create UST stream */
- ustream = zmalloc(sizeof(*ustream));
+ ustream = alloc_ust_app_stream();
if (ustream == NULL) {
- PERROR("zmalloc ust stream");
goto error_rcu_unlock;
}
if (ret < 0) {
/* Free unused memory after this point. */
free(ustream);
- if (ret == -ENOENT) {
+ if (ret == -LTTNG_UST_ERR_NOENT) {
/* Got all streams. Continue normal execution. */
break;
}
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);
- ret = snprintf(ustream->name, sizeof(ustream->name), "%s_%u",
- ua_chan->name, 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);
}