Class: SizedQueue
- Inherits:
-
Object
- Object
- SizedQueue
- Defined in:
- thread.c,
thread.c
Overview
This class represents queues of specified size capacity. The push operation may be blocked if the capacity is full.
See Queue for an example of how a SizedQueue works.
Instance Method Summary collapse
-
#clear ⇒ Object
Removes all objects from the queue.
-
#new(max) ⇒ Object
constructor
Creates a fixed-length queue with a maximum size of
max
. -
#max ⇒ Object
Returns the maximum size of the queue.
-
#max=(number) ⇒ Object
Sets the maximum size of the queue to the given
number
. -
#num_waiting ⇒ Object
Returns the number of threads waiting on the queue.
-
#pop ⇒ Object
(also: #deq, #shift)
Retrieves data from the queue.
-
#push ⇒ Object
(also: #enq, #<<)
Pushes
object
to the queue.
Constructor Details
#new(max) ⇒ Object
Creates a fixed-length queue with a maximum size of max
.
400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 |
# File 'thread.c', line 400
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;
}
|
Instance Method Details
#clear ⇒ Object
Removes all objects from the queue.
521 522 523 524 525 526 527 |
# File 'thread.c', line 521
static VALUE
rb_szqueue_clear(VALUE self)
{
rb_ary_clear(GET_QUEUE_QUE(self));
wakeup_all_threads(GET_SZQUEUE_WAITERS(self));
return self;
}
|
#max ⇒ Object
Returns the maximum size of the queue.
424 425 426 427 428 |
# File 'thread.c', line 424
static VALUE
rb_szqueue_max_get(VALUE self)
{
return GET_SZQUEUE_MAX(self);
}
|
#max=(number) ⇒ Object
Sets the maximum size of the queue to the given number
.
437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 |
# File 'thread.c', line 437
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;
}
|
#num_waiting ⇒ Object
Returns the number of threads waiting on the queue.
535 536 537 538 539 540 541 |
# File 'thread.c', line 535
static VALUE
rb_szqueue_num_waiting(VALUE self)
{
long len = queue_num_waiting(self);
len += RARRAY_LEN(GET_SZQUEUE_WAITERS(self));
return ULONG2NUM(len);
}
|
#pop(non_block = false) ⇒ Object #deq(non_block = false) ⇒ Object #shift(non_block = false) ⇒ Object Also known as: deq, shift
Retrieves data from the queue.
If the queue is empty, the calling thread is suspended until data is pushed onto the queue. If non_block
is true, the thread isn’t suspended, and an exception is raised.
508 509 510 511 512 513 |
# File 'thread.c', line 508
static VALUE
rb_szqueue_pop(int argc, VALUE *argv, VALUE self)
{
VALUE should_block = queue_pop_should_block(argc, argv);
return szqueue_do_pop(self, should_block);
}
|
#push(object) ⇒ Object #enq(object) ⇒ Object #<<(object) ⇒ Object Also known as: enq, <<
Pushes object
to the queue.
If there is no space left in the queue, waits until space becomes available.
468 469 470 471 472 473 474 475 476 477 478 479 480 |
# File 'thread.c', line 468
static VALUE
rb_szqueue_push(VALUE self, VALUE obj)
{
struct waiting_delete args;
args.waiting = GET_SZQUEUE_WAITERS(self);
args.th = rb_thread_current();
while (queue_length(self) >= GET_SZQUEUE_ULONGMAX(self)) {
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, obj);
}
|