X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;ds=sidebyside;f=liblttng-ust-ctl%2Fustctl.c;h=6b6f295b38bd81ff4ce3e26ad47f7ea37c351fc0;hb=abac44cda88a3b83c2bf98c6bab16ed6a1cc1af1;hp=bc3ea9b12266531be1a5b1d7f760b06192ff93d9;hpb=b24e4e91830659fca70cfd4381280b828bf8d360;p=lttng-ust.git diff --git a/liblttng-ust-ctl/ustctl.c b/liblttng-ust-ctl/ustctl.c index bc3ea9b1..6b6f295b 100644 --- a/liblttng-ust-ctl/ustctl.c +++ b/liblttng-ust-ctl/ustctl.c @@ -32,6 +32,7 @@ #include "../libringbuffer/frontend.h" #include "../liblttng-ust/wait.h" #include "../liblttng-ust/lttng-rb-clients.h" +#include "../liblttng-ust/clock.h" /* * Number of milliseconds to retry before failing metadata writes on @@ -230,7 +231,7 @@ int ustctl_add_context(int sock, struct lttng_ust_context *ctx, memset(&lum, 0, sizeof(lum)); lum.handle = obj_data->handle; lum.cmd = LTTNG_UST_CONTEXT; - lum.u.context.ctx = ctx->ctx; + lum.u.context = *ctx; ret = ustcomm_send_app_cmd(sock, &lum, &lur); if (ret) { free(context_data); @@ -294,7 +295,7 @@ int ustctl_set_exclusion(int sock, struct lttng_ust_event_exclusion *exclusion, return ret; } - /* send var len bytecode */ + /* send var len exclusion names */ ret = ustcomm_send_unix_sock(sock, exclusion->names, exclusion->count * LTTNG_UST_SYM_NAME_LEN); @@ -942,8 +943,14 @@ error: /* Buffer operations */ +int ustctl_get_nr_stream_per_channel(void) +{ + return num_possible_cpus(); +} + struct ustctl_consumer_channel * - ustctl_create_channel(struct ustctl_consumer_channel_attr *attr) + ustctl_create_channel(struct ustctl_consumer_channel_attr *attr, + const int *stream_fds, int nr_stream_fds) { struct ustctl_consumer_channel *chan; const char *transport_name; @@ -995,7 +1002,8 @@ struct ustctl_consumer_channel * attr->subbuf_size, attr->num_subbuf, attr->switch_timer_interval, attr->read_timer_interval, - attr->uuid, attr->chan_id); + attr->uuid, attr->chan_id, + stream_fds, nr_stream_fds); if (!chan->chan) { goto chan_error; } @@ -1333,6 +1341,8 @@ int ustctl_get_mmap_read_offset(struct ustctl_consumer_stream *stream, unsigned long sb_bindex; struct lttng_ust_lib_ring_buffer *buf; struct ustctl_consumer_channel *consumer_chan; + struct lttng_ust_lib_ring_buffer_backend_pages_shmp *barray_idx; + struct lttng_ust_lib_ring_buffer_backend_pages *pages; if (!stream) return -EINVAL; @@ -1343,8 +1353,14 @@ int ustctl_get_mmap_read_offset(struct ustctl_consumer_stream *stream, return -EINVAL; sb_bindex = subbuffer_id_get_index(&chan->backend.config, buf->backend.buf_rsb.id); - *off = shmp(consumer_chan->chan->handle, - shmp_index(consumer_chan->chan->handle, buf->backend.array, sb_bindex)->shmp)->mmap_offset; + barray_idx = shmp_index(consumer_chan->chan->handle, buf->backend.array, + sb_bindex); + if (!barray_idx) + return -EINVAL; + pages = shmp(consumer_chan->chan->handle, barray_idx->shmp); + if (!pages) + return -EINVAL; + *off = pages->mmap_offset; return 0; } @@ -1510,6 +1526,8 @@ struct lttng_ust_client_lib_ring_buffer_client_cb *get_client_cb( struct lttng_ust_client_lib_ring_buffer_client_cb *client_cb; chan = shmp(handle, buf->backend.chan); + if (!chan) + return NULL; config = &chan->backend.config; if (!config->cb_ptr) return NULL; @@ -1523,11 +1541,13 @@ int ustctl_get_timestamp_begin(struct ustctl_consumer_stream *stream, uint64_t *timestamp_begin) { struct lttng_ust_client_lib_ring_buffer_client_cb *client_cb; - struct lttng_ust_lib_ring_buffer *buf = stream->buf; - struct lttng_ust_shm_handle *handle = stream->chan->chan->handle; + struct lttng_ust_lib_ring_buffer *buf; + struct lttng_ust_shm_handle *handle; if (!stream || !timestamp_begin) return -EINVAL; + buf = stream->buf; + handle = stream->chan->chan->handle; client_cb = get_client_cb(buf, handle); if (!client_cb) return -ENOSYS; @@ -1538,11 +1558,13 @@ int ustctl_get_timestamp_end(struct ustctl_consumer_stream *stream, uint64_t *timestamp_end) { struct lttng_ust_client_lib_ring_buffer_client_cb *client_cb; - struct lttng_ust_lib_ring_buffer *buf = stream->buf; - struct lttng_ust_shm_handle *handle = stream->chan->chan->handle; + struct lttng_ust_lib_ring_buffer *buf; + struct lttng_ust_shm_handle *handle; if (!stream || !timestamp_end) return -EINVAL; + buf = stream->buf; + handle = stream->chan->chan->handle; client_cb = get_client_cb(buf, handle); if (!client_cb) return -ENOSYS; @@ -1553,11 +1575,13 @@ int ustctl_get_events_discarded(struct ustctl_consumer_stream *stream, uint64_t *events_discarded) { struct lttng_ust_client_lib_ring_buffer_client_cb *client_cb; - struct lttng_ust_lib_ring_buffer *buf = stream->buf; - struct lttng_ust_shm_handle *handle = stream->chan->chan->handle; + struct lttng_ust_lib_ring_buffer *buf; + struct lttng_ust_shm_handle *handle; if (!stream || !events_discarded) return -EINVAL; + buf = stream->buf; + handle = stream->chan->chan->handle; client_cb = get_client_cb(buf, handle); if (!client_cb) return -ENOSYS; @@ -1568,11 +1592,13 @@ int ustctl_get_content_size(struct ustctl_consumer_stream *stream, uint64_t *content_size) { struct lttng_ust_client_lib_ring_buffer_client_cb *client_cb; - struct lttng_ust_lib_ring_buffer *buf = stream->buf; - struct lttng_ust_shm_handle *handle = stream->chan->chan->handle; + struct lttng_ust_lib_ring_buffer *buf; + struct lttng_ust_shm_handle *handle; if (!stream || !content_size) return -EINVAL; + buf = stream->buf; + handle = stream->chan->chan->handle; client_cb = get_client_cb(buf, handle); if (!client_cb) return -ENOSYS; @@ -1583,11 +1609,13 @@ int ustctl_get_packet_size(struct ustctl_consumer_stream *stream, uint64_t *packet_size) { struct lttng_ust_client_lib_ring_buffer_client_cb *client_cb; - struct lttng_ust_lib_ring_buffer *buf = stream->buf; - struct lttng_ust_shm_handle *handle = stream->chan->chan->handle; + struct lttng_ust_lib_ring_buffer *buf; + struct lttng_ust_shm_handle *handle; if (!stream || !packet_size) return -EINVAL; + buf = stream->buf; + handle = stream->chan->chan->handle; client_cb = get_client_cb(buf, handle); if (!client_cb) return -ENOSYS; @@ -1598,11 +1626,13 @@ int ustctl_get_stream_id(struct ustctl_consumer_stream *stream, uint64_t *stream_id) { struct lttng_ust_client_lib_ring_buffer_client_cb *client_cb; - struct lttng_ust_lib_ring_buffer *buf = stream->buf; - struct lttng_ust_shm_handle *handle = stream->chan->chan->handle; + struct lttng_ust_lib_ring_buffer *buf; + struct lttng_ust_shm_handle *handle; if (!stream || !stream_id) return -EINVAL; + buf = stream->buf; + handle = stream->chan->chan->handle; client_cb = get_client_cb(buf, handle); if (!client_cb) return -ENOSYS; @@ -1613,17 +1643,35 @@ int ustctl_get_current_timestamp(struct ustctl_consumer_stream *stream, uint64_t *ts) { struct lttng_ust_client_lib_ring_buffer_client_cb *client_cb; - struct lttng_ust_lib_ring_buffer *buf = stream->buf; - struct lttng_ust_shm_handle *handle = stream->chan->chan->handle; + struct lttng_ust_lib_ring_buffer *buf; + struct lttng_ust_shm_handle *handle; if (!stream || !ts) return -EINVAL; + buf = stream->buf; + handle = stream->chan->chan->handle; client_cb = get_client_cb(buf, handle); if (!client_cb || !client_cb->current_timestamp) return -ENOSYS; return client_cb->current_timestamp(buf, handle, ts); } +#if defined(__x86_64__) || defined(__i386__) + +int ustctl_has_perf_counters(void) +{ + return 1; +} + +#else + +int ustctl_has_perf_counters(void) +{ + return 0; +} + +#endif + /* * Returns 0 on success, negative error value on error. */ @@ -1966,6 +2014,7 @@ static __attribute__((constructor)) void ustctl_init(void) { init_usterr(); + lttng_ust_clock_init(); lttng_ring_buffer_metadata_client_init(); lttng_ring_buffer_client_overwrite_init(); lttng_ring_buffer_client_overwrite_rt_init();