Spec-Zone.ru › Ruby 2.6

класс SizedQueue

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

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

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

Методы класса (Public)

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.

Методы экземпляра (Public)

<<(*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 Показать исходный код
size
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;
    sync_wakeup(szqueue_pushq(sq), diff);
    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, self, 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