X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-app.c;h=fc744fc027cd376c0004431c6303136914d41254;hp=d1fa0d09cb2b04d75b3419cd6fa969a602253eb0;hb=aa3514e96f12c13f681a81ea275dc51dd63473c8;hpb=98f595d4c5972c980b6e5882ca199b4cc6c84abc diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index d1fa0d09c..fc744fc02 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -825,6 +825,7 @@ struct ust_app_session *alloc_ust_app_session(struct ust_app *app) ua_sess->handle = -1; ua_sess->channels = lttng_ht_new(0, LTTNG_HT_TYPE_STRING); + ua_sess->metadata_attr.type = LTTNG_UST_CHAN_METADATA; pthread_mutex_init(&ua_sess->lock, NULL); return ua_sess; @@ -1551,7 +1552,7 @@ static void shadow_copy_channel(struct ust_app_channel *ua_chan, } lttng_ht_node_init_ulong(&ua_ctx->node, (unsigned long) ua_ctx->ctx.ctx); - lttng_ht_add_unique_ulong(ua_chan->ctx, &ua_ctx->node); + lttng_ht_add_ulong(ua_chan->ctx, &ua_ctx->node); cds_list_add_tail(&ua_ctx->list, &ua_chan->ctx_list); } @@ -1608,6 +1609,8 @@ static void shadow_copy_session(struct ust_app_session *ua_sess, ua_sess->consumer = usess->consumer; ua_sess->output_traces = usess->output_traces; ua_sess->live_timer_interval = usess->live_timer_interval; + copy_channel_attr_to_ustctl(&ua_sess->metadata_attr, + &usess->metadata_attr); switch (ua_sess->buffer_type) { case LTTNG_BUFFER_PER_PID: @@ -1952,7 +1955,7 @@ int create_ust_app_channel_context(struct ust_app_session *ua_sess, } lttng_ht_node_init_ulong(&ua_ctx->node, (unsigned long) ua_ctx->ctx.ctx); - lttng_ht_add_unique_ulong(ua_chan->ctx, &ua_ctx->node); + lttng_ht_add_ulong(ua_chan->ctx, &ua_ctx->node); cds_list_add_tail(&ua_ctx->list, &ua_chan->ctx_list); ret = create_ust_channel_context(ua_chan, ua_ctx, app); @@ -2714,8 +2717,7 @@ error: * Called with UST app session lock held and RCU read side lock. */ static int create_ust_app_metadata(struct ust_app_session *ua_sess, - struct ust_app *app, struct consumer_output *consumer, - struct ustctl_consumer_channel_attr *attr) + struct ust_app *app, struct consumer_output *consumer) { int ret = 0; struct ust_app_channel *metadata; @@ -2743,20 +2745,7 @@ static int create_ust_app_metadata(struct ust_app_session *ua_sess, goto error; } - if (!attr) { - /* Set default attributes for metadata. */ - metadata->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE; - metadata->attr.subbuf_size = default_get_metadata_subbuf_size(); - metadata->attr.num_subbuf = DEFAULT_METADATA_SUBBUF_NUM; - metadata->attr.switch_timer_interval = DEFAULT_METADATA_SWITCH_TIMER; - metadata->attr.read_timer_interval = DEFAULT_METADATA_READ_TIMER; - metadata->attr.output = LTTNG_UST_MMAP; - metadata->attr.type = LTTNG_UST_CHAN_METADATA; - } else { - memcpy(&metadata->attr, attr, sizeof(metadata->attr)); - metadata->attr.output = LTTNG_UST_MMAP; - metadata->attr.type = LTTNG_UST_CHAN_METADATA; - } + memcpy(&metadata->attr, &ua_sess->metadata_attr, sizeof(metadata->attr)); /* Need one fd for the channel. */ ret = lttng_fd_get(LTTNG_FD_APPS, 1); @@ -2964,9 +2953,9 @@ int ust_app_version(struct ust_app *app) ret = ustctl_tracer_version(app->sock, &app->version); if (ret < 0) { if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) { - ERR("UST app %d verson failed with ret %d", app->sock, ret); + ERR("UST app %d version failed with ret %d", app->sock, ret); } else { - DBG3("UST app %d verion failed. Application is dead", app->sock); + DBG3("UST app %d version failed. Application is dead", app->sock); } } @@ -3144,19 +3133,25 @@ int ust_app_list_events(struct lttng_event **events) health_code_update(); if (count >= nbmem) { /* In case the realloc fails, we free the memory */ - void *ptr; - - DBG2("Reallocating event list from %zu to %zu entries", nbmem, - 2 * nbmem); - nbmem *= 2; - ptr = realloc(tmp_event, nbmem * sizeof(struct lttng_event)); - if (ptr == NULL) { + struct lttng_event *new_tmp_event; + size_t new_nbmem; + + new_nbmem = nbmem << 1; + DBG2("Reallocating event list from %zu to %zu entries", + nbmem, new_nbmem); + new_tmp_event = realloc(tmp_event, + new_nbmem * sizeof(struct lttng_event)); + if (new_tmp_event == NULL) { PERROR("realloc ust app events"); free(tmp_event); ret = -ENOMEM; goto rcu_error; } - tmp_event = ptr; + /* Zero the new memory */ + memset(new_tmp_event + nbmem, 0, + (new_nbmem - nbmem) * sizeof(struct lttng_event)); + nbmem = new_nbmem; + tmp_event = new_tmp_event; } memcpy(tmp_event[count].name, uiter.name, LTTNG_UST_SYM_NAME_LEN); tmp_event[count].loglevel = uiter.loglevel; @@ -3244,19 +3239,25 @@ int ust_app_list_event_fields(struct lttng_event_field **fields) health_code_update(); if (count >= nbmem) { /* In case the realloc fails, we free the memory */ - void *ptr; - - DBG2("Reallocating event field list from %zu to %zu entries", nbmem, - 2 * nbmem); - nbmem *= 2; - ptr = realloc(tmp_event, nbmem * sizeof(struct lttng_event_field)); - if (ptr == NULL) { + struct lttng_event_field *new_tmp_event; + size_t new_nbmem; + + new_nbmem = nbmem << 1; + DBG2("Reallocating event field list from %zu to %zu entries", + nbmem, new_nbmem); + new_tmp_event = realloc(tmp_event, + new_nbmem * sizeof(struct lttng_event_field)); + if (new_tmp_event == NULL) { PERROR("realloc ust app event fields"); free(tmp_event); ret = -ENOMEM; goto rcu_error; } - tmp_event = ptr; + /* Zero the new memory */ + memset(new_tmp_event + nbmem, 0, + (new_nbmem - nbmem) * sizeof(struct lttng_event_field)); + nbmem = new_nbmem; + tmp_event = new_tmp_event; } memcpy(tmp_event[count].field_name, uiter.field_name, LTTNG_UST_SYM_NAME_LEN); @@ -3570,10 +3571,8 @@ int ust_app_create_channel_glb(struct ltt_ust_session *usess, pthread_mutex_lock(&ua_sess->lock); if (!strncmp(uchan->name, DEFAULT_METADATA_NAME, sizeof(uchan->name))) { - struct ustctl_consumer_channel_attr attr; - copy_channel_attr_to_ustctl(&attr, &uchan->attr); - ret = create_ust_app_metadata(ua_sess, app, usess->consumer, - &attr); + copy_channel_attr_to_ustctl(&ua_sess->metadata_attr, &uchan->attr); + ret = 0; } else { /* Create channel onto application. We don't need the chan ref. */ ret = create_ust_app_channel(ua_sess, uchan, app, @@ -3778,7 +3777,7 @@ int ust_app_start_trace(struct ltt_ust_session *usess, struct ust_app *app) * Create the metadata for the application. This returns gracefully if a * metadata was already set for the session. */ - ret = create_ust_app_metadata(ua_sess, app, usess->consumer, NULL); + ret = create_ust_app_metadata(ua_sess, app, usess->consumer); if (ret < 0) { goto error_unlock; } @@ -4205,31 +4204,14 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock) */ cds_lfht_for_each_entry(ua_sess->channels->ht, &iter.iter, ua_chan, node.node) { - /* - * For a metadata channel, handle it differently. - */ - if (!strncmp(ua_chan->name, DEFAULT_METADATA_NAME, - sizeof(ua_chan->name))) { - ret = create_ust_app_metadata(ua_sess, app, usess->consumer, - &ua_chan->attr); - if (ret < 0) { - goto error_unlock; - } - /* Remove it from the hash table and continue!. */ - ret = lttng_ht_del(ua_sess->channels, &iter); - assert(!ret); - delete_ust_app_channel(-1, ua_chan, app); - continue; - } else { - ret = do_create_channel(app, usess, ua_sess, ua_chan); - if (ret < 0) { - /* - * Stop everything. On error, the application failed, no more - * file descriptor are available or ENOMEM so stopping here is - * the only thing we can do for now. - */ - goto error_unlock; - } + ret = do_create_channel(app, usess, ua_sess, ua_chan); + if (ret < 0) { + /* + * Stop everything. On error, the application failed, no more + * file descriptor are available or ENOMEM so stopping here is + * the only thing we can do for now. + */ + goto error_unlock; } /* @@ -4256,7 +4238,7 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock) pthread_mutex_unlock(&ua_sess->lock); - if (usess->start_trace) { + if (usess->active) { ret = ust_app_start_trace(usess, app); if (ret < 0) { goto error; @@ -4932,6 +4914,7 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess, struct snapshot_output *output, int wait, unsigned int nb_streams) { int ret = 0; + unsigned int snapshot_done = 0; struct lttng_ht_iter iter; struct ust_app *app; char pathname[PATH_MAX]; @@ -5006,6 +4989,7 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess, if (ret < 0) { goto error; } + snapshot_done = 1; } break; } @@ -5073,6 +5057,7 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess, if (ret < 0) { goto error; } + snapshot_done = 1; } break; } @@ -5081,6 +5066,15 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess, break; } + if (!snapshot_done) { + /* + * If no snapshot was made and we are not in the error path, this means + * that there are no buffers thus no (prior) application to snapshot + * data from so we have simply NO data. + */ + ret = -ENODATA; + } + error: rcu_read_unlock(); return ret;