X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fconsumer.c;h=bf477933515502510c284c58762b56d2b4399f75;hp=1e20948887b1f889ae67bb81e3e844499edef869;hb=76f66f6356f4ad6bebc7b69b3856d2529c102106;hpb=c801b30e68fa643d789a8f0912a278bf1c2683ca diff --git a/src/bin/lttng-sessiond/consumer.c b/src/bin/lttng-sessiond/consumer.c index 1e2094888..bf4779335 100644 --- a/src/bin/lttng-sessiond/consumer.c +++ b/src/bin/lttng-sessiond/consumer.c @@ -314,6 +314,7 @@ void consumer_destroy_output(struct consumer_output *obj) */ struct consumer_output *consumer_copy_output(struct consumer_output *obj) { + struct lttng_ht *tmp_ht_ptr; struct lttng_ht_iter iter; struct consumer_socket *socket, *copy_sock; struct consumer_output *output; @@ -324,11 +325,13 @@ struct consumer_output *consumer_copy_output(struct consumer_output *obj) if (output == NULL) { goto error; } + /* Avoid losing the HT reference after the memcpy() */ + tmp_ht_ptr = output->socks; memcpy(output, obj, sizeof(struct consumer_output)); - /* Copy sockets */ - output->socks = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG); + /* Putting back the HT pointer and start copying socket(s). */ + output->socks = tmp_ht_ptr; cds_lfht_for_each_entry(obj->socks->ht, &iter.iter, socket, node.node) { /* Create new socket object. */ @@ -337,6 +340,7 @@ struct consumer_output *consumer_copy_output(struct consumer_output *obj) goto malloc_error; } + copy_sock->registered = socket->registered; copy_sock->lock = socket->lock; consumer_add_socket(copy_sock, output); } @@ -697,28 +701,28 @@ error: } /* - * Ask the consumer if the data is ready to bread (available) for the specific + * Ask the consumer if the data is ready to read (NOT pending) for the specific * session id. * * This function has a different behavior with the consumer i.e. that it waits - * for a reply from the consumer if yes or no the data is available. + * for a reply from the consumer if yes or no the data is pending. */ -int consumer_is_data_available(unsigned int id, +int consumer_is_data_pending(unsigned int id, struct consumer_output *consumer) { int ret; - int32_t ret_code = 1; /* Default is that the data is available */ + int32_t ret_code = 0; /* Default is that the data is NOT pending */ struct consumer_socket *socket; struct lttng_ht_iter iter; struct lttcomm_consumer_msg msg; assert(consumer); - msg.cmd_type = LTTNG_CONSUMER_DATA_AVAILABLE; + msg.cmd_type = LTTNG_CONSUMER_DATA_PENDING; - msg.u.data_available.session_id = (uint64_t) id; + msg.u.data_pending.session_id = (uint64_t) id; - DBG3("Consumer data available for id %u", id); + DBG3("Consumer data pending for id %u", id); /* Send command for each consumer */ cds_lfht_for_each_entry(consumer->socks->ht, &iter.iter, socket, @@ -730,30 +734,26 @@ int consumer_is_data_available(unsigned int id, ret = lttcomm_send_unix_sock(socket->fd, &msg, sizeof(msg)); if (ret < 0) { - PERROR("send consumer data available command"); + PERROR("send consumer data pending command"); pthread_mutex_unlock(socket->lock); goto error; } - /* - * Waiting for the reply code where 0 the data is not available and 1 - * it is for trace reading. - */ ret = lttcomm_recv_unix_sock(socket->fd, &ret_code, sizeof(ret_code)); if (ret < 0) { - PERROR("recv consumer data available status"); + PERROR("recv consumer data pending status"); pthread_mutex_unlock(socket->lock); goto error; } pthread_mutex_unlock(socket->lock); - if (ret_code == 0) { + if (ret_code == 1) { break; } } - DBG("Consumer data available ret %d", ret_code); + DBG("Consumer data pending ret %d", ret_code); return ret_code; error: