123456789_123456789_123456789_123456789_123456789_

Class: Ractor::Selector

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: ractor_sync.c,
ractor_sync.c

Overview

currently

Selects multiple Ractors to be activated.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(*ractors, klass)

[ GitHub ]

  
# File 'ractor_sync.c', line 1442

static VALUE
ractor_selector_new(int argc, VALUE *ractors, VALUE klass)
{
    VALUE selector = ractor_selector_create(klass);

    for (int i=0; i<argc; i++) {
        ractor_selector_add(selector, ractors[i]);
    }

    return selector;
}

Instance Attribute Details

#empty?Boolean (readonly)

Returns true if no ractor is added.

[ GitHub ]

  
# File 'ractor_sync.c', line 1371

static VALUE
ractor_selector_empty_p(VALUE selv)
{
    struct ractor_selector *s = RACTOR_SELECTOR_PTR(selv);
    return s->ports->num_entries == 0 ? Qtrue : Qfalse;
}

Instance Method Details

#add(ractor) ⇒ ractor

Adds ractor to self. Raises an exception if ractor is already added. Returns ractor.

[ GitHub ]

  
# File 'ractor_sync.c', line 1305

static VALUE
ractor_selector_add(VALUE selv, VALUE rpv)
{
    if (!ractor_port_p(rpv)) {
        rb_raise(rb_eArgError, "Not a Ractor::Port object");
    }

    struct ractor_selector *s = RACTOR_SELECTOR_PTR(selv);
    const struct ractor_port *rp = RACTOR_PORT_PTR(rpv);

    if (st_lookup(s->ports, (st_data_t)rpv, NULL)) {
        rb_raise(rb_eArgError, "already added");
    }

    st_insert(s->ports, (st_data_t)rpv, (st_data_t)rp);
    return selv;
}

#clearself

Removes all ractors from self. Raises self.

[ GitHub ]

  
# File 'ractor_sync.c', line 1357

static VALUE
ractor_selector_clear(VALUE selv)
{
    struct ractor_selector *s = RACTOR_SELECTOR_PTR(selv);
    st_clear(s->ports);
    return selv;
}

#remove(ractor) ⇒ ractor

Removes ractor from self. Raises an exception if ractor is not added. Returns the removed ractor.

[ GitHub ]

  
# File 'ractor_sync.c', line 1331

static VALUE
ractor_selector_remove(VALUE selv, VALUE rpv)
{
    if (!ractor_port_p(rpv)) {
        rb_raise(rb_eArgError, "Not a Ractor::Port object");
    }

    struct ractor_selector *s = RACTOR_SELECTOR_PTR(selv);

    if (!st_lookup(s->ports, (st_data_t)rpv, NULL)) {
        rb_raise(rb_eArgError, "not added yet");
    }

    st_delete(s->ports, (st_data_t *)&rpv, NULL);

    return selv;
}

#wait(receive: false, yield_value: undef, move: false) ⇒ Array, value

Waits until any ractor in selector can be active.

[ GitHub ]

  
# File 'ractor_sync.c', line 1436

static VALUE
ractor_selector_wait(VALUE selector)
{
    return ractor_selector__wait(GET_EC(), selector);
}