diff options
-rw-r--r-- | Documentation/git-pack-objects.txt | 8 | ||||
-rw-r--r-- | builtin-pack-objects.c | 26 |
2 files changed, 29 insertions, 5 deletions
diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt index 6f17cff24a..f9b97956e3 100644 --- a/Documentation/git-pack-objects.txt +++ b/Documentation/git-pack-objects.txt @@ -173,6 +173,14 @@ base-name:: length, this option typically shrinks the resulting packfile by 3-5 per-cent. +--threads=<n>:: + Specifies the number of threads to spawn when searching for best + delta matches. This requires that pack-objects be compiled with + pthreads otherwise this option is ignored with a warning. + This is meant to reduce packing time on multiprocessor machines. + The required amount of memory for the delta search window is + however multiplied by the number of threads. + --index-version=<version>[,<offset>]:: This is intended to be used by the test suite only. It allows to force the version for the generated pack index, and to force diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index b13558ee7e..42698d2948 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -24,7 +24,7 @@ git-pack-objects [{ -q | --progress | --all-progress }] \n\ [--max-pack-size=N] [--local] [--incremental] \n\ [--window=N] [--window-memory=N] [--depth=N] \n\ [--no-reuse-delta] [--no-reuse-object] [--delta-base-offset] \n\ - [--non-empty] [--revs [--unpacked | --all]*] [--reflog] \n\ + [--threads=N] [--non-empty] [--revs [--unpacked | --all]*] [--reflog] \n\ [--stdout | base-name] [<ref-list | <object-list]"; struct object_entry { @@ -72,6 +72,7 @@ static int progress = 1; static int window = 10; static uint32_t pack_size_limit; static int depth = 50; +static int delta_search_threads = 1; static int pack_to_stdout; static int num_preferred_base; static struct progress progress_state; @@ -1605,19 +1606,22 @@ static void *threaded_find_deltas(void *arg) } } -#define NR_THREADS 4 - static void ll_find_deltas(struct object_entry **list, unsigned list_size, int window, int depth, unsigned *processed) { - struct thread_params p[NR_THREADS]; + struct thread_params p[delta_search_threads]; int i, ret; unsigned chunk_size; + if (delta_search_threads <= 1) { + find_deltas(list, list_size, window, depth, processed); + return; + } + pthread_mutex_lock(&data_provider); pthread_mutex_lock(&data_ready); - for (i = 0; i < NR_THREADS; i++) { + for (i = 0; i < delta_search_threads; i++) { p[i].window = window; p[i].depth = depth; p[i].processed = processed; @@ -1900,6 +1904,18 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix) usage(pack_usage); continue; } + if (!prefixcmp(arg, "--threads=")) { + char *end; + delta_search_threads = strtoul(arg+10, &end, 0); + if (!arg[10] || *end || delta_search_threads < 1) + usage(pack_usage); +#ifndef THREADED_DELTA_SEARCH + if (delta_search_threads > 1) + warning("no threads support, " + "ignoring %s", arg); +#endif + continue; + } if (!prefixcmp(arg, "--depth=")) { char *end; depth = strtoul(arg+8, &end, 0); |