static struct coroutine * _next_coroutine(struct scheduler *s) { if (queue_empty(s->self_queue)) { pthread_mutex_lock(&s->queue_mutex); while (queue_empty(s->lock_queue)) { pthread_cond_wait(&s->queue_signal, &s->queue_mutex); } assert(queue_empty(s->self_queue)); struct queue *q = s->lock_queue; s->lock_queue = s->self_queue; s->lock_queue_n = 0; pthread_mutex_unlock(&s->queue_mutex); s->self_queue = q; return queue_pop(q); } if (s->lock_queue_n != 0) { pthread_mutex_lock(&s->queue_mutex); struct queue *q = s->lock_queue; s->lock_queue = s->empty_queue; s->lock_queue_n = 0; pthread_mutex_unlock(&s->queue_mutex); queue_concat(s->self_queue, q); s->empty_queue = q; } return queue_pop(s->self_queue); }
int main() { int i = 0; char c; queue_t* firstQueue = queue_create(); queue_t* secondQueue = queue_create(); while (1) { scanf("%c", &c); if (c == '+') { scanf("%c", &c); if (c == '1') { firstQueue = queue_add(firstQueue); } if (c == '2') { secondQueue = queue_add(secondQueue); } } if (c == '-') { scanf("%c", &c); if (c == '1') { firstQueue = queue_del(firstQueue); } if (c == '2') { secondQueue = queue_del(secondQueue); } } if (c == 'c') { firstQueue = queue_concat(firstQueue, secondQueue); /** WARNING: ???? * Возможно тут имелось ввиду освобождение памяти? */ secondQueue = NULL; secondQueue = queue_create(); } if (c == 's') { scanf("%c", &c); if (c == '1') { firstQueue = queue_sort(firstQueue); } if (c == '2') { secondQueue = queue_sort(secondQueue); } } if (c == 'q') { printf("Bye\n"); break; } if (c == 'p') { scanf("%c", &c); if (c == '1') queue_print(firstQueue); if (c == '2') queue_print(secondQueue); } } return 0; }