Port: Remove _GNU_SOURCE, defined in config.h
[lttng-tools.git] / src / common / consumer-stream.c
index a9e4deef5106d4b3ccb9725d1bcb95418209af27..a62cef272294d360953e5d685fca745d7509bcff 100644 (file)
@@ -17,7 +17,7 @@
  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <assert.h>
 #include <inttypes.h>
 #include <sys/mman.h>
@@ -28,6 +28,7 @@
 #include <common/kernel-consumer/kernel-consumer.h>
 #include <common/relayd/relayd.h>
 #include <common/ust-consumer/ust-consumer.h>
+#include <common/utils.h>
 
 #include "consumer-stream.h"
 
@@ -119,6 +120,9 @@ void consumer_stream_close(struct lttng_consumer_stream *stream)
                        }
                        stream->wait_fd = -1;
                }
+               if (stream->chan->output == CONSUMER_CHANNEL_SPLICE) {
+                       utils_close_pipe(stream->splice_pipe);
+               }
                break;
        case LTTNG_CONSUMER32_UST:
        case LTTNG_CONSUMER64_UST:
@@ -391,45 +395,20 @@ error:
 }
 
 /*
- * Synchronize the metadata using a given session ID. A successful acquisition
- * of a metadata stream will trigger a request to the session daemon and a
- * snapshot so the metadata thread can consume it.
+ * Actually do the metadata sync using the given metadata stream.
  *
- * This function call is a rendez-vous point between the metadata thread and
- * the data thread.
- *
- * Return 0 on success or else a negative value.
+ * Return 0 on success else a negative value. ENODATA can be returned also
+ * indicating that there is no metadata available for that stream.
  */
-int consumer_stream_sync_metadata(struct lttng_consumer_local_data *ctx,
-               uint64_t session_id)
+static int do_sync_metadata(struct lttng_consumer_stream *metadata,
+               struct lttng_consumer_local_data *ctx)
 {
        int ret;
-       struct lttng_consumer_stream *metadata = NULL, *stream = NULL;
-       struct lttng_ht_iter iter;
-       struct lttng_ht *ht;
 
+       assert(metadata);
+       assert(metadata->metadata_flag);
        assert(ctx);
 
-       /* Ease our life a bit. */
-       ht = consumer_data.stream_list_ht;
-
-       rcu_read_lock();
-
-       /* Search the metadata associated with the session id of the given stream. */
-
-       cds_lfht_for_each_entry_duplicate(ht->ht,
-                       ht->hash_fct(&session_id, lttng_ht_seed), ht->match_fct,
-                       &session_id, &iter.iter, stream, node_session_id.node) {
-               if (stream->metadata_flag) {
-                       metadata = stream;
-                       break;
-               }
-       }
-       if (!metadata) {
-               ret = 0;
-               goto end_unlock_rcu;
-       }
-
        /*
         * In UST, since we have to write the metadata from the cache packet
         * by packet, we might need to start this procedure multiple times
@@ -515,12 +494,61 @@ int consumer_stream_sync_metadata(struct lttng_consumer_local_data *ctx,
                pthread_mutex_unlock(&metadata->metadata_rdv_lock);
        } while (ret == EAGAIN);
 
-       ret = 0;
-       goto end_unlock_rcu;
+       /* Success */
+       return 0;
 
 end_unlock_mutex:
        pthread_mutex_unlock(&metadata->lock);
-end_unlock_rcu:
+       return ret;
+}
+
+/*
+ * Synchronize the metadata using a given session ID. A successful acquisition
+ * of a metadata stream will trigger a request to the session daemon and a
+ * snapshot so the metadata thread can consume it.
+ *
+ * This function call is a rendez-vous point between the metadata thread and
+ * the data thread.
+ *
+ * Return 0 on success or else a negative value.
+ */
+int consumer_stream_sync_metadata(struct lttng_consumer_local_data *ctx,
+               uint64_t session_id)
+{
+       int ret;
+       struct lttng_consumer_stream *stream = NULL;
+       struct lttng_ht_iter iter;
+       struct lttng_ht *ht;
+
+       assert(ctx);
+
+       /* Ease our life a bit. */
+       ht = consumer_data.stream_list_ht;
+
+       rcu_read_lock();
+
+       /* Search the metadata associated with the session id of the given stream. */
+
+       cds_lfht_for_each_entry_duplicate(ht->ht,
+                       ht->hash_fct(&session_id, lttng_ht_seed), ht->match_fct,
+                       &session_id, &iter.iter, stream, node_session_id.node) {
+               if (!stream->metadata_flag) {
+                       continue;
+               }
+
+               ret = do_sync_metadata(stream, ctx);
+               if (ret < 0) {
+                       goto end;
+               }
+       }
+
+       /*
+        * Force return code to 0 (success) since ret might be ENODATA for instance
+        * which is not an error but rather that we should come back.
+        */
+       ret = 0;
+
+end:
        rcu_read_unlock();
        return ret;
 }
This page took 0.025369 seconds and 4 git commands to generate.