Fix: implicit conversion of enum types in consumer
authorDavid Goulet <dgoulet@efficios.com>
Mon, 25 Nov 2013 19:16:39 +0000 (14:16 -0500)
committerDavid Goulet <dgoulet@efficios.com>
Mon, 25 Nov 2013 21:49:22 +0000 (16:49 -0500)
This actually remove the use of LTTNG_ERR* code in the sessiond/consumer
protocol since it should NOT be used and some comparison of enum
(lttng_error_code vs lttcomm_return_code) were broken and dangerous.

Signed-off-by: David Goulet <dgoulet@efficios.com>
src/bin/lttng-sessiond/consumer.c
src/bin/lttng-sessiond/ust-consumer.c
src/common/consumer.c
src/common/kernel-consumer/kernel-consumer.c
src/common/sessiond-comm/sessiond-comm.h
src/common/ust-consumer/ust-consumer.c

index 55a2af4f794fa9681cddf90e91ba3ce3ecdd03b0..18931a8b7b8d488ab437522889894049b5f8f20b 100644 (file)
@@ -142,7 +142,7 @@ int consumer_recv_status_reply(struct consumer_socket *sock)
                goto end;
        }
 
-       if (reply.ret_code == LTTNG_OK) {
+       if (reply.ret_code == LTTCOMM_CONSUMERD_SUCCESS) {
                /* All good. */
                ret = 0;
        } else {
@@ -178,13 +178,14 @@ int consumer_recv_status_channel(struct consumer_socket *sock,
        }
 
        /* An error is possible so don't touch the key and stream_count. */
-       if (reply.ret_code != LTTNG_OK) {
+       if (reply.ret_code != LTTCOMM_CONSUMERD_SUCCESS) {
                ret = -1;
                goto end;
        }
 
        *key = reply.key;
        *stream_count = reply.stream_count;
+       ret = 0;
 
 end:
        return ret;
index ee56d6dea67b61406fd1d5ba946c03a23e6612a3..b0a52b33ad49ca196d62326330e70750b7028190 100644 (file)
@@ -102,7 +102,7 @@ static int ask_channel_creation(struct ust_app_session *ua_sess,
                struct ust_app_channel *ua_chan, struct consumer_output *consumer,
                struct consumer_socket *socket, struct ust_registry_session *registry)
 {
-       int ret;
+       int ret, output;
        uint32_t chan_id;
        uint64_t key, chan_reg_key;
        char *pathname = NULL;
@@ -141,6 +141,13 @@ static int ask_channel_creation(struct ust_app_session *ua_sess,
                chan_id = chan_reg->chan_id;
        }
 
+       switch (ua_chan->attr.output) {
+       case LTTNG_UST_MMAP:
+       default:
+               output = LTTNG_EVENT_MMAP;
+               break;
+       }
+
        consumer_init_ask_channel_comm_msg(&msg,
                        ua_chan->attr.subbuf_size,
                        ua_chan->attr.num_subbuf,
@@ -148,7 +155,7 @@ static int ask_channel_creation(struct ust_app_session *ua_sess,
                        ua_chan->attr.switch_timer_interval,
                        ua_chan->attr.read_timer_interval,
                        ua_sess->live_timer_interval,
-                       (int) ua_chan->attr.output,
+                       output,
                        (int) ua_chan->attr.type,
                        ua_sess->tracing_id,
                        pathname,
index 8aa8903490080c8a598e267339742dcf5f8d2bbe..152064078d34b354263a79992e93d965a5b738a4 100644 (file)
@@ -879,7 +879,6 @@ struct lttng_consumer_channel *consumer_allocate_channel(uint64_t key,
        channel->uid = uid;
        channel->gid = gid;
        channel->relayd_id = relayd_id;
-       channel->output = output;
        channel->tracefile_size = tracefile_size;
        channel->tracefile_count = tracefile_count;
        channel->monitor = monitor;
@@ -887,6 +886,20 @@ struct lttng_consumer_channel *consumer_allocate_channel(uint64_t key,
        pthread_mutex_init(&channel->lock, NULL);
        pthread_mutex_init(&channel->timer_lock, NULL);
 
+       switch (output) {
+       case LTTNG_EVENT_SPLICE:
+               channel->output = CONSUMER_CHANNEL_SPLICE;
+               break;
+       case LTTNG_EVENT_MMAP:
+               channel->output = CONSUMER_CHANNEL_MMAP;
+               break;
+       default:
+               assert(0);
+               free(channel);
+               channel = NULL;
+               goto end;
+       }
+
        /*
         * In monitor mode, the streams associated with the channel will be put in
         * a special list ONLY owned by this channel. So, the refcount is set to 1
@@ -3226,7 +3239,7 @@ int consumer_add_relayd_socket(uint64_t net_seq_idx, int sock_type,
                uint64_t relayd_session_id)
 {
        int fd = -1, ret = -1, relayd_created = 0;
-       enum lttng_error_code ret_code = LTTNG_OK;
+       enum lttcomm_return_code ret_code = LTTCOMM_CONSUMERD_SUCCESS;
        struct consumer_relayd_sock_pair *relayd = NULL;
 
        assert(ctx);
@@ -3262,7 +3275,7 @@ int consumer_add_relayd_socket(uint64_t net_seq_idx, int sock_type,
        }
 
        /* First send a status message before receiving the fds. */
-       ret = consumer_send_status_msg(sock, LTTNG_OK);
+       ret = consumer_send_status_msg(sock, LTTCOMM_CONSUMERD_SUCCESS);
        if (ret < 0) {
                /* Somehow, the session daemon is not responding anymore. */
                lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_FATAL);
@@ -3623,9 +3636,9 @@ int consumer_send_status_channel(int sock,
        assert(sock >= 0);
 
        if (!channel) {
-               msg.ret_code = -LTTNG_ERR_UST_CHAN_FAIL;
+               msg.ret_code = LTTCOMM_CONSUMERD_CHANNEL_FAIL;
        } else {
-               msg.ret_code = LTTNG_OK;
+               msg.ret_code = LTTCOMM_CONSUMERD_SUCCESS;
                msg.key = channel->key;
                msg.stream_count = channel->streams.count;
        }
index 44d58d98317c24562a0442509418a10294986917..1b01d414a0248b0207bbf72aba620a8fa62b93e4 100644 (file)
@@ -418,7 +418,7 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                int sock, struct pollfd *consumer_sockpoll)
 {
        ssize_t ret;
-       enum lttng_error_code ret_code = LTTNG_OK;
+       enum lttcomm_return_code ret_code = LTTCOMM_CONSUMERD_SUCCESS;
        struct lttcomm_consumer_msg msg;
 
        health_code_update();
@@ -577,7 +577,7 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 
                health_code_update();
 
-               if (ret_code != LTTNG_OK) {
+               if (ret_code != LTTCOMM_CONSUMERD_SUCCESS) {
                        /* Channel was not found. */
                        goto end_nosignal;
                }
index 2246477f385f5e47496187d2ab73d4804bcaec53..6861b04080d97db9cd4e3da589568650f9aa066d 100644 (file)
@@ -114,6 +114,7 @@ enum lttcomm_relayd_command {
  * lttcomm error code.
  */
 enum lttcomm_return_code {
+       LTTCOMM_CONSUMERD_SUCCESS            = 0,   /* Everything went fine. */
        LTTCOMM_CONSUMERD_COMMAND_SOCK_READY = 1,   /* Command socket ready */
        LTTCOMM_CONSUMERD_SUCCESS_RECV_FD,          /* Success on receiving fds */
        LTTCOMM_CONSUMERD_ERROR_RECV_FD,            /* Error on receiving fds */
@@ -132,6 +133,7 @@ enum lttcomm_return_code {
        LTTCOMM_CONSUMERD_ERROR_METADATA,           /* Error with metadata. */
        LTTCOMM_CONSUMERD_FATAL,                    /* Fatal error. */
        LTTCOMM_CONSUMERD_RELAYD_FAIL,              /* Error on remote relayd */
+       LTTCOMM_CONSUMERD_CHANNEL_FAIL,             /* Channel creation failed. */
 
        /* MUST be last element */
        LTTCOMM_NR,                                             /* Last element */
@@ -438,11 +440,11 @@ struct lttcomm_consumer_msg {
  * Status message returned to the sessiond after a received command.
  */
 struct lttcomm_consumer_status_msg {
-       enum lttng_error_code ret_code;
+       enum lttcomm_return_code ret_code;
 } LTTNG_PACKED;
 
 struct lttcomm_consumer_status_channel {
-       enum lttng_error_code ret_code;
+       enum lttcomm_return_code ret_code;
        uint64_t key;
        unsigned int stream_count;
 } LTTNG_PACKED;
index 1a7b2cd4b5a01edd85cf83569d69109d454b6698..79d8fd7a5012373164bbadfe420537fa1e418af5 100644 (file)
@@ -407,7 +407,7 @@ static int send_sessiond_channel(int sock,
                struct lttng_consumer_channel *channel,
                struct lttng_consumer_local_data *ctx, int *relayd_error)
 {
-       int ret, ret_code = LTTNG_OK;
+       int ret, ret_code = LTTCOMM_CONSUMERD_SUCCESS;
        struct lttng_consumer_stream *stream;
 
        assert(channel);
@@ -438,7 +438,7 @@ static int send_sessiond_channel(int sock,
 
        /* Inform sessiond that we are about to send channel and streams. */
        ret = consumer_send_status_msg(sock, ret_code);
-       if (ret < 0 || ret_code != LTTNG_OK) {
+       if (ret < 0 || ret_code != LTTCOMM_CONSUMERD_SUCCESS) {
                /*
                 * Either the session daemon is not responding or the relayd died so we
                 * stop now.
@@ -480,7 +480,7 @@ static int send_sessiond_channel(int sock,
        return 0;
 
 error:
-       if (ret_code != LTTNG_OK) {
+       if (ret_code != LTTCOMM_CONSUMERD_SUCCESS) {
                ret = -1;
        }
        return ret;
@@ -635,7 +635,7 @@ error:
  */
 static int _close_metadata(struct lttng_consumer_channel *channel)
 {
-       int ret = LTTNG_OK;
+       int ret = LTTCOMM_CONSUMERD_SUCCESS;
 
        assert(channel);
        assert(channel->type == CONSUMER_CHANNEL_TYPE_METADATA);
@@ -1050,7 +1050,7 @@ int lttng_ustconsumer_recv_metadata(int sock, uint64_t key, uint64_t offset,
                uint64_t len, struct lttng_consumer_channel *channel,
                int timer, int wait)
 {
-       int ret, ret_code = LTTNG_OK;
+       int ret, ret_code = LTTCOMM_CONSUMERD_SUCCESS;
        char *metadata_str;
 
        DBG("UST consumer push metadata key %" PRIu64 " of len %" PRIu64, key, len);
@@ -1115,7 +1115,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                int sock, struct pollfd *consumer_sockpoll)
 {
        ssize_t ret;
-       enum lttng_error_code ret_code = LTTNG_OK;
+       enum lttcomm_return_code ret_code = LTTCOMM_CONSUMERD_SUCCESS;
        struct lttcomm_consumer_msg msg;
        struct lttng_consumer_channel *channel = NULL;
 
@@ -1257,9 +1257,16 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                attr.switch_timer_interval = msg.u.ask_channel.switch_timer_interval;
                attr.read_timer_interval = msg.u.ask_channel.read_timer_interval;
                attr.chan_id = msg.u.ask_channel.chan_id;
-               attr.output = msg.u.ask_channel.output;
                memcpy(attr.uuid, msg.u.ask_channel.uuid, sizeof(attr.uuid));
 
+               /* Match channel buffer type to the UST abi. */
+               switch (msg.u.ask_channel.output) {
+               case LTTNG_EVENT_MMAP:
+               default:
+                       attr.output = LTTNG_UST_MMAP;
+                       break;
+               }
+
                /* Translate and save channel type. */
                switch (msg.u.ask_channel.type) {
                case LTTNG_UST_CHAN_PER_CPU:
@@ -1452,7 +1459,7 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                health_code_update();
 
                /* Tell session daemon we are ready to receive the metadata. */
-               ret = consumer_send_status_msg(sock, LTTNG_OK);
+               ret = consumer_send_status_msg(sock, LTTCOMM_CONSUMERD_SUCCESS);
                if (ret < 0) {
                        /* Somehow, the session daemon is not responding anymore. */
                        goto error_fatal;
@@ -2164,7 +2171,7 @@ int lttng_ustconsumer_request_metadata(struct lttng_consumer_local_data *ctx,
 {
        struct lttcomm_metadata_request_msg request;
        struct lttcomm_consumer_msg msg;
-       enum lttng_error_code ret_code = LTTNG_OK;
+       enum lttcomm_return_code ret_code = LTTCOMM_CONSUMERD_SUCCESS;
        uint64_t len, key, offset;
        int ret;
 
@@ -2253,7 +2260,7 @@ int lttng_ustconsumer_request_metadata(struct lttng_consumer_local_data *ctx,
 
        /* Tell session daemon we are ready to receive the metadata. */
        ret = consumer_send_status_msg(ctx->consumer_metadata_socket,
-                       LTTNG_OK);
+                       LTTCOMM_CONSUMERD_SUCCESS);
        if (ret < 0 || len == 0) {
                /*
                 * Somehow, the session daemon is not responding anymore or there is
This page took 0.033604 seconds and 5 git commands to generate.