util/queue: use simple_mtx_t for finish_lock

Acked-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13152>
This commit is contained in:
Marek Olšák 2021-10-01 15:40:48 -04:00 committed by Marge Bot
parent 28bde89556
commit b4afe25ebf
2 changed files with 14 additions and 13 deletions

View File

@ -374,17 +374,17 @@ util_queue_adjust_num_threads(struct util_queue *queue, unsigned num_threads)
num_threads = MIN2(num_threads, queue->max_threads);
num_threads = MAX2(num_threads, 1);
mtx_lock(&queue->finish_lock);
simple_mtx_lock(&queue->finish_lock);
unsigned old_num_threads = queue->num_threads;
if (num_threads == old_num_threads) {
mtx_unlock(&queue->finish_lock);
simple_mtx_unlock(&queue->finish_lock);
return;
}
if (num_threads < old_num_threads) {
util_queue_kill_threads(queue, num_threads, true);
mtx_unlock(&queue->finish_lock);
simple_mtx_unlock(&queue->finish_lock);
return;
}
@ -398,7 +398,7 @@ util_queue_adjust_num_threads(struct util_queue *queue, unsigned num_threads)
if (!util_queue_create_thread(queue, i))
break;
}
mtx_unlock(&queue->finish_lock);
simple_mtx_unlock(&queue->finish_lock);
}
bool
@ -446,7 +446,7 @@ util_queue_init(struct util_queue *queue,
queue->global_data = global_data;
(void) mtx_init(&queue->lock, mtx_plain);
(void) mtx_init(&queue->finish_lock, mtx_plain);
(void) simple_mtx_init(&queue->finish_lock, mtx_plain);
queue->num_queued = 0;
cnd_init(&queue->has_queued_cond);
@ -500,10 +500,10 @@ util_queue_kill_threads(struct util_queue *queue, unsigned keep_num_threads,
/* Signal all threads to terminate. */
if (!finish_locked)
mtx_lock(&queue->finish_lock);
simple_mtx_lock(&queue->finish_lock);
if (keep_num_threads >= queue->num_threads) {
mtx_unlock(&queue->finish_lock);
simple_mtx_unlock(&queue->finish_lock);
return;
}
@ -520,7 +520,7 @@ util_queue_kill_threads(struct util_queue *queue, unsigned keep_num_threads,
thrd_join(queue->threads[i], NULL);
if (!finish_locked)
mtx_unlock(&queue->finish_lock);
simple_mtx_unlock(&queue->finish_lock);
}
static void
@ -541,7 +541,7 @@ util_queue_destroy(struct util_queue *queue)
cnd_destroy(&queue->has_space_cond);
cnd_destroy(&queue->has_queued_cond);
mtx_destroy(&queue->finish_lock);
simple_mtx_destroy(&queue->finish_lock);
mtx_destroy(&queue->lock);
free(queue->jobs);
free(queue->threads);
@ -682,11 +682,11 @@ util_queue_finish(struct util_queue *queue)
* a deadlock would happen, because 1 barrier requires that all threads
* wait for it exclusively.
*/
mtx_lock(&queue->finish_lock);
simple_mtx_lock(&queue->finish_lock);
/* The number of threads can be changed to 0, e.g. by the atexit handler. */
if (!queue->num_threads) {
mtx_unlock(&queue->finish_lock);
simple_mtx_unlock(&queue->finish_lock);
return;
}
@ -703,7 +703,7 @@ util_queue_finish(struct util_queue *queue)
util_queue_fence_wait(&fences[i]);
util_queue_fence_destroy(&fences[i]);
}
mtx_unlock(&queue->finish_lock);
simple_mtx_unlock(&queue->finish_lock);
util_barrier_destroy(&barrier);

View File

@ -35,6 +35,7 @@
#include <string.h>
#include "simple_mtx.h"
#include "util/futex.h"
#include "util/list.h"
#include "util/macros.h"
@ -204,7 +205,7 @@ struct util_queue_job {
/* Put this into your context. */
struct util_queue {
char name[14]; /* 13 characters = the thread name without the index */
mtx_t finish_lock; /* for util_queue_finish and protects threads/num_threads */
simple_mtx_t finish_lock; /* for util_queue_finish and protects threads/num_threads */
mtx_t lock;
cnd_t has_queued_cond;
cnd_t has_space_cond;