]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-11467: [mod_verto] Properly handle poll() EINTR and separate `poll()==0` / timeout...
authorSergey Khripchenko <shripchenko@intermedia.net>
Thu, 18 Oct 2018 11:54:18 +0000 (04:54 -0700)
committerMike Jerris <mike@signalwire.com>
Thu, 6 Jun 2019 15:17:00 +0000 (11:17 -0400)
src/mod/endpoints/mod_verto/mod_verto.c

index e9f731419c1fc9f56d8789bc877e5c16125338b0..0db8a63f42659ba91b7650aef9f52b388b3e5f41 100644 (file)
@@ -1802,10 +1802,11 @@ done:
 
                        if (jsock->drop) { die("%s Dropping Connection\n", jsock->name); }
                        if (pflags < 0 && (errno != EINTR)) { die_errnof("%s POLL FAILED with %d", jsock->name, pflags); }
-                       if (pflags & SWITCH_POLL_HUP) { log_and_exit(SWITCH_LOG_INFO, "%s POLL HANGUP DETECTED (peer closed its end of socket)\n", jsock->name); }
-                       if (pflags & SWITCH_POLL_ERROR) { die("%s POLL ERROR\n", jsock->name); }
-                       if (pflags & SWITCH_POLL_INVALID) { die("%s POLL INVALID SOCKET (not opened or already closed)\n", jsock->name); }
-                       if (pflags & SWITCH_POLL_READ) {
+                       if (pflags == 0) { /* keepalive socket poll timeout */ break; }
+                       if (pflags > 0 && (pflags & SWITCH_POLL_HUP)) { log_and_exit(SWITCH_LOG_INFO, "%s POLL HANGUP DETECTED (peer closed its end of socket)\n", jsock->name); }
+                       if (pflags > 0 && (pflags & SWITCH_POLL_ERROR)) { die("%s POLL ERROR\n", jsock->name); }
+                       if (pflags > 0 && (pflags & SWITCH_POLL_INVALID)) { die("%s POLL INVALID SOCKET (not opened or already closed)\n", jsock->name); }
+                       if (pflags > 0 && (pflags & SWITCH_POLL_READ)) {
                                ssize_t bytes;
 
                                bytes = ws_raw_read(wsh, wsh->buffer + wsh->datalen, wsh->buflen - wsh->datalen - 1, wsh->block);
@@ -1835,8 +1836,6 @@ done:
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "socket %s is going to handle a new request\n", jsock->name);
                                        goto new_req;
                                }
-                       } else {
-                               break;
                        }
                }
        }
@@ -1872,10 +1871,11 @@ static void client_run(jsock_t *jsock)
 
                if (jsock->drop) { die("%s Dropping Connection\n", jsock->name); }
                if (pflags < 0 && (errno != EINTR)) { die_errnof("%s POLL FAILED with %d", jsock->name, pflags); }
-               if (pflags & SWITCH_POLL_HUP) { log_and_exit(SWITCH_LOG_INFO, "%s POLL HANGUP DETECTED (peer closed its end of socket)\n", jsock->name); }
-               if (pflags & SWITCH_POLL_ERROR) { die("%s POLL ERROR\n", jsock->name); }
-               if (pflags & SWITCH_POLL_INVALID) { die("%s POLL INVALID SOCKET (not opened or already closed)\n", jsock->name); }
-               if (pflags & SWITCH_POLL_READ) {
+               if (pflags == 0) {/* socket poll timeout */ jsock_check_event_queue(jsock); }
+               if (pflags > 0 && (pflags & SWITCH_POLL_HUP)) { log_and_exit(SWITCH_LOG_INFO, "%s POLL HANGUP DETECTED (peer closed its end of socket)\n", jsock->name); }
+               if (pflags > 0 && (pflags & SWITCH_POLL_ERROR)) { die("%s POLL ERROR\n", jsock->name); }
+               if (pflags > 0 && (pflags & SWITCH_POLL_INVALID)) { die("%s POLL INVALID SOCKET (not opened or already closed)\n", jsock->name); }
+               if (pflags > 0 && (pflags & SWITCH_POLL_READ)) {
                        switch_ssize_t bytes;
                        ws_opcode_t oc;
                        uint8_t *data;
@@ -1964,8 +1964,6 @@ static void client_run(jsock_t *jsock)
                                        switch_set_flag(jsock, JPFLAG_CHECK_ATTACH);
                                }
                        }
-               } else {
-                       jsock_check_event_queue(jsock);
                }
        }
 
@@ -4413,6 +4411,7 @@ static int profile_one_loop(verto_profile_t *profile)
                if (errno != EINTR) {
                        die_errnof("%s POLL FAILED with %d", profile->name, res);
                }
+               return 0;
        }
 
        if (res == 0) {