pack-objects (mingw): initialize `packing_data` mutex in the correct spot
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Tue, 16 Oct 2018 21:02:52 +0000 (14:02 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 19 Oct 2018 05:28:44 +0000 (14:28 +0900)
In 9ac3f0e5b3e4 (pack-objects: fix performance issues on packing large
deltas, 2018-07-22), a mutex was introduced that is used to guard the
call to set the delta size. This commit even added code to initialize
it, but at an incorrect spot: in `init_threaded_search()`, while the
call to `oe_set_delta_size()` (and hence to `packing_data_lock()`) can
happen in the call chain `check_object()` <- `get_object_details()` <-
`prepare_pack()` <- `cmd_pack_objects()`, which is long before the
`prepare_pack()` function calls `ll_find_deltas()` (which initializes
the threaded search).

Another tell-tale that the mutex was initialized in an incorrect spot is
that the function to initialize it lives in builtin/, while the code
that uses the mutex is defined in a libgit.a header file.

Let's use a more appropriate function: `prepare_packing_data()`, which
not only lives in libgit.a, but *has* to be called before the
`packing_data` struct is used that contains that mutex.

This fixes https://github.com/git-for-windows/git/issues/1839.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pack-objects.c
pack-objects.c
t/t5321-pack-large-objects.sh
index d1144a8f7ef79f7efa5bf64141a9133cfeee66d1..29d48f38671116594494ca8904193936ed7ea77b 100644 (file)
@@ -2299,7 +2299,6 @@ static void init_threaded_search(void)
        pthread_mutex_init(&cache_mutex, NULL);
        pthread_mutex_init(&progress_mutex, NULL);
        pthread_cond_init(&progress_cond, NULL);
-       pthread_mutex_init(&to_pack.lock, NULL);
        old_try_to_free_routine = set_try_to_free_routine(try_to_free_from_threads);
 }
 
index 6ef87e5683aacdf738c86679712078988c0899fd..f73f609884ca0d9fdf3d4109b245981c4c073fcb 100644 (file)
@@ -148,6 +148,9 @@ void prepare_packing_data(struct packing_data *pdata)
                                             1U << OE_SIZE_BITS);
        pdata->oe_delta_size_limit = git_env_ulong("GIT_TEST_OE_DELTA_SIZE",
                                                   1UL << OE_DELTA_SIZE_BITS);
+#ifndef NO_PTHREADS
+       pthread_mutex_init(&pdata->lock, NULL);
+#endif
 }
 
 struct object_entry *packlist_alloc(struct packing_data *pdata,
index c36c66fbb43a739e045f6b2cd1c1dd0759a0fe01..a75eab87d36136de6484a988b712bfac03dd181d 100755 (executable)
@@ -24,7 +24,7 @@ test_expect_success 'setup' '
        git index-pack --stdin <ab.pack
 '
 
-test_expect_failure 'repack large deltas' '
+test_expect_success 'repack large deltas' '
        printf "%s\\n" $A $B |
        GIT_TEST_OE_DELTA_SIZE=2 git pack-objects tmp-pack
 '