util/queue: hold a lock when reading num_threads in util_queue_finish
authorMarek Olšák <marek.olsak@amd.com>
Tue, 7 Aug 2018 00:34:24 +0000 (20:34 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 1 Apr 2019 16:37:52 +0000 (12:37 -0400)
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/util/u_queue.c

index cfd2a08e3c8238829c196f64570ddfa213eb3194..5e0c109556993c5bd6f3f89ddde24edc8ecfc07b 100644 (file)
@@ -592,15 +592,15 @@ void
 util_queue_finish(struct util_queue *queue)
 {
    util_barrier barrier;
-   struct util_queue_fence *fences = malloc(queue->num_threads * sizeof(*fences));
-
-   util_barrier_init(&barrier, queue->num_threads);
+   struct util_queue_fence *fences;
 
    /* If 2 threads were adding jobs for 2 different barries at the same time,
     * a deadlock would happen, because 1 barrier requires that all threads
     * wait for it exclusively.
     */
    mtx_lock(&queue->finish_lock);
+   fences = malloc(queue->num_threads * sizeof(*fences));
+   util_barrier_init(&barrier, queue->num_threads);
 
    for (unsigned i = 0; i < queue->num_threads; ++i) {
       util_queue_fence_init(&fences[i]);