summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonovan Baarda <abo@minkirri.apana.org.au>2021-09-14 16:44:55 +1000
committerDonovan Baarda <abo@minkirri.apana.org.au>2021-09-14 16:44:55 +1000
commit6f7a5f7f82c165a66048e5b644835f7b1bcc1e52 (patch)
tree08a4e7d5b6387997da49b85683a51d7e25691f10
parentf330d5e50c904fe1f732471bc52c2b2af4bbd818 (diff)
downloadlibrsync-6f7a5f7f82c165a66048e5b644835f7b1bcc1e52.tar.gz
Add MAX_DELTA_CMD in job.h for buffer scaling.
This gives us a single point for defining the size used for delta commands and streaming buffers. In job.h define MAX_DELTA_CMD to be the maximum size of a single delta command at 64K. In delta.c use MAX_DELTA_CMD to define MAX_MISS_LEN and use it to get the minimum readahead size in rs_getinput(). In whole.c use MAX_DELTA_CMD for defining the buffer sizes used for delta and patch operations.
-rw-r--r--src/delta.c4
-rw-r--r--src/job.h11
-rw-r--r--src/whole.c9
3 files changed, 15 insertions, 9 deletions
diff --git a/src/delta.c b/src/delta.c
index fcfcf5a..9ee56e7 100644
--- a/src/delta.c
+++ b/src/delta.c
@@ -99,7 +99,7 @@
#include "trace.h"
/** Max length of a miss is 64K including 3 command bytes. */
-#define MAX_MISS_LEN ((1<<16)-3)
+#define MAX_MISS_LEN (MAX_DELTA_CMD - 3)
static rs_result rs_delta_s_scan(rs_job_t *job);
static rs_result rs_delta_s_flush(rs_job_t *job);
@@ -208,7 +208,7 @@ static rs_result rs_delta_s_end(rs_job_t *job)
static inline rs_result rs_getinput(rs_job_t *job, size_t block_len)
{
- size_t min_len = block_len + MAX_MISS_LEN + 1;
+ size_t min_len = block_len + MAX_DELTA_CMD;
job->scan_len = rs_scoop_avail(job);
if (job->scan_len < min_len && !job->stream->eof_in)
diff --git a/src/job.h b/src/job.h
index b9d9ae7..fb22461 100644
--- a/src/job.h
+++ b/src/job.h
@@ -35,6 +35,14 @@
# include "checksum.h"
# include "librsync.h"
+/** Magic job tag number for checking jobs have been initialized. */
+# define RS_JOB_TAG 20010225
+
+/** Max length of a singled delta command is including command bytes.
+ *
+ * This is used to constrain and set the internal buffer sizes. */
+# define MAX_DELTA_CMD (1<<16)
+
/** The contents of this structure are private. */
struct rs_job {
int dogtag;
@@ -115,9 +123,6 @@ struct rs_job {
rs_job_t *rs_job_new(const char *, rs_result (*statefn)(rs_job_t *));
-/** Magic job tag number for checking jobs have been initialized. */
-# define RS_JOB_TAG 20010225
-
/** Assert that a job is valid.
*
* We don't use a static inline function here so that assert failure output
diff --git a/src/whole.c b/src/whole.c
index ec44967..e667f88 100644
--- a/src/whole.c
+++ b/src/whole.c
@@ -111,9 +111,9 @@ rs_result rs_delta_file(rs_signature_t *sig, FILE *new_file, FILE *delta_file,
rs_result r;
job = rs_delta_begin(sig);
- /* Size inbuf for 4*(64K + 1 block), outbuf for 4*(64K). */
+ /* Size inbuf for 4*(CMD + 1 block), outbuf for 4*CMD. */
r = rs_whole_run(job, new_file, delta_file,
- 4 * ((1 << 16) + sig->block_len), 4 * (1 << 16));
+ 4 * (MAX_DELTA_CMD + sig->block_len), 4 * MAX_DELTA_CMD);
if (stats)
memcpy(stats, &job->stats, sizeof *stats);
rs_job_free(job);
@@ -127,8 +127,9 @@ rs_result rs_patch_file(FILE *basis_file, FILE *delta_file, FILE *new_file,
rs_result r;
job = rs_patch_begin(rs_file_copy_cb, basis_file);
- /* Default size inbuf and outbuf 64K. */
- r = rs_whole_run(job, delta_file, new_file, 64 * 1024, 64 * 1024);
+ /* Default size inbuf 1*CMD and outbuf 4*CMD. */
+ r = rs_whole_run(job, delta_file, new_file, MAX_DELTA_CMD,
+ 4 * MAX_DELTA_CMD);
if (stats)
memcpy(stats, &job->stats, sizeof *stats);
rs_job_free(job);