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(*args) ⇒ Object
(also: #deq, #shift)
Retrieves data from the queue.
-
#push(*args) ⇒ Object
(also: #enq, #<<)
Pushes
objectto the queue.
Constructor Details
#new(max) ⇒ Object
Creates a fixed-length queue with a maximum size of max.
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 |
# File 'thread.c', line 397 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.
535 536 537 538 539 540 541 |
# File 'thread.c', line 535 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.
421 422 423 424 425 |
# File 'thread.c', line 421 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.
434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 |
# File 'thread.c', line 434 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.
549 550 551 552 553 554 555 556 |
# File 'thread.c', line 549 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) ⇒ 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.
522 523 524 525 526 527 |
# File 'thread.c', line 522 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); } |
#push(object, non_block = false) ⇒ Object #enq(object, non_block = false) ⇒ 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, unless non_block is true. If non_block is true, the thread isn’t suspended, and an exception is raised.
478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 |
# File 'thread.c', line 478 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]); } |