]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
wait there's more
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 16 Oct 2007 01:08:51 +0000 (01:08 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 16 Oct 2007 01:08:51 +0000 (01:08 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5884 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/switch_apr.c

index 13edebbf37e95653499d42172f17debec7111d95..c1b473ebc1412408ab6fa3b2750a3fe2b24f3fe9 100644 (file)
@@ -561,18 +561,24 @@ SWITCH_DECLARE(switch_status_t) switch_socket_connect(switch_socket_t * sock, sw
 
 SWITCH_DECLARE(switch_status_t) switch_socket_send(switch_socket_t * sock, const char *buf, switch_size_t *len)
 {
-       switch_status_t status;
-       switch_size_t req = *len, wrote = 0, need = 0;
-
-       status = apr_socket_send(sock, buf, len);
-       if (status == SWITCH_STATUS_SUCCESS) {
-               wrote = *len;
-               while (wrote < req && status == SWITCH_STATUS_SUCCESS) {
-                       need = req - wrote;
-                       status = apr_socket_send(sock, buf + wrote, &need);
-                       wrote += need;
+       switch_status_t status = SWITCH_STATUS_SUCCESS;
+       switch_size_t req = *len, wrote = 0, need = *len;
+       int to_count = 0;
+
+       while ((wrote < req && status == SWITCH_STATUS_SUCCESS) || (need == 0 && status == SWITCH_STATUS_BREAK)) {
+               need = req - wrote;
+               if ((status = apr_socket_send(sock, buf + wrote, &need)) == SWITCH_STATUS_BREAK) {
+                       if (++to_count > 10000) {
+                               status = SWITCH_STATUS_FALSE;
+                               break;
+                       }
+                       switch_yield(1000);
+               } else {
+                       to_count = 0;
                }
+               wrote += need;
        }
+       
        *len = wrote;
        return status;