]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Added a tight loop around the legacy push function
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Mon, 23 Mar 2015 21:29:23 +0000 (22:29 +0100)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Fri, 27 Mar 2015 17:04:29 +0000 (18:04 +0100)
That reduces the need for more expensive outer loops.
Originally suggested by Anton Lavrentiev.

lib/gnutls_buffers.c

index ba2353936fd2031a5b2c13c27554b025eca1099e..37d0a8923469bcec0beeebd9eeb190284f1dea29 100644 (file)
@@ -440,9 +440,22 @@ _gnutls_writev_emu(gnutls_session_t session, gnutls_transport_ptr_t fd,
                if (vec) {
                        ret = session->internals.vec_push_func(fd, &giovec[j], 1);
                } else {
-                       ret =
-                           session->internals.push_func(fd, giovec[j].iov_base,
-                                                        giovec[j].iov_len);
+                       size_t sent = 0;
+                       ssize_t left = giovec[j].iov_len;
+                       char *p = giovec[j].iov_base;
+                       do {
+                               ret =
+                                   session->internals.push_func(fd, p,
+                                                                left);
+                               if (ret > 0) {
+                                       sent += ret;
+                                       left -= ret;
+                                       p += ret;
+                               }
+                       } while(ret > 0 && left > 0);
+
+                       if (sent > 0)
+                               ret = sent;
                }
 
                if (ret == -1) {