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 )