31 #if defined _OPENMP && _OPENMP >= 200805
70 visir_queue * visir_queue_init(
const int max_size)
72 visir_queue * q = cpl_malloc(
sizeof(visir_queue));
73 q->max_size = max_size <= 0 ? INT_MAX : max_size;
75 q->error = CPL_ERROR_NONE;
76 q->queue = cx_list_new();
77 omp_init_lock(&(q->lock));
88 void visir_queue_delete(visir_queue * q)
90 cx_list_delete(q->queue);
91 omp_destroy_lock(&(q->lock));
103 void visir_queue_set_error(visir_queue * q, cpl_error_code error)
105 omp_set_lock(&(q->lock));
107 omp_unset_lock(&(q->lock));
123 cpl_error_code visir_queue_put(visir_queue * q,
void * data)
127 while (q->size >= q->max_size && q->error == CPL_ERROR_NONE) {
129 struct timespec ts = { 0, 50 * 1000000 };
130 nanosleep(&ts, NULL);
131 #pragma omp taskyield
135 omp_set_lock(&(q->lock));
136 if (q->size >= q->max_size || q->error != CPL_ERROR_NONE) {
137 omp_unset_lock(&(q->lock));
140 cx_list_push_back(q->queue, data);
142 omp_unset_lock(&(q->lock));
144 return CPL_ERROR_NONE;
159 void * visir_queue_pop(visir_queue * q)
164 omp_set_lock(&(q->lock));
165 if (q->size > 0 && q->error == CPL_ERROR_NONE) {
166 data = cx_list_pop_front(q->queue);
168 omp_unset_lock(&(q->lock));
172 omp_unset_lock(&(q->lock));
176 ts.tv_nsec = 50 * 1000000;
177 if (q->error != CPL_ERROR_NONE)
179 nanosleep(&ts, NULL);
180 #pragma omp taskyield