Chandra
view release on metacpan or search on metacpan
include/chandra/chandra_socket_hub.h view on Meta::CPAN
static void
_hub_do_broadcast(pTHX_ SV *self, SV *channel, SV *data)
{
HV *hv = (HV *)SvRV(self);
SV **conns_svp = hv_fetchs(hv, "_conns", 0);
HV *conns_hv;
HE *entry;
if (!conns_svp || !SvROK(*conns_svp)) return;
conns_hv = (HV *)SvRV(*conns_svp);
hv_iterinit(conns_hv);
while ((entry = hv_iternext(conns_hv)) != NULL) {
SV *conn = hv_iterval(conns_hv, entry);
if (SvOK(conn))
_sock_conn_send(aTHX_ conn, SvPV_nolen(channel), data);
}
}
/* ---- Close hub: shutdown all connections, cleanup files ---- */
static void
_hub_do_close(pTHX_ SV *self)
{
HV *hv = (HV *)SvRV(self);
SV **conns_svp = hv_fetchs(hv, "_conns", 0);
SV **listener_svp = hv_fetchs(hv, "_listener", 0);
SV **select_svp = hv_fetchs(hv, "_select", 0);
SV **token_path_svp = hv_fetchs(hv, "_token_path", 0);
SV **sock_path_svp = hv_fetchs(hv, "_socket_path", 0);
if (conns_svp && SvROK(*conns_svp)) {
HV *conns_hv = (HV *)SvRV(*conns_svp);
HE *entry;
hv_iterinit(conns_hv);
while ((entry = hv_iternext(conns_hv)) != NULL) {
SV *conn = hv_iterval(conns_hv, entry);
if (SvOK(conn)) {
_sock_conn_send(aTHX_ conn, "__shutdown",
sv_2mortal(newRV_noinc((SV *)newHV())));
_sock_call_void(aTHX_ conn, "close");
}
}
}
(void)hv_stores(hv, "_conns", newRV_noinc((SV *)newHV()));
(void)hv_stores(hv, "_clients", newRV_noinc((SV *)newHV()));
if (listener_svp && SvOK(*listener_svp)) {
if (select_svp && SvOK(*select_svp))
_sock_select_remove(aTHX_ *select_svp, *listener_svp);
_sock_call_void(aTHX_ *listener_svp, "close");
(void)hv_stores(hv, "_listener", newSV(0));
}
if (token_path_svp && SvOK(*token_path_svp)) {
const char *tp = SvPV_nolen(*token_path_svp);
Stat_t st;
if (PerlLIO_stat(tp, &st) == 0)
(void)PerlLIO_unlink(tp);
}
if (sock_path_svp && SvOK(*sock_path_svp)) {
const char *sp = SvPV_nolen(*sock_path_svp);
Stat_t st;
if (PerlLIO_stat(sp, &st) == 0)
(void)PerlLIO_unlink(sp);
}
/* Clean up TCP discovery file (Windows auto-upgrade) */
{
SV **disc_svp = hv_fetchs(hv, "_discovery_path", 0);
if (disc_svp && SvOK(*disc_svp)) {
const char *dp = SvPV_nolen(*disc_svp);
Stat_t st;
if (PerlLIO_stat(dp, &st) == 0)
(void)PerlLIO_unlink(dp);
}
}
}
#endif /* CHANDRA_SOCKET_HUB_H */
( run in 2.038 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )