Home | History | Annotate | Download | only in util

Lines Matching refs:queue

32 static void util_queue_killall_and_wait(struct util_queue *queue);
66 add_to_atexit_list(struct util_queue *queue)
71 LIST_ADD(&queue->head, &queue_list);
76 remove_from_atexit_list(struct util_queue *queue)
82 if (iter == queue) {
113 struct util_queue *queue;
119 struct util_queue *queue = ((struct thread_input*)input)->queue;
124 if (queue->name) {
126 util_snprintf(name, sizeof(name), "%s:%i", queue->name, thread_index);
133 pipe_mutex_lock(queue->lock);
134 assert(queue->num_queued >= 0 && queue->num_queued <= queue->max_jobs);
136 /* wait if the queue is empty */
137 while (!queue->kill_threads && queue->num_queued == 0)
138 pipe_condvar_wait(queue->has_queued_cond, queue->lock);
140 if (queue->kill_threads) {
141 pipe_mutex_unlock(queue->lock);
145 job = queue->jobs[queue->read_idx];
146 memset(&queue->jobs[queue->read_idx], 0, sizeof(struct util_queue_job));
147 queue->read_idx = (queue->read_idx + 1) % queue->max_jobs;
149 queue->num_queued--;
150 pipe_condvar_signal(queue->has_space_cond);
151 pipe_mutex_unlock(queue->lock);
162 pipe_mutex_lock(queue->lock);
163 while (queue->jobs[queue->read_idx].job) {
164 util_queue_fence_signal(queue->jobs[queue->read_idx].fence);
166 queue->jobs[queue->read_idx].job = NULL;
167 queue->read_idx = (queue->read_idx + 1) % queue->max_jobs;
169 queue->num_queued = 0; /* reset this when exiting the thread */
170 pipe_mutex_unlock(queue->lock);
175 util_queue_init(struct util_queue *queue,
182 memset(queue, 0, sizeof(*queue));
183 queue->name = name;
184 queue->num_threads = num_threads;
185 queue->max_jobs = max_jobs;
187 queue->jobs = (struct util_queue_job*)
189 if (!queue->jobs)
192 pipe_mutex_init(queue->lock);
194 queue->num_queued = 0;
195 pipe_condvar_init(queue->has_queued_cond);
196 pipe_condvar_init(queue->has_space_cond);
198 queue->threads = (pipe_thread*)CALLOC(num_threads, sizeof(pipe_thread));
199 if (!queue->threads)
205 input->queue = queue;
208 queue->threads[i] = pipe_thread_create(util_queue_thread_func, input);
210 if (!queue->threads[i]) {
218 queue->num_threads = i;
224 add_to_atexit_list(queue);
228 FREE(queue->threads);
230 if (queue->jobs) {
231 pipe_condvar_destroy(queue->has_space_cond);
232 pipe_condvar_destroy(queue->has_queued_cond);
233 pipe_mutex_destroy(queue->lock);
234 FREE(queue->jobs);
237 memset(queue, 0, sizeof(*queue));
242 util_queue_killall_and_wait(struct util_queue *queue)
247 pipe_mutex_lock(queue->lock);
248 queue->kill_threads = 1;
249 pipe_condvar_broadcast(queue->has_queued_cond);
250 pipe_mutex_unlock(queue->lock);
252 for (i = 0; i < queue->num_threads; i++)
253 pipe_thread_wait(queue->threads[i]);
254 queue->num_threads = 0;
258 util_queue_destroy(struct util_queue *queue)
260 util_queue_killall_and_wait(queue);
261 remove_from_atexit_list(queue);
263 pipe_condvar_destroy(queue->has_space_cond);
264 pipe_condvar_destroy(queue->has_queued_cond);
265 pipe_mutex_destroy(queue->lock);
266 FREE(queue->jobs);
267 FREE(queue->threads);
288 util_queue_add_job(struct util_queue *queue,
299 pipe_mutex_lock(queue->lock);
300 assert(queue->num_queued >= 0 && queue->num_queued <= queue->max_jobs);
302 /* if the queue is full, wait until there is space */
303 while (queue->num_queued == queue->max_jobs)
304 pipe_condvar_wait(queue->has_space_cond, queue->lock);
306 ptr = &queue->jobs[queue->write_idx];
312 queue->write_idx = (queue->write_idx + 1) % queue->max_jobs;
314 queue->num_queued++;
315 pipe_condvar_signal(queue->has_queued_cond);
316 pipe_mutex_unlock(queue->lock);