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
-
#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
.
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 |
# File 'thread.c', line 390
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
#max ⇒ Object
Returns the maximum size of the queue.
414 415 416 417 418 |
# File 'thread.c', line 414
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
.
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 |
# File 'thread.c', line 427
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_QUEUE_QUE(self)))) {
rb_thread_wakeup_alive(t);
}
return vmax;
}
|
#num_waiting ⇒ Object
Returns the number of threads waiting on the queue.
511 512 513 514 515 516 517 |
# File 'thread.c', line 511
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.
498 499 500 501 502 503 |
# File 'thread.c', line 498
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.
458 459 460 461 462 463 464 465 466 467 468 469 470 |
# File 'thread.c', line 458
static VALUE
rb_szqueue_push(VALUE self, VALUE obj)
{
struct waiting_delete args;
args.waiting = GET_QUEUE_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);
}
|