treat EINTR returns as a BREAK (now mapped to SWITCH_STATUS_INTR), we appriciate the interrupted syscalls but we would like to continue working properly

This commit is contained in:
Anthony Minessale 2011-01-11 15:09:03 -06:00
parent ef880c53b2
commit 316963c594
3 changed files with 17 additions and 9 deletions

View File

@ -859,7 +859,7 @@ typedef enum {
SWITCH_STATUS_FALSE, SWITCH_STATUS_FALSE,
SWITCH_STATUS_TIMEOUT, SWITCH_STATUS_TIMEOUT,
SWITCH_STATUS_RESTART, SWITCH_STATUS_RESTART,
SWITCH_STATUS_TERM, SWITCH_STATUS_INTR,
SWITCH_STATUS_NOTIMPL, SWITCH_STATUS_NOTIMPL,
SWITCH_STATUS_MEMERR, SWITCH_STATUS_MEMERR,
SWITCH_STATUS_NOOP, SWITCH_STATUS_NOOP,
@ -876,6 +876,7 @@ typedef enum {
SWITCH_STATUS_TOO_SMALL, SWITCH_STATUS_TOO_SMALL,
SWITCH_STATUS_FOUND, SWITCH_STATUS_FOUND,
SWITCH_STATUS_CONTINUE, SWITCH_STATUS_CONTINUE,
SWITCH_STATUS_TERM,
SWITCH_STATUS_NOT_INITALIZED SWITCH_STATUS_NOT_INITALIZED
} switch_status_t; } switch_status_t;

View File

@ -327,7 +327,7 @@ SWITCH_DECLARE(unsigned short) get_port(struct sockaddr *sa);
*/ */
SWITCH_DECLARE(int) switch_build_uri(char *uri, switch_size_t size, const char *scheme, const char *user, const switch_sockaddr_t *sa, int flags); SWITCH_DECLARE(int) switch_build_uri(char *uri, switch_size_t size, const char *scheme, const char *user, const switch_sockaddr_t *sa, int flags);
#define SWITCH_STATUS_IS_BREAK(x) (x == SWITCH_STATUS_BREAK || x == 730035 || x == 35) #define SWITCH_STATUS_IS_BREAK(x) (x == SWITCH_STATUS_BREAK || x == 730035 || x == 35 || x == SWITCH_STATUS_INTR)
/*! /*!
\brief Return a printable name of a switch_priority_t \brief Return a printable name of a switch_priority_t

View File

@ -2440,6 +2440,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
recvfrom: recvfrom:
bytes = 0; bytes = 0;
read_loops++; read_loops++;
poll_loop = 0;
if (!switch_rtp_ready(rtp_session)) { if (!switch_rtp_ready(rtp_session)) {
break; break;
@ -2466,21 +2467,27 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
status = read_rtp_packet(rtp_session, &bytes, flags); status = read_rtp_packet(rtp_session, &bytes, flags);
} else { } else {
if (!SWITCH_STATUS_IS_BREAK(poll_status) && poll_status != SWITCH_STATUS_TIMEOUT) { if (!SWITCH_STATUS_IS_BREAK(poll_status) && poll_status != SWITCH_STATUS_TIMEOUT) {
char tmp[128] = "";
strerror_r(poll_status, tmp, sizeof(tmp));
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Poll failed with error: %d [%s]\n", poll_status, tmp);
ret = -1; ret = -1;
goto end; goto end;
} }
poll_loop = 1; poll_loop = 1;
rtp_session->missed_count += (poll_sec * 1000) / (rtp_session->ms_per_packet ? rtp_session->ms_per_packet / 1000 : 20);
bytes = 0;
if (rtp_session->max_missed_packets) { if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_UDPTL)) {
if (rtp_session->missed_count >= rtp_session->max_missed_packets) { rtp_session->missed_count += (poll_sec * 1000) / (rtp_session->ms_per_packet ? rtp_session->ms_per_packet / 1000 : 20);
ret = -2; bytes = 0;
goto end;
if (rtp_session->max_missed_packets) {
if (rtp_session->missed_count >= rtp_session->max_missed_packets) {
ret = -2;
goto end;
}
} }
} }
if ((!(io_flags & SWITCH_IO_FLAG_NOBLOCK)) && if ((!(io_flags & SWITCH_IO_FLAG_NOBLOCK)) &&
(rtp_session->dtmf_data.out_digit_dur == 0 || switch_test_flag(rtp_session, SWITCH_RTP_FLAG_VIDEO))) { (rtp_session->dtmf_data.out_digit_dur == 0 || switch_test_flag(rtp_session, SWITCH_RTP_FLAG_VIDEO))) {
return_cng_frame(); return_cng_frame();