void BLI_gsqueue_free(GSQueue *gq) { while (gq->head) { BLI_gsqueue_pop(gq, NULL); } MEM_freeN(gq); }
void *BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms) { double t; void *work = NULL; struct timespec timeout; t = PIL_check_seconds_timer(); wait_timeout(&timeout, ms); /* wait until there is work */ pthread_mutex_lock(&queue->mutex); while (BLI_gsqueue_is_empty(queue->queue) && !queue->nowait) { if (pthread_cond_timedwait(&queue->push_cond, &queue->mutex, &timeout) == ETIMEDOUT) break; else if (PIL_check_seconds_timer() - t >= ms * 0.001) break; } /* if we have something, pop it */ if (!BLI_gsqueue_is_empty(queue->queue)) { BLI_gsqueue_pop(queue->queue, &work); if (BLI_gsqueue_is_empty(queue->queue)) pthread_cond_broadcast(&queue->finish_cond); } pthread_mutex_unlock(&queue->mutex); return work; }
void *BLI_thread_queue_pop(ThreadQueue *queue) { void *work= NULL; /* wait until there is work */ pthread_mutex_lock(&queue->mutex); while(BLI_gsqueue_is_empty(queue->queue) && !queue->nowait) pthread_cond_wait(&queue->cond, &queue->mutex); /* if we have something, pop it */ if(!BLI_gsqueue_is_empty(queue->queue)) BLI_gsqueue_pop(queue->queue, &work); pthread_mutex_unlock(&queue->mutex); return work; }