Example #1
0
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);
}
Example #2
0
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;
}