Implement --shm-path option for UST sessions (per-uid channels)
[lttng-tools.git] / src / common / ust-consumer / ust-consumer.c
index 4435bf3fd4e22cae6cd74113981e25b42d07c756..81f6859124c1353d89dbb36b38f8549761f33d53 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <assert.h>
 #include <lttng/ust-ctl.h>
 #include <poll.h>
@@ -123,14 +124,16 @@ static struct lttng_consumer_channel *allocate_channel(uint64_t session_id,
                uint64_t relayd_id, uint64_t key, enum lttng_event_output output,
                uint64_t tracefile_size, uint64_t tracefile_count,
                uint64_t session_id_per_pid, unsigned int monitor,
-               unsigned int live_timer_interval)
+               unsigned int live_timer_interval,
+               const char *shm_path)
 {
        assert(pathname);
        assert(name);
 
        return consumer_allocate_channel(key, session_id, pathname, name, uid,
                        gid, relayd_id, output, tracefile_size,
-                       tracefile_count, session_id_per_pid, monitor, live_timer_interval);
+                       tracefile_count, session_id_per_pid, monitor,
+                       live_timer_interval, shm_path);
 }
 
 /*
@@ -433,7 +436,7 @@ static int send_sessiond_channel(int sock,
                                if (relayd_error) {
                                        *relayd_error = 1;
                                }
-                               ret_code = LTTNG_ERR_RELAYD_CONNECT_FAIL;
+                               ret_code = LTTCOMM_CONSUMERD_RELAYD_FAIL;
                        }
                        if (net_seq_idx == -1ULL) {
                                net_seq_idx = stream->net_seq_idx;
@@ -859,7 +862,7 @@ error:
  * Returns 0 on success, < 0 on error
  */
 static int snapshot_channel(uint64_t key, char *path, uint64_t relayd_id,
-               uint64_t max_stream_size, struct lttng_consumer_local_data *ctx)
+               uint64_t nb_packets_per_stream, struct lttng_consumer_local_data *ctx)
 {
        int ret;
        unsigned use_relayd = 0;
@@ -941,12 +944,13 @@ static int snapshot_channel(uint64_t key, char *path, uint64_t relayd_id,
 
                /*
                 * The original value is sent back if max stream size is larger than
-                * the possible size of the snapshot. Also, we asume that the session
+                * the possible size of the snapshot. Also, we assume that the session
                 * daemon should never send a maximum stream size that is lower than
                 * subbuffer size.
                 */
-               consumed_pos = consumer_get_consumed_maxsize(consumed_pos,
-                               produced_pos, max_stream_size);
+               consumed_pos = consumer_get_consume_start_pos(consumed_pos,
+                               produced_pos, nb_packets_per_stream,
+                               stream->max_sb_size);
 
                while (consumed_pos < produced_pos) {
                        ssize_t read_len;
@@ -1208,7 +1212,8 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                                msg.u.ask_channel.tracefile_count,
                                msg.u.ask_channel.session_id_per_pid,
                                msg.u.ask_channel.monitor,
-                               msg.u.ask_channel.live_timer_interval);
+                               msg.u.ask_channel.live_timer_interval,
+                               msg.u.ask_channel.shm_path);
                if (!channel) {
                        goto end_channel_error;
                }
@@ -1228,6 +1233,9 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                attr.read_timer_interval = msg.u.ask_channel.read_timer_interval;
                attr.chan_id = msg.u.ask_channel.chan_id;
                memcpy(attr.uuid, msg.u.ask_channel.uuid, sizeof(attr.uuid));
+               strncpy(attr.shm_path, channel->shm_path,
+                       sizeof(attr.shm_path));
+               attr.shm_path[sizeof(attr.shm_path) - 1] = '\0';
 
                /* Match channel buffer type to the UST abi. */
                switch (msg.u.ask_channel.output) {
@@ -1489,7 +1497,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                        ret = snapshot_channel(msg.u.snapshot_channel.key,
                                        msg.u.snapshot_channel.pathname,
                                        msg.u.snapshot_channel.relayd_id,
-                                       msg.u.snapshot_channel.max_stream_size,
+                                       msg.u.snapshot_channel.nb_packets_per_stream,
                                        ctx);
                        if (ret < 0) {
                                ERR("Snapshot channel failed");
@@ -1881,7 +1889,7 @@ static int notify_if_more_data(struct lttng_consumer_stream *stream,
                goto end;
        }
 
-       ret = ustctl_put_next_subbuf(ustream);
+       ret = ustctl_put_subbuf(ustream);
        assert(!ret);
 
        /* This stream still has data. Flag it and wake up the data thread. */
@@ -2144,7 +2152,7 @@ int lttng_ustconsumer_data_pending(struct lttng_consumer_stream *stream)
                 */
                DBG("UST consumer metadata pending check: contiguous %" PRIu64 " vs pushed %" PRIu64,
                                contiguous, pushed);
-               assert(((int64_t) contiguous - pushed) >= 0);
+               assert(((int64_t) (contiguous - pushed)) >= 0);
                if ((contiguous != pushed) ||
                                (((int64_t) contiguous - pushed) > 0 || contiguous == 0)) {
                        ret = 1;        /* Data is pending */
@@ -2383,3 +2391,15 @@ end:
        pthread_mutex_unlock(&ctx->metadata_socket_lock);
        return ret;
 }
+
+/*
+ * Return the ustctl call for the get stream id.
+ */
+int lttng_ustconsumer_get_stream_id(struct lttng_consumer_stream *stream,
+               uint64_t *stream_id)
+{
+       assert(stream);
+       assert(stream_id);
+
+       return ustctl_get_stream_id(stream->ustream, stream_id);
+}
This page took 0.025967 seconds and 4 git commands to generate.