if we get EWOULDBLOCK on a write then reduce the amount of data we are
authorAndrew Tridgell <tridge@samba.org>
Fri, 19 Jun 1998 00:55:19 +0000 (00:55 +0000)
committerAndrew Tridgell <tridge@samba.org>
Fri, 19 Jun 1998 00:55:19 +0000 (00:55 +0000)
trying to write. This guarantees that the maximum amount of data that
can be written at any one time is written.

io.c

diff --git a/io.c b/io.c
index 7909e0b..d7140d2 100644 (file)
--- a/io.c
+++ b/io.c
@@ -319,6 +319,7 @@ static void writefd_unbuffered(int fd,char *buf,int len)
        int fd_count, count;
        struct timeval tv;
        int reading;
+       int blocked=0;
 
        no_flush++;
 
@@ -350,7 +351,8 @@ static void writefd_unbuffered(int fd,char *buf,int len)
                }
 
                if (FD_ISSET(fd, &w_fds)) {
-                       int ret = write(fd,buf+total,len-total);
+                       int n = (len-total)>>blocked;
+                       int ret = write(fd,buf+total,n?n:1);
 
                        if (ret == -1 && errno == EINTR) {
                                continue;
@@ -358,10 +360,7 @@ static void writefd_unbuffered(int fd,char *buf,int len)
 
                        if (ret == -1 && 
                            (errno == EAGAIN || errno == EWOULDBLOCK)) {
-                               /* this shouldn't happen, if it does then
-                                  sleep for a short time to prevent us
-                                  chewing too much CPU */
-                               u_sleep(100);
+                               blocked++;
                                continue;
                        }
 
@@ -370,6 +369,7 @@ static void writefd_unbuffered(int fd,char *buf,int len)
                                exit_cleanup(1);
                        }
 
+                       blocked = 0;
                        total += ret;
                        stats.total_written += ret;