X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust-ctl%2Fustctl.c;h=b4234effc01212bb43f4150716429364a4f340e4;hb=84ac63b891bfc8826584719a71f071b06ca66675;hp=cd80faec38270b94c662f4ea24fff5fd8d6b5e20;hpb=bbc70d1b2a7a366a17283194af813c239d9dd8c7;p=lttng-ust.git diff --git a/liblttng-ust-ctl/ustctl.c b/liblttng-ust-ctl/ustctl.c index cd80faec..b4234eff 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" @@ -420,6 +422,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, @@ -451,10 +455,36 @@ struct lttng_ust_shm_handle *ustctl_map_channel(struct lttng_ust_object_data *ch memcpy(handle->shadow_chan, chan, chan_size); /* * The callback pointers in the producer are invalid in the - * consumer. Zero them out. + * consumer. We need to look them up here. */ - memset(&handle->shadow_chan->backend.config.cb, 0, - sizeof(handle->shadow_chan->backend.config.cb)); + 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; } @@ -655,12 +685,11 @@ int ustctl_put_subbuf(struct lttng_ust_shm_handle *handle, return 0; } -int ustctl_flush_buffer(struct lttng_ust_shm_handle *handle, +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, producer_active ? SWITCH_ACTIVE : SWITCH_FLUSH, handle); - return 0; }