The mechanism to detect the applications sockets close is racy and
could potentially discard data. A read(3) is performed on the application
socket and the returned len is compared to 0 to detect the case where an
application closed the socket. If a read(3) occur in the thread_manage_apps
*before* the consumption of the data in the consumer, one byte of data would
be discarded.
To fix this race, perform a recv(3) on the socket with the MSG_PEEK flag.
This has no impact on the data delivery to the consumer and can successfully
detect the applications sockets close.
char dummy;
do {
- readlen = read(pollfd, &dummy, 1);
+ readlen = recv(pollfd, &dummy, 1, MSG_PEEK);
} while (readlen == -1 && errno == EINTR);
+ /* Peer has performed an orderly shutdown */
if (readlen == 0) {
/* Removing from the poll set */
ret = lttng_poll_del(&events, pollfd);