See bug #332.
The debug output now prints this and does not infinite loop:
DEBUG1: Communication interrupted on command socket [in
lttng_consumer_thread_receive_fds() at consumer.c:1784]
DEBUG1: consumer_thread_receive_fds exiting [in
lttng_consumer_thread_receive_fds() at consumer.c:1794]
Fixes #332
Signed-off-by: David Goulet <dgoulet@efficios.com>
DBG("Received STOP command");
goto end;
}
DBG("Received STOP command");
goto end;
}
- if (ret < 0) {
- ERR("Communication interrupted on command socket");
+ if (ret <= 0) {
+ /*
+ * This could simply be a session daemon quitting. Don't output
+ * ERR() here.
+ */
+ DBG("Communication interrupted on command socket");
goto end;
}
if (consumer_quit) {
goto end;
}
if (consumer_quit) {
} while (ret < 0 && errno == EINTR);
end_nosignal:
rcu_read_unlock();
} while (ret < 0 && errno == EINTR);
end_nosignal:
rcu_read_unlock();
+
+ /*
+ * Return 1 to indicate success since the 0 value can be a socket
+ * shutdown during the recv() or send() call.
+ */
+ return 1;
+/*
+ * Receive command from session daemon and process it.
+ *
+ * Return 1 on success else a negative value or 0.
+ */
int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
int sock, struct pollfd *consumer_sockpoll)
{
int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
int sock, struct pollfd *consumer_sockpoll)
{
ret = write(ctx->consumer_poll_pipe[1], "", 1);
} while (ret < 0 && errno == EINTR);
end_nosignal:
ret = write(ctx->consumer_poll_pipe[1], "", 1);
} while (ret < 0 && errno == EINTR);
end_nosignal:
- /* XXX: At some point we might want to return something else than zero */
+
+ /*
+ * Return 1 to indicate success since the 0 value can be a socket
+ * shutdown during the recv() or send() call.
+ */
+ return 1;
}
int lttng_ustconsumer_allocate_channel(struct lttng_consumer_channel *chan)
}
int lttng_ustconsumer_allocate_channel(struct lttng_consumer_channel *chan)