[Mesa-dev] [PATCH v2 5/8] u_queue: add util_queue_fence_reset
Nicolai Hähnle
nhaehnle at gmail.com
Fri Nov 3 20:09:14 UTC 2017
From: Nicolai Hähnle <nicolai.haehnle at amd.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
---
src/util/u_queue.c | 4 +---
src/util/u_queue.h | 13 +++++++++++++
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/src/util/u_queue.c b/src/util/u_queue.c
index 33436e0749a..2272006042f 100644
--- a/src/util/u_queue.c
+++ b/src/util/u_queue.c
@@ -321,32 +321,30 @@ util_queue_destroy(struct util_queue *queue)
void
util_queue_add_job(struct util_queue *queue,
void *job,
struct util_queue_fence *fence,
util_queue_execute_func execute,
util_queue_execute_func cleanup)
{
struct util_queue_job *ptr;
- assert(fence->signalled);
-
mtx_lock(&queue->lock);
if (queue->kill_threads) {
mtx_unlock(&queue->lock);
/* well no good option here, but any leaks will be
* short-lived as things are shutting down..
*/
return;
}
- fence->signalled = false;
+ util_queue_fence_reset(fence);
assert(queue->num_queued >= 0 && queue->num_queued <= queue->max_jobs);
if (queue->num_queued == queue->max_jobs) {
if (queue->flags & UTIL_QUEUE_INIT_RESIZE_IF_FULL) {
/* If the queue is full, make it larger to avoid waiting for a free
* slot.
*/
unsigned new_max_jobs = queue->max_jobs + 8;
struct util_queue_job *jobs =
diff --git a/src/util/u_queue.h b/src/util/u_queue.h
index 5a546e53fdc..a3e12260e30 100644
--- a/src/util/u_queue.h
+++ b/src/util/u_queue.h
@@ -52,20 +52,33 @@ struct util_queue_fence {
mtx_t mutex;
cnd_t cond;
int signalled;
};
void util_queue_fence_init(struct util_queue_fence *fence);
void util_queue_fence_destroy(struct util_queue_fence *fence);
void util_queue_fence_wait(struct util_queue_fence *fence);
void util_queue_fence_signal(struct util_queue_fence *fence);
+/**
+ * Move \p fence back into unsignalled state.
+ *
+ * \warning The caller must ensure that no other thread may currently be
+ * waiting (or about to wait) on the fence.
+ */
+static inline void
+util_queue_fence_reset(struct util_queue_fence *fence)
+{
+ assert(fence->signalled);
+ fence->signalled = 0;
+}
+
static inline bool
util_queue_fence_is_signalled(struct util_queue_fence *fence)
{
return fence->signalled != 0;
}
typedef void (*util_queue_execute_func)(void *job, int thread_index);
struct util_queue_job {
void *job;
--
2.11.0
More information about the mesa-dev
mailing list