X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0adb99b9dcbc5f5dbb0ee0ffb95df8b3710fcc22..c32d024071bd1519de936be65eaf8687260926ac:/io.c diff --git a/io.c b/io.c index fbaf6a3a..2f4162cd 100644 --- a/io.c +++ b/io.c @@ -27,6 +27,8 @@ /* if no timeout is specified then use a 60 second select timeout */ #define SELECT_TIMEOUT 60 +extern int bwlimit; + static int io_multiplexing_out; static int io_multiplexing_in; static int multiplex_in_fd; @@ -37,16 +39,10 @@ extern int verbose; extern int io_timeout; extern struct stats stats; -static int buffer_f_in = -1; static int io_error_fd = -1; static void read_loop(int fd, char *buf, int len); -void setup_readbuffer(int f_in) -{ - buffer_f_in = f_in; -} - static void check_timeout(void) { extern int am_server, am_daemon; @@ -321,11 +317,7 @@ unsigned char read_byte(int f) return c; } - - -/* write len bytes to fd, possibly reading from buffer_f_in if set - in order to unclog the pipe. don't return until all len - bytes have been written */ +/* write len bytes to fd */ static void writefd_unbuffered(int fd,char *buf,int len) { int total = 0; @@ -380,6 +372,7 @@ static void writefd_unbuffered(int fd,char *buf,int len) if (ret == -1 && (errno == EWOULDBLOCK || errno == EAGAIN)) { + msleep(1); continue; } @@ -388,6 +381,19 @@ static void writefd_unbuffered(int fd,char *buf,int len) exit_cleanup(RERR_STREAMIO); } + /* Sleep after writing to limit I/O bandwidth */ + if (bwlimit) + { + tv.tv_sec = 0; + tv.tv_usec = ret * 1000 / bwlimit; + while (tv.tv_usec > 1000000) + { + tv.tv_sec++; + tv.tv_usec -= 1000000; + } + select(0, NULL, NULL, NULL, &tv); + } + total += ret; if (io_timeout) @@ -458,6 +464,17 @@ void io_end_buffering(int fd) } } +/* some OSes have a bug where an exit causes the pending writes on + a socket to be flushed. Do an explicit shutdown to try to prevent this */ +void io_shutdown(void) +{ + if (multiplex_out_fd != -1) close(multiplex_out_fd); + if (io_error_fd != -1) close(io_error_fd); + multiplex_out_fd = -1; + io_error_fd = -1; +} + + static void writefd(int fd,char *buf,int len) { stats.total_written += len; @@ -608,8 +625,3 @@ void io_multiplexing_close(void) io_multiplexing_out = 0; } -void io_close_input(int fd) -{ - buffer_f_in = -1; -} -