X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust-ctl%2Fustctl.c;h=f9c5e84fab59ef65116b70aa7d8df1941a123027;hb=ff927baefe5c1e382cd4779219ad985a03eb5a6c;hp=6f3d1ed97c6c983b52a631ab95cbdc358cfd0497;hpb=69400ac4a4e6575f749c6326df7c2a2c8ac3bdc5;p=lttng-ust.git diff --git a/liblttng-ust-ctl/ustctl.c b/liblttng-ust-ctl/ustctl.c index 6f3d1ed9..f9c5e84f 100644 --- a/liblttng-ust-ctl/ustctl.c +++ b/liblttng-ust-ctl/ustctl.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include "../libringbuffer/backend.h" #include "../libringbuffer/frontend.h" @@ -37,7 +39,7 @@ void init_object(struct lttng_ust_object_data *data) data->memory_map_size = 0; } -void release_object(int sock, struct lttng_ust_object_data *data) +void ustctl_release_object(int sock, struct lttng_ust_object_data *data) { struct ustcomm_ust_msg lum; struct ustcomm_ust_reply lur; @@ -152,7 +154,7 @@ int ustctl_open_metadata(int sock, int session_handle, return 0; error: - release_object(sock, metadata_data); + ustctl_release_object(sock, metadata_data); return -EINVAL; } @@ -205,7 +207,7 @@ int ustctl_create_channel(int sock, int session_handle, return 0; error: - release_object(sock, channel_data); + ustctl_release_object(sock, channel_data); return -EINVAL; } @@ -256,7 +258,7 @@ int ustctl_create_stream(int sock, struct lttng_ust_object_data *channel_data, return ret; error: - release_object(sock, stream_data); + ustctl_release_object(sock, stream_data); return -EINVAL; } @@ -368,10 +370,39 @@ int ustctl_stop_session(int sock, int handle) return ustctl_disable(sock, &obj); } - int ustctl_tracepoint_list(int sock) { - return -ENOSYS; /* not implemented */ + struct ustcomm_ust_msg lum; + struct ustcomm_ust_reply lur; + int ret, tp_list_handle; + + memset(&lum, 0, sizeof(lum)); + lum.handle = LTTNG_UST_ROOT_HANDLE; + lum.cmd = LTTNG_UST_TRACEPOINT_LIST; + ret = ustcomm_send_app_cmd(sock, &lum, &lur); + if (ret) + return ret; + tp_list_handle = lur.ret_val; + DBG("received tracepoint list handle %u", tp_list_handle); + return tp_list_handle; +} + +int ustctl_tracepoint_list_get(int sock, int tp_list_handle, + char iter[LTTNG_UST_SYM_NAME_LEN]) +{ + struct ustcomm_ust_msg lum; + struct ustcomm_ust_reply lur; + int ret; + + memset(&lum, 0, sizeof(lum)); + lum.handle = tp_list_handle; + lum.cmd = LTTNG_UST_TRACEPOINT_LIST_GET; + ret = ustcomm_send_app_cmd(sock, &lum, &lur); + if (ret) + return ret; + DBG("received tracepoint list entry %s", lur.u.tracepoint_list_entry); + memcpy(iter, lur.u.tracepoint_list_entry, LTTNG_UST_SYM_NAME_LEN); + return 0; } int ustctl_tracer_version(int sock, struct lttng_ust_tracer_version *v) @@ -407,17 +438,6 @@ int ustctl_wait_quiescent(int sock) return 0; } -int ustctl_flush_buffer(int sock, struct lttng_ust_object_data *channel_data) -{ - struct ustcomm_ust_msg lum; - struct ustcomm_ust_reply lur; - - memset(&lum, 0, sizeof(lum)); - lum.handle = channel_data->handle; - lum.cmd = LTTNG_UST_FLUSH_BUFFER; - return ustcomm_send_app_cmd(sock, &lum, &lur); -} - int ustctl_calibrate(int sock, struct lttng_ust_calibrate *calibrate) { return -ENOSYS; @@ -431,6 +451,8 @@ struct lttng_ust_shm_handle *ustctl_map_channel(struct lttng_ust_object_data *ch struct lttng_ust_shm_handle *handle; struct channel *chan; size_t chan_size; + struct lttng_ust_lib_ring_buffer_config *config; + int ret; handle = channel_handle_create(chan_data->shm_fd, chan_data->wait_fd, @@ -460,6 +482,38 @@ struct lttng_ust_shm_handle *ustctl_map_channel(struct lttng_ust_object_data *ch return NULL; } memcpy(handle->shadow_chan, chan, chan_size); + /* + * The callback pointers in the producer are invalid in the + * consumer. We need to look them up here. + */ + config = &handle->shadow_chan->backend.config; + switch (config->client_type) { + case LTTNG_CLIENT_METADATA: + memcpy(&config->cb, lttng_client_callbacks_metadata, + sizeof(config->cb)); + break; + case LTTNG_CLIENT_DISCARD: + memcpy(&config->cb, lttng_client_callbacks_discard, + sizeof(config->cb)); + break; + case LTTNG_CLIENT_OVERWRITE: + memcpy(&config->cb, lttng_client_callbacks_overwrite, + sizeof(config->cb)); + break; + default: + ERR("Unknown client type %d", config->client_type); + channel_destroy(chan, handle, 1); + return NULL; + } + /* Replace the object table pointer. */ + ret = munmap(handle->table->objects[0].memory_map, + handle->table->objects[0].memory_map_size); + if (ret) { + perror("munmap"); + assert(0); + } + handle->table->objects[0].memory_map = (char *) handle->shadow_chan; + handle->table->objects[0].is_shadow = 1; return handle; } @@ -660,9 +714,11 @@ int ustctl_put_subbuf(struct lttng_ust_shm_handle *handle, return 0; } -int ustctl_buffer_flush(struct lttng_ust_shm_handle *handle, - struct lttng_ust_lib_ring_buffer *buf) +void ustctl_flush_buffer(struct lttng_ust_shm_handle *handle, + struct lttng_ust_lib_ring_buffer *buf, + int producer_active) { - lib_ring_buffer_switch_slow(buf, SWITCH_ACTIVE, handle); - return 0; + lib_ring_buffer_switch_slow(buf, + producer_active ? SWITCH_ACTIVE : SWITCH_FLUSH, + handle); }