summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Sixt <johannes.sixt@telecom.at>2007-12-17 19:12:52 (GMT)
committerJunio C Hamano <gitster@pobox.com>2007-12-18 00:08:40 (GMT)
commit68e6a4f80d4bea2d281c30fa2bbcd4968b0ccc4e (patch)
treec544c7a588a48b6d0a310cd46f7114cc99a69ee8
parent6fbe42c7ee99b4cafa792b46a16b0158d305fe29 (diff)
downloadgit-68e6a4f80d4bea2d281c30fa2bbcd4968b0ccc4e.zip
git-68e6a4f80d4bea2d281c30fa2bbcd4968b0ccc4e.tar.gz
git-68e6a4f80d4bea2d281c30fa2bbcd4968b0ccc4e.tar.bz2
Plug a resource leak in threaded pack-objects code.
A mutex and a condition variable is allocated for each thread and torn down when the thread terminates. However, for certain workloads it can happen that some threads are actually not started at all. In this case we would leak the mutex and condition variable. Now we allocate them only for those threads that are actually started. Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin-pack-objects.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 5765d02..e0ce114 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -1670,8 +1670,6 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size,
p[i].processed = processed;
p[i].working = 1;
p[i].data_ready = 0;
- pthread_mutex_init(&p[i].mutex, NULL);
- pthread_cond_init(&p[i].cond, NULL);
/* try to split chunks on "path" boundaries */
while (sub_size < list_size && list[sub_size]->hash &&
@@ -1690,6 +1688,8 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size,
for (i = 0; i < delta_search_threads; i++) {
if (!p[i].list_size)
continue;
+ pthread_mutex_init(&p[i].mutex, NULL);
+ pthread_cond_init(&p[i].cond, NULL);
ret = pthread_create(&p[i].thread, NULL,
threaded_find_deltas, &p[i]);
if (ret)