From: Andrew Tridgell Date: Fri, 19 Jun 1998 00:55:19 +0000 (+0000) Subject: if we get EWOULDBLOCK on a write then reduce the amount of data we are X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/commitdiff_plain/bf9f01689f9cba70ed595ddcfabdf92d4b03cb80 if we get EWOULDBLOCK on a write then reduce the amount of data we are trying to write. This guarantees that the maximum amount of data that can be written at any one time is written. --- diff --git a/io.c b/io.c index 7909e0b1..d7140d26 100644 --- 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;