X-Git-Url: http://git.liburcu.org/?p=lttng-modules.git;a=blobdiff_plain;f=src%2Flttng-events.c;h=2b72621cf2d6fccacaed54e3c8dde1159500ddb5;hp=3b9b907beb85196b36301cbb6df6456ab195b23b;hb=3e75e2a7f7693107faa58606538f80a4faf73fe6;hpb=0193412d9db9b24752bd1fbcabc7d1cc74c270c4 diff --git a/src/lttng-events.c b/src/lttng-events.c index 3b9b907b..2b72621c 100644 --- a/src/lttng-events.c +++ b/src/lttng-events.c @@ -1673,7 +1673,7 @@ int lttng_metadata_output_channel(struct lttng_metadata_stream *stream, reserve_len); stream->transport->ops.event_commit(&ctx); stream->metadata_in += reserve_len; - if (reserve_len < len || stream->metadata_cache->producing != 0) + if (reserve_len < len) stream->coherent = false; else stream->coherent = true; @@ -1689,18 +1689,21 @@ end: static void lttng_metadata_begin(struct lttng_session *session) { - mutex_lock(&session->metadata_cache->lock); - session->metadata_cache->producing++; - mutex_unlock(&session->metadata_cache->lock); + if (atomic_inc_return(&session->metadata_cache->producing) == 1) + mutex_lock(&session->metadata_cache->lock); } static void lttng_metadata_end(struct lttng_session *session) { - mutex_lock(&session->metadata_cache->lock); - WARN_ON_ONCE(!session->metadata_cache->producing); - session->metadata_cache->producing--; - mutex_unlock(&session->metadata_cache->lock); + WARN_ON_ONCE(!atomic_read(&session->metadata_cache->producing)); + if (atomic_dec_return(&session->metadata_cache->producing) == 0) { + struct lttng_metadata_stream *stream; + + mutex_unlock(&session->metadata_cache->lock); + list_for_each_entry(stream, &session->metadata_cache->metadata_stream, list) + wake_up_interruptible(&stream->read_wait); + } } /* @@ -1717,7 +1720,6 @@ int lttng_metadata_printf(struct lttng_session *session, char *str; size_t len; va_list ap; - struct lttng_metadata_stream *stream; WARN_ON_ONCE(!READ_ONCE(session->active)); @@ -1728,8 +1730,7 @@ int lttng_metadata_printf(struct lttng_session *session, return -ENOMEM; len = strlen(str); - mutex_lock(&session->metadata_cache->lock); - session->metadata_cache->producing++; + WARN_ON_ONCE(!atomic_read(&session->metadata_cache->producing)); if (session->metadata_cache->metadata_written + len > session->metadata_cache->cache_alloc) { char *tmp_cache_realloc; @@ -1755,18 +1756,11 @@ int lttng_metadata_printf(struct lttng_session *session, session->metadata_cache->metadata_written, str, len); session->metadata_cache->metadata_written += len; - session->metadata_cache->producing--; - mutex_unlock(&session->metadata_cache->lock); kfree(str); - list_for_each_entry(stream, &session->metadata_cache->metadata_stream, list) - wake_up_interruptible(&stream->read_wait); - return 0; err: - session->metadata_cache->producing--; - mutex_unlock(&session->metadata_cache->lock); kfree(str); return -ENOMEM; }