From: Paul R. Eggert Date: Mon, 26 Jul 2010 03:54:55 +0000 (-0700) Subject: sort: omit unnecessary mutex unlock+lock; simplify heap access X-Git-Tag: v8.6~88 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de949fc12dffef87e381a821c18887e4efdd1b00;p=thirdparty%2Fcoreutils.git sort: omit unnecessary mutex unlock+lock; simplify heap access * src/sort.c (queue_pop): Omit unnecessary unlock+lock after pthread_cond_wait returns. Don't access "count" member of the heap; any efficiency gains should be quite minor, the access complicates this code, and "count" should be private anyway. --- diff --git a/src/sort.c b/src/sort.c index ea2720f68f..577521d689 100644 --- a/src/sort.c +++ b/src/sort.c @@ -3173,20 +3173,11 @@ queue_insert (struct merge_node_queue *queue, struct merge_node *node) static inline struct merge_node * queue_pop (struct merge_node_queue *queue) { - struct merge_node *node = NULL; - - while (!node) - { - pthread_mutex_lock (&queue->mutex); - if (queue->priority_queue->count) - node = heap_remove_top (queue->priority_queue); - else - { - /* Go into conditional wait if no NODE is immediately available. */ - pthread_cond_wait (&queue->cond, &queue->mutex); - } - pthread_mutex_unlock (&queue->mutex); - } + struct merge_node *node; + pthread_mutex_lock (&queue->mutex); + while (! (node = heap_remove_top (queue->priority_queue))) + pthread_cond_wait (&queue->cond, &queue->mutex); + pthread_mutex_unlock (&queue->mutex); lock_node (node); node->queued = false; return node;