Lines Matching refs:queue

21 // Private DPC queue structures
45 dpc_queue *queue = arg;
49 while (acquire_sem(queue->wakeup_sem) == B_OK) {
54 acquire_spinlock(&queue->lock);
56 dpc = queue->slots[queue->head];
57 queue->head = (queue->head + 1) % queue->size;
58 queue->count--;
60 release_spinlock(&queue->lock);
68 while (queue->count--) {
69 dpc = queue->slots[queue->head];
70 queue->head = (queue->head + 1) % queue->size;
86 dpc_queue *queue;
91 queue = malloc(sizeof(dpc_queue) + DPC_QUEUE_SIZE * sizeof(dpc_slot));
92 if (!queue)
95 queue->head = queue->tail = 0;
96 queue->size = DPC_QUEUE_SIZE;
97 queue->count = 0;
98 B_INITIALIZE_SPINLOCK(&queue->lock); // Init the spinlock
103 queue->wakeup_sem = create_sem(0, str);
104 if (queue->wakeup_sem < B_OK) {
105 status_t status = queue->wakeup_sem;
106 free(queue);
112 queue->thread = spawn_kernel_thread(dpc_thread, name, priority, queue);
113 if (queue->thread < 0) {
114 status_t status = queue->thread;
115 delete_sem(queue->wakeup_sem);
116 free(queue);
119 resume_thread(queue->thread);
121 *handle = queue;
130 dpc_queue *queue = handle;
135 if (!queue)
138 // Close the queue: queue_dpc() should know we're closing:
140 acquire_spinlock(&queue->lock);
142 thread = queue->thread;
143 queue->thread = -1;
145 release_spinlock(&queue->lock);
149 delete_sem(queue->wakeup_sem);
152 free(queue);
161 dpc_queue *queue = handle;
165 if (!queue || !function)
170 acquire_spinlock(&queue->lock);
172 if (queue->thread < 0) {
175 } else if (queue->count == queue->size)
176 // This DPC queue is full, sorry
179 queue->slots[queue->tail].function = function;
180 queue->slots[queue->tail].arg = arg;
181 queue->tail = (queue->tail + 1) % queue->size;
182 queue->count++;
185 release_spinlock(&queue->lock);
192 status = release_sem_etc(queue->wakeup_sem, 1, B_DO_NOT_RESCHEDULE);