Spec-Zone.ru › Ruby 2.5

класс SizedQueue

Родитель:
Объект

Этот класс представляет очереди заданной емкости. Операция добавления элемента может быть заблокирована, если емкость заполнена.

См. Очередь для примера работы SizedQueue.

Публичные методы класса

new(max) Показать исходный код
static VALUE
rb_szqueue_initialize(VALUE self, VALUE vmax)
{
    long max;
    struct rb_szqueue *sq = szqueue_ptr(self);

    max = NUM2LONG(vmax);
    if (max <= 0) {
        rb_raise(rb_eArgError, "queue size must be positive");
    }

    RB_OBJ_WRITE(self, &sq->q.que, ary_buf_new());
    list_head_init(szqueue_waitq(sq));
    list_head_init(szqueue_pushq(sq));
    sq->max = max;

    return self;
}

Создаёт очередь фиксированной длины с максимальным размером max.

Публичные методы экземпляра

<<(*args)
Псевдоним для: push
clear() Показать исходный код
static VALUE
rb_szqueue_clear(VALUE self)
{
    struct rb_szqueue *sq = szqueue_ptr(self);

    rb_ary_clear(check_array(self, sq->q.que));
    wakeup_all(szqueue_pushq(sq));
    return self;
}

Удаляет все объекты из очереди.

close Показать исходный код
static VALUE
rb_szqueue_close(VALUE self)
{
    if (!queue_closed_p(self)) {
        struct rb_szqueue *sq = szqueue_ptr(self);

        FL_SET(self, QUEUE_CLOSED);
        wakeup_all(szqueue_waitq(sq));
        wakeup_all(szqueue_pushq(sq));
    }
    return self;
}

Аналогично Queue#close.

Различие заключается в поведении с ожидающими потоками добавления элементов.

Если есть ожидающие потоки добавления элементов, они прерываются с возбуждением исключения ClosedQueueError('очередь закрыта').

deq(*args)
Псевдоним для: pop
empty? Показать исходный код
static VALUE
rb_szqueue_empty_p(VALUE self)
{
    struct rb_szqueue *sq = szqueue_ptr(self);

    return queue_length(self, &sq->q) == 0 ? Qtrue : Qfalse;
}

Возвращает true, если очередь пуста.

enq(*args)
Псевдоним для: push
length() Показать исходный код
static VALUE
rb_szqueue_length(VALUE self)
{
    struct rb_szqueue *sq = szqueue_ptr(self);

    return LONG2NUM(queue_length(self, &sq->q));
}
Также псевдоним для: size
max() Показать исходный код
static VALUE
rb_szqueue_max_get(VALUE self)
{
    return LONG2NUM(szqueue_ptr(self)->max);
}

Возвращает максимальный размер очереди.

max=(number) Показать исходный код
static VALUE
rb_szqueue_max_set(VALUE self, VALUE vmax)
{
    long max = NUM2LONG(vmax);
    long diff = 0;
    struct rb_szqueue *sq = szqueue_ptr(self);

    if (max <= 0) {
        rb_raise(rb_eArgError, "queue size must be positive");
    }
    if (max > sq->max) {
        diff = max - sq->max;
    }
    sq->max = max;
    while (diff-- > 0 && wakeup_one(szqueue_pushq(sq))) {
        /* keep waking more up */
    }
    return vmax;
}

Устанавливает максимальный размер очереди на заданное number.

num_waiting() Показать исходный код
static VALUE
rb_szqueue_num_waiting(VALUE self)
{
    struct rb_szqueue *sq = szqueue_ptr(self);

    return INT2NUM(sq->q.num_waiting + sq->num_waiting_push);
}

Возвращает количество потоков, ожидающих в очереди.

pop(non_block=false) Показать исходный код
deq(non_block=false)
shift(non_block=false)
static VALUE
rb_szqueue_pop(int argc, VALUE *argv, VALUE self)
{
    int should_block = queue_pop_should_block(argc, argv);
    return szqueue_do_pop(self, should_block);
}

Извлекает данные из очереди.

Если очередь пуста, вызывающий поток приостанавливается до тех пор, пока данные не будут добавлены в очередь. Если non_block равно true, поток не приостанавливается, и возникает ThreadError.

Также псевдоним для: deq, shift
push(object, non_block=false) Показать исходный код
enq(object, non_block=false)
<<(object)
static VALUE
rb_szqueue_push(int argc, VALUE *argv, VALUE self)
{
    struct rb_szqueue *sq = szqueue_ptr(self);
    int should_block = szqueue_push_should_block(argc, argv);

    while (queue_length(self, &sq->q) >= sq->max) {
        if (!should_block) {
            rb_raise(rb_eThreadError, "queue full");
        }
        else if (queue_closed_p(self)) {
            goto closed;
        }
        else {
            struct queue_waiter qw;
            struct list_head *pushq = szqueue_pushq(sq);

            qw.w.th = GET_THREAD();
            qw.as.sq = sq;
            list_add_tail(pushq, &qw.w.node);
            sq->num_waiting_push++;

            rb_ensure(queue_sleep, Qfalse, szqueue_sleep_done, (VALUE)&qw);
        }
    }

    if (queue_closed_p(self)) {
      closed:
        raise_closed_queue_error(self);
    }

    return queue_do_push(self, &sq->q, argv[0]);
}

Добавляет object в очередь.

Если места в очереди больше нет, поток ожидает освобождения места, если non_block не true. Если non_block равно true, поток не приостанавливается и возникает ThreadError.

Также псевдоним для: enq, <<
shift(*args)
Псевдоним для: pop
size()
Псевдоним для: length

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API