If you try this out, please send some email to wayned@samba.org or the rsync
mailing list with your results, build changes, bug reports, etc. Thanks!
-After applying this patch, run these commands for a successful build:
+To use this patch, run these commands for a successful build:
- ./prepare-source
- ./configure (optional if already run)
+ patch -p1 <patches/threaded-receiver.diff
+ ./configure
make
--- old/Makefile.in
+static int GEN_make_backups;
+static int GEN_csum_length;
+
- /* For calling delete_file() */
- #define DEL_FORCE_RECURSE (1<<1) /* recurse even w/o --force */
- #define DEL_TERSE (1<<3)
-@@ -445,8 +449,8 @@ static void sum_sizes_sqroot(struct sum_
+ /* For calling delete_item() */
+ #define DEL_RECURSE (1<<1) /* recurse */
+
+@@ -477,8 +481,8 @@ static void sum_sizes_sqroot(struct sum_
}
if (protocol_version < 27) {
s2length = SUM_LENGTH;
} else {
int32 c;
-@@ -456,7 +460,7 @@ static void sum_sizes_sqroot(struct sum_
+@@ -488,7 +492,7 @@ static void sum_sizes_sqroot(struct sum_
for (c = blength; (c >>= 1) && b; b--) {}
/* add a bit, subtract rollsum, round up. */
s2length = (b + 1 - 32 + 7) / 8; /* --optimize in compiler-- */
s2length = MIN(s2length, SUM_LENGTH);
}
-@@ -490,7 +494,7 @@ static void generate_and_send_sums(int f
+@@ -522,7 +526,7 @@ static void generate_and_send_sums(int f
sum_sizes_sqroot(&sum, len);
write_sum_head(f_out, &sum);
return;
if (len > 0)
-@@ -509,7 +513,7 @@ static void generate_and_send_sums(int f
+@@ -541,7 +545,7 @@ static void generate_and_send_sums(int f
if (f_copy >= 0) {
full_write(f_copy, map, n1);
continue;
}
-@@ -1205,7 +1209,7 @@ static void recv_generator(char *fname,
+@@ -1316,7 +1320,7 @@ static void recv_generator(char *fname,
return;
}
return;
if (fnamecmp_type <= FNAMECMP_BASIS_DIR_HIGH)
-@@ -1268,7 +1272,7 @@ static void recv_generator(char *fname,
+@@ -1379,7 +1383,7 @@ static void recv_generator(char *fname,
goto notify_others;
}
if (!(backupptr = get_backup_name(fname))) {
close(fd);
return;
-@@ -1359,9 +1363,12 @@ void generate_files(int f_out, struct fi
+@@ -1470,9 +1474,12 @@ void generate_files(int f_out, struct fi
int save_ignore_existing = ignore_existing;
int save_ignore_non_existing = ignore_non_existing;
int save_do_progress = do_progress;
if (protocol_version >= 29) {
itemizing = 1;
maybe_ATTRS_REPORT = stdout_format_has_i ? 0 : ATTRS_REPORT;
-@@ -1389,7 +1396,7 @@ void generate_files(int f_out, struct fi
+@@ -1500,7 +1507,7 @@ void generate_files(int f_out, struct fi
do_delete_pass(flist);
do_progress = 0;
whole_file = 0;
if (verbose >= 2) {
rprintf(FINFO, "delta-transmission %s\n",
-@@ -1398,12 +1405,6 @@ void generate_files(int f_out, struct fi
+@@ -1509,12 +1516,6 @@ void generate_files(int f_out, struct fi
: "enabled");
}
for (i = 0; i < flist->count; i++) {
struct file_struct *file = flist->files[i];
-@@ -1447,23 +1448,34 @@ void generate_files(int f_out, struct fi
+@@ -1558,23 +1559,34 @@ void generate_files(int f_out, struct fi
delete_in_dir(NULL, NULL, NULL, NULL);
phase++;
if (local_name)
strlcpy(fbuf, local_name, sizeof fbuf);
else
-@@ -1475,27 +1487,43 @@ void generate_files(int f_out, struct fi
+@@ -1586,27 +1598,43 @@ void generate_files(int f_out, struct fi
phase++;
ignore_non_existing = save_ignore_non_existing;
ignore_existing = save_ignore_existing;
- if (fd_pair(error_pipe) < 0) {
- rsyserr(FERROR, errno, "pipe failed in do_recv");
+- exit_cleanup(RERR_IPC);
+- }
+-
+- io_flush(NORMAL_FLUSH);
+-
+- if ((pid = do_fork()) == -1) {
+- rsyserr(FERROR, errno, "fork failed in do_recv");
+ args.f_in = f_in;
+ args.flist = flist;
+ args.local_name = local_name;
exit_cleanup(RERR_IPC);
}
-- io_flush(NORMAL_FLUSH);
--
-- if ((pid = do_fork()) == -1) {
-- rsyserr(FERROR, errno, "fork failed in do_recv");
-- exit_cleanup(RERR_IPC);
-- }
--
- if (pid == 0) {
- close(error_pipe[0]);
- if (f_in != f_out)
int keep_partial = 0;
int safe_symlinks = 0;
int copy_unsafe_links = 0;
-@@ -1302,6 +1302,7 @@ int parse_arguments(int *argc, const cha
+@@ -1306,6 +1306,7 @@ int parse_arguments(int *argc, const cha
if (do_progress && !verbose && !log_before_transfer && !am_server)
verbose = 1;
}
--- old/rsync.h
+++ new/rsync.h
-@@ -169,10 +169,8 @@ enum msgcode {
+@@ -170,10 +170,8 @@ enum msgcode {
MSG_DATA=0, /* raw data on the multiplexed stream */
MSG_ERROR=FERROR, MSG_INFO=FINFO, /* remote logging */
MSG_LOG=FLOG, MSG_SOCKERR=FSOCKERR, /* sibling logging */
};
#include "errcode.h"
-@@ -329,6 +327,7 @@ enum msgcode {
+@@ -330,6 +328,7 @@ enum msgcode {
#endif
#include <assert.h>