fix threaded delta search locking

Found by Jeff King.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Nicolas Pitre 2007-09-10 08:40:44 -04:00 committed by Junio C Hamano
parent 367f4a4343
commit b81d9af71e
1 changed files with 6 additions and 5 deletions

View File

@ -1597,6 +1597,7 @@ static void *threaded_find_deltas(void *arg)
data_requester = me; data_requester = me;
pthread_mutex_unlock(&data_provider); pthread_mutex_unlock(&data_provider);
pthread_mutex_lock(&data_ready); pthread_mutex_lock(&data_ready);
pthread_mutex_unlock(&data_request);


if (!me->list_size) if (!me->list_size)
return NULL; return NULL;
@ -1609,7 +1610,7 @@ static void *threaded_find_deltas(void *arg)
static void ll_find_deltas(struct object_entry **list, unsigned list_size, static void ll_find_deltas(struct object_entry **list, unsigned list_size,
int window, int depth, unsigned *processed) int window, int depth, unsigned *processed)
{ {
struct thread_params p[delta_search_threads]; struct thread_params *target, p[delta_search_threads];
int i, ret; int i, ret;
unsigned chunk_size; unsigned chunk_size;


@ -1645,17 +1646,17 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size,
sublist_size++; sublist_size++;


pthread_mutex_lock(&data_provider); pthread_mutex_lock(&data_provider);
data_requester->list = list; target = data_requester;
data_requester->list_size = sublist_size; target->list = list;
target->list_size = sublist_size;
pthread_mutex_unlock(&data_ready); pthread_mutex_unlock(&data_ready);


list += sublist_size; list += sublist_size;
list_size -= sublist_size; list_size -= sublist_size;
if (!sublist_size) { if (!sublist_size) {
pthread_join(data_requester->thread, NULL); pthread_join(target->thread, NULL);
i--; i--;
} }
pthread_mutex_unlock(&data_request);
} while (i); } while (i);
} }