diff options
author | Andrew Tridgell <tridge@samba.org> | 1998-05-15 07:34:19 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1998-05-15 07:34:19 +0000 |
commit | d6dead6bb15edc672b188bc2941ab02744a899bb (patch) | |
tree | dacefbb6f2d55eeb4d5ea8efb70b445882947456 | |
parent | 344fb1276b0215f7b3fb5067fae69619691541c8 (diff) | |
download | rsync-d6dead6bb15edc672b188bc2941ab02744a899bb.tar.gz |
added write buffering during the file list sending. This makes things
a bit more efficient (less system calls)
-rw-r--r-- | flist.c | 10 | ||||
-rw-r--r-- | io.c | 54 | ||||
-rw-r--r-- | rsync.h | 1 |
3 files changed, 63 insertions, 2 deletions
@@ -573,6 +573,10 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) flist->malloced); if (!flist->files) out_of_memory("send_file_list"); + if (f != -1) { + io_start_buffering(f); + } + for (i=0;i<argc;i++) { char fname2[MAXPATHLEN]; char *fname = fname2; @@ -658,7 +662,6 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) if (f != -1) { send_file_entry(NULL,f,0); - write_flush(f); } if (verbose && recurse && !am_server && f != -1) @@ -677,6 +680,11 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) write_int(f, io_error); } + if (f != -1) { + io_end_buffering(f); + write_flush(f); + } + if (verbose > 2) rprintf(FINFO,"send_file_list done\n"); @@ -301,7 +301,7 @@ int write_file(int f,char *buf,int len) } -static int writefd(int fd,char *buf,int len) +static int writefd_unbuffered(int fd,char *buf,int len) { int total = 0; fd_set w_fds, r_fds; @@ -375,6 +375,58 @@ static int writefd(int fd,char *buf,int len) return total; } +static char *io_buffer; +static int io_buffer_count; + +void io_start_buffering(int fd) +{ + io_buffer = (char *)malloc(IO_BUFFER_SIZE); + if (!io_buffer) out_of_memory("writefd"); + io_buffer_count = 0; +} + +void io_end_buffering(int fd) +{ + if (io_buffer_count) { + if (writefd_unbuffered(fd, io_buffer, + io_buffer_count) != + io_buffer_count) { + rprintf(FERROR,"write failed\n"); + exit_cleanup(1); + } + io_buffer_count = 0; + } + free(io_buffer); + io_buffer = NULL; +} + +static int writefd(int fd,char *buf,int len1) +{ + int len = len1; + + if (!io_buffer) return writefd_unbuffered(fd, buf, len); + + while (len) { + int n = MIN(len, IO_BUFFER_SIZE-io_buffer_count); + if (n > 0) { + memcpy(io_buffer+io_buffer_count, buf, n); + buf += n; + len -= n; + io_buffer_count += n; + } + + if (io_buffer_count == IO_BUFFER_SIZE) { + if (writefd_unbuffered(fd, io_buffer, + io_buffer_count) != + io_buffer_count) { + return -1; + } + io_buffer_count = 0; + } + } + + return len1; +} void write_int(int f,int32 x) @@ -51,6 +51,7 @@ #define WRITE_SIZE (32*1024) #define CHUNK_SIZE (32*1024) #define MAX_MAP_SIZE (4*1024*1024) +#define IO_BUFFER_SIZE (4096) #define MAX_ARGS 1000 |