Chandra

 view release on metacpan or  search on metacpan

xs/socket_hub.xs  view on Meta::CPAN


SV *
broadcast(self, channel_sv, data_sv)
    SV *self
    SV *channel_sv
    SV *data_sv
CODE:
{
    _hub_do_broadcast(aTHX_ self, channel_sv, data_sv);
    RETVAL = SvREFCNT_inc(self);
}
OUTPUT:
    RETVAL

SV *
send_to(self, name_sv, channel_sv, data_sv)
    SV *self
    SV *name_sv
    SV *channel_sv
    SV *data_sv
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **clients_svp = hv_fetchs(hv, "_clients", 0);
    if (clients_svp && SvROK(*clients_svp)) {
        HV *clients = (HV *)SvRV(*clients_svp);
        const char *name;
        STRLEN name_len;
        SV **conn_svp;
        name = SvPV(name_sv, name_len);
        conn_svp = hv_fetch(clients, name, name_len, 0);
        if (conn_svp && SvOK(*conn_svp)) {
            dSP;
            int count;
            ENTER;
            SAVETMPS;
            PUSHMARK(SP);
            XPUSHs(*conn_svp);
            XPUSHs(channel_sv);
            XPUSHs(data_sv);
            PUTBACK;
            count = call_method("send", G_SCALAR);
            SPAGAIN;
            RETVAL = (count > 0) ? newSVsv(POPs) : newSViv(0);
            PUTBACK;
            FREETMPS;
            LEAVE;
        } else {
            RETVAL = newSViv(0);
        }
    } else {
        RETVAL = newSViv(0);
    }
}
OUTPUT:
    RETVAL

void
clients(self)
    SV *self
PPCODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **clients_svp = hv_fetchs(hv, "_clients", 0);
    if (clients_svp && SvROK(*clients_svp)) {
        HV *clients = (HV *)SvRV(*clients_svp);
        I32 num_keys = hv_iterinit(clients);
        if (GIMME_V == G_SCALAR) {
            mXPUSHi(num_keys);
            XSRETURN(1);
        } else {
            HE *entry;
            while ((entry = hv_iternext(clients)) != NULL) {
                XPUSHs(sv_2mortal(newSVhek(HeKEY_hek(entry))));
            }
        }
    } else {
        if (GIMME_V == G_SCALAR) {
            mXPUSHi(0);
            XSRETURN(1);
        }
    }
}

SV *
poll(self)
    SV *self
CODE:
{
    _hub_do_poll(aTHX_ self);
    RETVAL = SvREFCNT_inc(self);
}
OUTPUT:
    RETVAL

void
run(self)
    SV *self
CODE:
{
    while (1) {
        _hub_do_poll(aTHX_ self);
        /* Small sleep to avoid CPU spin - 10ms */
        {
            struct timeval tv;
            tv.tv_sec = 0;
            tv.tv_usec = 10000;
            select(0, NULL, NULL, NULL, &tv);
        }
    }
}

void
close(self)
    SV *self
CODE:
{
    _hub_do_close(aTHX_ self);
}

void



( run in 1.658 second using v1.01-cache-2.11-cpan-71847e10f99 )