Spec-Zone.ru › Ruby 2.2

класс SizedQueue

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

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

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

Методы класса

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

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

    RSTRUCT_SET(self, QUEUE_QUE, ary_buf_new());
    RSTRUCT_SET(self, QUEUE_WAITERS, ary_buf_new());
    RSTRUCT_SET(self, SZQUEUE_WAITERS, ary_buf_new());
    RSTRUCT_SET(self, SZQUEUE_MAX, vmax);

    return self;
}

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

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

<<(*args)

Псевдоним для push.

Псевдоним для: push
clear() Показать исходный код
static VALUE
rb_szqueue_clear(VALUE self)
{
    rb_ary_clear(GET_QUEUE_QUE(self));
    wakeup_all_threads(GET_SZQUEUE_WAITERS(self));
    return self;
}

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

deq(*args)

Псевдоним для pop.

Псевдоним для: pop
enq(*args)

Псевдоним для push.

Псевдоним для: push
max() Показать исходный код
static VALUE
rb_szqueue_max_get(VALUE self)
{
    return GET_SZQUEUE_MAX(self);
}

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

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

    if (max <= 0) {
        rb_raise(rb_eArgError, "queue size must be positive");
    }
    if ((unsigned long)max > GET_SZQUEUE_ULONGMAX(self)) {
        diff = max - GET_SZQUEUE_ULONGMAX(self);
    }
    RSTRUCT_SET(self, SZQUEUE_MAX, vmax);
    while (diff-- > 0 && !NIL_P(t = rb_ary_shift(GET_SZQUEUE_WAITERS(self)))) {
        rb_thread_wakeup_alive(t);
    }
    return vmax;
}

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

num_waiting() Показать исходный код
static VALUE
rb_szqueue_num_waiting(VALUE self)
{
    long len = queue_num_waiting(self);
    VALUE waiters = GET_SZQUEUE_WAITERS(self);
    len += RARRAY_LEN(waiters);
    return ULONG2NUM(len);
}

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

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, поток не приостанавливается, а генерируется исключение.

Также алиас для: 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 waiting_delete args;
    int should_block = szqueue_push_should_block(argc, argv);
    args.waiting = GET_SZQUEUE_WAITERS(self);
    args.th      = rb_thread_current();

    while (queue_length(self) >= GET_SZQUEUE_ULONGMAX(self)) {
        if (!should_block) {
            rb_raise(rb_eThreadError, "queue full");
        }
        rb_ary_push(args.waiting, args.th);
        rb_ensure((VALUE (*)())rb_thread_sleep_deadly, (VALUE)0, queue_delete_from_waiting, (VALUE)&args);
    }
    return queue_do_push(self, argv[0]);
}

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

Если в очереди нет места, поток ожидает освобождения места, если non_block не равно true. Если non_block равно true, поток не приостанавливается, а генерируется исключение.

Также алиас для: enq, <<
shift(*args)

Псевдоним для pop.

Псевдоним для: pop

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