Check if channel has closed stream in channel poll for CPU hotplug
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 14 Jul 2011 18:09:09 +0000 (14:09 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 14 Jul 2011 18:09:09 +0000 (14:09 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
ltt-debugfs-abi.c
ltt-events.h
ltt-ring-buffer-client.h
ltt-ring-buffer-metadata-client.h

index 0aa2cec03381ea0f58d121f1136cc6e7544b9455..72077183aaa5c01acc48a85a0e3aeaa527e85363 100644 (file)
@@ -609,8 +609,9 @@ unsigned int lttng_channel_poll(struct file *file, poll_table *wait)
                        return POLLERR;
                if (channel->ops->is_finalized(channel->chan))
                        return POLLHUP;
-               else
+               if (channel->ops->buffer_has_read_closed_stream(channel->chan))
                        return POLLIN | POLLRDNORM;
+               return 0;
        }
        return mask;
 
index 1307c36b6d0b8b7ca56014a5cb3f3078a283f3e0..304bcb69989b406d8c3b02d76f3320ca5321324c 100644 (file)
@@ -191,6 +191,7 @@ struct ltt_channel_ops {
                                unsigned int read_timer_interval);
        void (*channel_destroy)(struct channel *chan);
        struct lib_ring_buffer *(*buffer_read_open)(struct channel *chan);
+       int (*buffer_has_read_closed_stream)(struct channel *chan);
        void (*buffer_read_close)(struct lib_ring_buffer *buf);
        int (*event_reserve)(struct lib_ring_buffer_ctx *ctx,
                             uint32_t event_id);
index 39587dd0b15f2054454a57bda420cc78ec680a62..25152bf35587e2c86dcd948a4932ae27d6f33910 100644 (file)
@@ -399,6 +399,20 @@ struct lib_ring_buffer *ltt_buffer_read_open(struct channel *chan)
        return NULL;
 }
 
+static
+int ltt_buffer_has_read_closed_stream(struct channel *chan)
+{
+       struct lib_ring_buffer *buf;
+       int cpu;
+
+       for_each_channel_cpu(cpu, chan) {
+               buf = channel_get_ring_buffer(&client_config, chan, cpu);
+               if (!atomic_long_read(&buf->active_readers))
+                       return 1;
+       }
+       return 0;
+}
+
 static
 void ltt_buffer_read_close(struct lib_ring_buffer *buf)
 {
@@ -485,6 +499,8 @@ static struct ltt_transport ltt_relay_transport = {
                .channel_create = _channel_create,
                .channel_destroy = ltt_channel_destroy,
                .buffer_read_open = ltt_buffer_read_open,
+               .buffer_has_read_closed_stream =
+                       ltt_buffer_has_read_closed_stream,
                .buffer_read_close = ltt_buffer_read_close,
                .event_reserve = ltt_event_reserve,
                .event_commit = ltt_event_commit,
index 43a711caa29c5da4ce4bbf7fea331c0eeeb4ed23..06936aaa93cef7b12f28931d71767ded09dbff36 100644 (file)
@@ -177,6 +177,20 @@ struct lib_ring_buffer *ltt_buffer_read_open(struct channel *chan)
        return NULL;
 }
 
+static
+int ltt_buffer_has_read_closed_stream(struct channel *chan)
+{
+       struct lib_ring_buffer *buf;
+       int cpu;
+
+       for_each_channel_cpu(cpu, chan) {
+               buf = channel_get_ring_buffer(&client_config, chan, cpu);
+               if (!atomic_long_read(&buf->active_readers))
+                       return 1;
+       }
+       return 0;
+}
+
 static
 void ltt_buffer_read_close(struct lib_ring_buffer *buf)
 {
@@ -250,6 +264,8 @@ static struct ltt_transport ltt_relay_transport = {
                .channel_create = _channel_create,
                .channel_destroy = ltt_channel_destroy,
                .buffer_read_open = ltt_buffer_read_open,
+               .buffer_has_read_closed_stream =
+                       ltt_buffer_has_read_closed_stream,
                .buffer_read_close = ltt_buffer_read_close,
                .event_reserve = ltt_event_reserve,
                .event_commit = ltt_event_commit,
This page took 0.028052 seconds and 4 git commands to generate.