Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
include/exclude cluestick: with -vv, print out whether files are
[rsync/rsync.git]
/
io.c
diff --git
a/io.c
b/io.c
index
fbaf6a3
..
2f4162c
100644
(file)
--- 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
/* 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;
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;
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);
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;
static void check_timeout(void)
{
extern int am_server, am_daemon;
@@
-321,11
+317,7
@@
unsigned char read_byte(int f)
return c;
}
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;
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)) {
if (ret == -1 &&
(errno == EWOULDBLOCK || errno == EAGAIN)) {
+ msleep(1);
continue;
}
continue;
}
@@
-388,6
+381,19
@@
static void writefd_unbuffered(int fd,char *buf,int len)
exit_cleanup(RERR_STREAMIO);
}
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)
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;
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;
}
io_multiplexing_out = 0;
}
-void io_close_input(int fd)
-{
- buffer_f_in = -1;
-}
-