static void wakeup_first_thread(VALUE list) { VALUE thread; while (!NIL_P(thread = rb_ary_shift(list))) { if (RTEST(rb_thread_wakeup_alive(thread))) break; } }
static void wakeup_all_threads(VALUE list) { VALUE thread; long i; for (i=0; i<RARRAY_LEN(list); i++) { thread = RARRAY_AREF(list, i); rb_thread_wakeup_alive(thread); } rb_ary_clear(list); }
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; }
static VALUE wake_thread(VALUE thread) { return rb_thread_wakeup_alive(thread); }