1. Thread::
  2. SizedQueue

class Thread::SizedQueue

This class represents queues of specified size capacity. The push operation may be blocked if the capacity is full.

SeeThread::Queue for an example of how aThread::SizedQueue works.

Public Class Methods

Source
static VALUErb_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, szqueue_list(sq), ary_buf_new());    ccan_list_head_init(szqueue_waitq(sq));    ccan_list_head_init(szqueue_pushq(sq));    sq->max = max;    return self;}

Creates a fixed-length queue with a maximum size ofmax.

Public Instance Methods

Alias for:push
Source
static VALUErb_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;}

Removes all objects from the queue.

Source
static VALUErb_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;}

Similar toThread::Queue#close.

The difference is behavior with waiting enqueuing threads.

If there are waiting enqueuing threads, they are interrupted by raising ClosedQueueError(‘queue closed’).

Alias for:pop
Source
static VALUErb_szqueue_empty_p(VALUE self){    struct rb_szqueue *sq = szqueue_ptr(self);    return RBOOL(queue_length(self, &sq->q) == 0);}

Returnstrue if the queue is empty.

Alias for:push
Source
static VALUErb_szqueue_length(VALUE self){    struct rb_szqueue *sq = szqueue_ptr(self);    return LONG2NUM(queue_length(self, &sq->q));}

Returns the length of the queue.

Also aliased as:size
Source
static VALUErb_szqueue_max_get(VALUE self){    return LONG2NUM(szqueue_ptr(self)->max);}

Returns the maximum size of the queue.

Source
static VALUErb_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;}

Sets the maximum size of the queue to the givennumber.

Source
static VALUErb_szqueue_num_waiting(VALUE self){    struct rb_szqueue *sq = szqueue_ptr(self);    return INT2NUM(sq->q.num_waiting + sq->num_waiting_push);}

Returns the number of threads waiting on the queue.

Source
# File thread_sync.rb, line 36defpop(non_block =false,timeout:nil)ifnon_block&&timeoutraiseArgumentError,"can't set a timeout if non_block is enabled"endPrimitive.rb_szqueue_pop(non_block,timeout)end

Retrieves data from the queue.

If the queue is empty, the calling thread is suspended until data is pushed onto the queue. Ifnon_block is true, the thread isn’t suspended, andThreadError is raised.

Iftimeout seconds have passed and no data is availablenil is returned. Iftimeout is0 it returns immediately.

Also aliased as:deq,shift
Source
# File thread_sync.rb, line 59defpush(object,non_block =false,timeout:nil)ifnon_block&&timeoutraiseArgumentError,"can't set a timeout if non_block is enabled"endPrimitive.rb_szqueue_push(object,non_block,timeout)end

Pushesobject to the queue.

If there is no space left in the queue, waits until space becomes available, unlessnon_block is true. Ifnon_block is true, the thread isn’t suspended, andThreadError is raised.

Iftimeout seconds have passed and no space is availablenil is returned. Iftimeout is0 it returns immediately. Otherwise it returnsself.

Also aliased as:enq,<<
Alias for:pop

Returns the length of the queue.

Alias for:length