ret = lttcomm_send_unix_sock_non_block(client->socket,
client->communication.outbound.buffer.data,
to_send_count);
- if ((ret < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) ||
- (ret > 0 && ret < to_send_count)) {
+ if ((ret >= 0 && ret < to_send_count)) {
DBG("[notification-thread] Client (socket fd = %i) outgoing queue could not be completely flushed",
client->socket);
to_send_count -= max(ret, 0);
* Receive data of size len in put that data into the buf param. Using recvmsg
* API. Only use with sockets set in non-blocking mode.
*
+ * NOTE: EPIPE errors are NOT reported. This call expects the socket to be in a
+ * poll set. The poll loop will handle the EPIPE original cause.
+ *
* Return the size of received data.
*/
LTTNG_HIDDEN
if (errno == EINTR) {
goto retry;
} else {
- /* We consider EPIPE and EAGAIN as expected. */
- if (!lttng_opt_quiet &&
- (errno != EPIPE && errno != EAGAIN)) {
- PERROR("recvmsg");
+ /*
+ * We consider EPIPE and EAGAIN/EWOULDBLOCK as expected.
+ */
+ if (errno == EAGAIN || errno == EWOULDBLOCK ||
+ errno == EPIPE) {
+ /*
+ * Nothing was recv.
+ */
+ ret = 0;
+ goto end;
}
+
+ /* Unexpected error */
+ PERROR("recvmsg");
+ ret = -1;
goto end;
}
}
* of the function is that this one does not retry to send on partial sends,
* except if the interruption was caused by a signal (EINTR).
*
+ * NOTE: EPIPE errors are NOT reported. This call expects the socket to be in a
+ * poll set. The poll loop will handle the EPIPE original cause.
+ *
* Return the size of sent data.
*/
LTTNG_HIDDEN
if (errno == EINTR) {
goto retry;
} else {
- /* We consider EPIPE and EAGAIN as expected. */
- if (!lttng_opt_quiet &&
- (errno != EPIPE && errno != EAGAIN)) {
- PERROR("sendmsg");
+ /*
+ * We consider EPIPE and EAGAIN/EWOULDBLOCK as expected.
+ */
+ if (errno == EAGAIN || errno == EWOULDBLOCK ||
+ errno == EPIPE) {
+ /*
+ * This can happen in non blocking mode.
+ * Nothing was sent.
+ */
+ ret = 0;
+ goto end;
}
+
+ /* Unexpected error */
+ PERROR("sendmsg");
+ ret = -1;
goto end;
}
}