X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fconsumer-metadata-cache.c;h=173cac04976a95f77ff35e128e594324f3c2f240;hp=4c8a665af0db7aa1d5d8224edcfac96c5fc2fbb2;hb=04ef1097c8f54a151c899c1773ac56907c97694d;hpb=feb78e88e113ec8c6918253e93136b5f6235ad31 diff --git a/src/common/consumer-metadata-cache.c b/src/common/consumer-metadata-cache.c index 4c8a665af..173cac049 100644 --- a/src/common/consumer-metadata-cache.c +++ b/src/common/consumer-metadata-cache.c @@ -105,15 +105,17 @@ int consumer_metadata_cache_write(struct lttng_consumer_channel *channel, } if (cache->max_offset == cache->total_bytes_written) { - offset = cache->rb_pushed; - len = cache->total_bytes_written - cache->rb_pushed; - ret = lttng_ustconsumer_push_metadata(channel, cache->data, offset, - len); - if (ret < 0) { - ERR("Pushing metadata"); - goto end; + char dummy = 'c'; + + cache->contiguous = cache->max_offset; + if (channel->monitor) { + ret = write(channel->metadata_stream->ust_metadata_poll_pipe[1], + &dummy, 1); + if (ret < 1) { + ERR("Wakeup UST metadata pipe"); + goto end; + } } - cache->rb_pushed += len; } end: @@ -177,11 +179,6 @@ void consumer_metadata_cache_destroy(struct lttng_consumer_channel *channel) DBG("Destroying metadata cache"); - if (channel->metadata_cache->max_offset > - channel->metadata_cache->rb_pushed) { - ERR("Destroying a cache not entirely commited"); - } - pthread_mutex_destroy(&channel->metadata_cache->lock); free(channel->metadata_cache->data); free(channel->metadata_cache); @@ -195,14 +192,12 @@ void consumer_metadata_cache_destroy(struct lttng_consumer_channel *channel) int consumer_metadata_cache_flushed(struct lttng_consumer_channel *channel, uint64_t offset) { - int ret; - struct consumer_metadata_cache *cache; + int ret = 0; + struct lttng_consumer_stream *metadata_stream; assert(channel); assert(channel->metadata_cache); - cache = channel->metadata_cache; - /* * XXX This consumer_data.lock should eventually be replaced by * a channel lock. It protects metadata_stream read and endpoint @@ -212,14 +207,16 @@ int consumer_metadata_cache_flushed(struct lttng_consumer_channel *channel, pthread_mutex_lock(&channel->lock); pthread_mutex_lock(&channel->metadata_cache->lock); - if (cache->rb_pushed >= offset) { - ret = 0; - } else if (!channel->metadata_stream) { + metadata_stream = channel->metadata_stream; + + if (!metadata_stream) { /* * Having no metadata stream means the channel is being destroyed so there * is no cache to flush anymore. */ ret = 0; + } else if (metadata_stream->ust_metadata_pushed >= offset) { + ret = 0; } else if (channel->metadata_stream->endpoint_status != CONSUMER_ENDPOINT_ACTIVE) { /* An inactive endpoint means we don't have to flush anymore. */