#include "consumer.h"
#include "consumer-stream.h"
#include "consumer-testpoint.h"
+#include "align.h"
struct lttng_consumer_global_data consumer_data = {
.stream_count = 0,
struct lttng_consumer_channel *channel =
caa_container_of(node, struct lttng_consumer_channel, node);
+ switch (consumer_data.type) {
+ case LTTNG_CONSUMER_KERNEL:
+ break;
+ case LTTNG_CONSUMER32_UST:
+ case LTTNG_CONSUMER64_UST:
+ lttng_ustconsumer_free_channel(channel);
+ break;
+ default:
+ ERR("Unknown consumer_data type");
+ abort();
+ }
free(channel);
}
stream->endpoint_status = CONSUMER_ENDPOINT_ACTIVE;
stream->index_fd = -1;
pthread_mutex_init(&stream->lock, NULL);
+ pthread_mutex_init(&stream->metadata_timer_lock, NULL);
/* If channel is the metadata, flag this stream as metadata. */
if (type == CONSUMER_CHANNEL_TYPE_METADATA) {
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 *root_shm_path,
+ const char *shm_path)
{
struct lttng_consumer_channel *channel;
strncpy(channel->name, name, sizeof(channel->name));
channel->name[sizeof(channel->name) - 1] = '\0';
+ if (root_shm_path) {
+ strncpy(channel->root_shm_path, root_shm_path, sizeof(channel->root_shm_path));
+ channel->root_shm_path[sizeof(channel->root_shm_path) - 1] = '\0';
+ }
+ if (shm_path) {
+ strncpy(channel->shm_path, shm_path, sizeof(channel->shm_path));
+ channel->shm_path[sizeof(channel->shm_path) - 1] = '\0';
+ }
+
lttng_ht_node_init_u64(&channel->node, channel->key);
channel->wait_fd = -1;
DBG("Metadata main loop started");
while (1) {
- health_code_update();
-
- /* Only the metadata pipe is set */
- if (LTTNG_POLL_GETNB(&events) == 0 && consumer_quit == 1) {
- err = 0; /* All is OK */
- goto end;
- }
-
restart:
- DBG("Metadata poll wait with %d fd(s)", LTTNG_POLL_GETNB(&events));
+ health_code_update();
health_poll_entry();
+ DBG("Metadata poll wait");
ret = lttng_poll_wait(&events, -1);
+ DBG("Metadata poll return from wait with %d fd(s)",
+ LTTNG_POLL_GETNB(&events));
health_poll_exit();
DBG("Metadata event catched in thread");
if (ret < 0) {
ERR("Poll EINTR catched");
goto restart;
}
- goto error;
+ if (LTTNG_POLL_GETNB(&events) == 0) {
+ err = 0; /* All is OK */
+ }
+ goto end;
}
nb_fd = ret;
revents = LTTNG_POLL_GETEV(&events, i);
pollfd = LTTNG_POLL_GETFD(&events, i);
+ if (!revents) {
+ /* No activity for this FD (poll implementation). */
+ continue;
+ }
+
if (pollfd == lttng_pipe_get_readfd(ctx->consumer_metadata_pipe)) {
if (revents & (LPOLLERR | LPOLLHUP )) {
DBG("Metadata thread pipe hung up");
/* All is OK */
err = 0;
-error:
end:
DBG("Metadata poll thread exiting");
DBG("Channel main loop started");
while (1) {
- health_code_update();
-
- /* Only the channel pipe is set */
- if (LTTNG_POLL_GETNB(&events) == 0 && consumer_quit == 1) {
- err = 0; /* All is OK */
- goto end;
- }
-
restart:
- DBG("Channel poll wait with %d fd(s)", LTTNG_POLL_GETNB(&events));
+ health_code_update();
+ DBG("Channel poll wait");
health_poll_entry();
ret = lttng_poll_wait(&events, -1);
+ DBG("Channel poll return from wait with %d fd(s)",
+ LTTNG_POLL_GETNB(&events));
health_poll_exit();
DBG("Channel event catched in thread");
if (ret < 0) {
ERR("Poll EINTR catched");
goto restart;
}
+ if (LTTNG_POLL_GETNB(&events) == 0) {
+ err = 0; /* All is OK */
+ }
goto end;
}
revents = LTTNG_POLL_GETEV(&events, i);
pollfd = LTTNG_POLL_GETFD(&events, i);
- /* Just don't waste time if no returned events for the fd */
if (!revents) {
+ /* No activity for this FD (poll implementation). */
continue;
}
+
if (pollfd == ctx->consumer_channel_pipe[0]) {
if (revents & (LPOLLERR | LPOLLHUP)) {
DBG("Channel thread pipe hung up");
return lttcomm_send_unix_sock(sock, &msg, sizeof(msg));
}
-/*
- * Using a maximum stream size with the produced and consumed position of a
- * stream, computes the new consumed position to be as close as possible to the
- * maximum possible stream size.
- *
- * If maximum stream size is lower than the possible buffer size (produced -
- * consumed), the consumed_pos given is returned untouched else the new value
- * is returned.
- */
-unsigned long consumer_get_consumed_maxsize(unsigned long consumed_pos,
- unsigned long produced_pos, uint64_t max_stream_size)
+unsigned long consumer_get_consume_start_pos(unsigned long consumed_pos,
+ unsigned long produced_pos, uint64_t nb_packets_per_stream,
+ uint64_t max_sb_size)
{
- if (max_stream_size && max_stream_size < (produced_pos - consumed_pos)) {
- /* Offset from the produced position to get the latest buffers. */
- return produced_pos - max_stream_size;
- }
+ unsigned long start_pos;
- return consumed_pos;
+ if (!nb_packets_per_stream) {
+ return consumed_pos; /* Grab everything */
+ }
+ start_pos = produced_pos - offset_align_floor(produced_pos, max_sb_size);
+ start_pos -= max_sb_size * nb_packets_per_stream;
+ if ((long) (start_pos - consumed_pos) < 0) {
+ return consumed_pos; /* Grab everything */
+ }
+ return start_pos;
}