X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcommon%2Fkernel-consumer%2Fkernel-consumer.c;h=196deee9a153e521447703915d9ee9d2790502a4;hb=9449cc7574c27419ac4424b4653a6f4428d01b4d;hp=46413eda6e710d9e2f934df9e49336a5fd6fcef0;hpb=ca22feea083301934d1c8511851c86fb008c0697;p=lttng-tools.git diff --git a/src/common/kernel-consumer/kernel-consumer.c b/src/common/kernel-consumer/kernel-consumer.c index 46413eda6..196deee9a 100644 --- a/src/common/kernel-consumer/kernel-consumer.c +++ b/src/common/kernel-consumer/kernel-consumer.c @@ -282,8 +282,19 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx, } case LTTNG_CONSUMER_DATA_AVAILABLE: { - rcu_read_unlock(); - return -ENOSYS; + int32_t ret; + uint64_t id = msg.u.data_available.session_id; + + DBG("Kernel consumer data available command for id %" PRIu64, id); + + ret = consumer_data_available(id); + + /* Send back returned value to session daemon */ + ret = lttcomm_send_unix_sock(sock, &ret, sizeof(ret)); + if (ret < 0) { + PERROR("send data available ret code"); + } + break; } default: goto end_nosignal; @@ -474,7 +485,8 @@ error: /* * Check if data is still being extracted from the buffers for a specific - * stream. Consumer data lock MUST be acquired before calling this function. + * stream. Consumer data lock MUST be acquired before calling this function + * and the stream lock. * * Return 0 if the traced data are still getting read else 1 meaning that the * data is available for trace viewer reading. @@ -485,29 +497,17 @@ int lttng_kconsumer_data_available(struct lttng_consumer_stream *stream) assert(stream); - /* - * Try to lock the stream mutex. On failure, we know that the stream is - * being used else where hence there is data still being extracted. - */ - ret = pthread_mutex_trylock(&stream->lock); - if (ret == EBUSY) { - goto data_not_available; - } - /* The stream is now locked so we can do our ustctl calls */ - ret = kernctl_get_next_subbuf(stream->wait_fd); if (ret == 0) { /* There is still data so let's put back this subbuffer. */ ret = kernctl_put_subbuf(stream->wait_fd); assert(ret == 0); - pthread_mutex_unlock(&stream->lock); - goto data_not_available; + goto end; } /* Data is available to be read for this stream. */ - pthread_mutex_unlock(&stream->lock); - return 1; + ret = 1; -data_not_available: - return 0; +end: + return ret; }